В своей работе мы, как и многие другие используем curl. На днях мы столкнулись с крайне интересной ошибкой при работе с ним и с разрешения tatikoma, я опишу это небольшое расследование.
Архитектура нашей системы строится на большом количестве независимых сервисов: это приводит к большому количеству взаимодействий между ними посредством curl. Мы вводили новый сервис и тестировали его взаимодействие с существующей системой.
В один момент взаимодействие прекратилось и в логи посыпались ошибки:
$ Connection timed out after 5515 milliseconds
При этом все сервисы отвечали штатно и быстро. Так как мы используем внутреннюю dns, то мы решили что это её ошибка и перешли на обращение по ip. Ошибка при этом осталась.
В процессе сравнения кода с другими проектами, случайно обратили внимание, что лимиты на открытые соединения в текущем проекте были увеличены. После принудительного уменьшения количества одновременных подключений ошибка исчезла.
В этот момент подозрения пали на лимиты юзера. Для проверки был сделан маленький консольный скрипт:
>ulimit -n 100
>echo "<?php \$i=1; while(1){ \$x = curl_init('http://ya.ru'); curl_setopt(\$x, CURLOPT_TIMEOUT, 5); curl_setopt(\$x, CURLOPT_RETURNTRANSFER, 1); curl_exec(\$x); var_dump(curl_error(\$x), \$i++); \$antigc[] = \$x; }" | php
И точно на 100 соединении возникают ошибки.
Если подумать, то такое ограничение очевидно, но хотелось бы получить более конкретное сообщение об ошибке. Будьте аккуратнее с сообщениями об ошибках в ваших программах.