В своей работе мы, как и многие другие используем 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 соединении возникают ошибки.

Если подумать, то такое ограничение очевидно, но хотелось бы получить более конкретное сообщение об ошибке. Будьте аккуратнее с сообщениями об ошибках в ваших программах.