Отказ в подключении НЕ означает, что сервер закрыл сокет (после того, как вы к нему подключились), это означает, что сервер не прослушивает сокет. Итак, сначала ваш сервер выходит из строя, ЗАТЕМ клиенты получают отказ в соединении. (За исключением случаев, когда отставание становится полным, если размер отставания, который вы передаете в listen(), слишком мал, или ваш сервер не принимает соединения() достаточно быстро, но я никогда не видел этого в реальных жизненных ситуациях).
Обычно я бы обвинил в этом какой-нибудь брандмауэр, но, поскольку в другом вашем посте вы говорите, что это происходит только время от времени, я предполагаю, что происходит следующее: ваш сервер mysql выходит из строя, safe_mysqld перезапускает его, что занимает несколько секунд, и во время на этой фазе запуска вы получаете сообщение об ошибке отказа в подключении, потому что там нет сервера, который мог бы вас слушать. Попробуйте настроить задание cron, которое выполняет «ps -ef | grep mysqld» каждую минуту, проверьте, меняется ли идентификатор процесса время от времени, и попытайтесь сопоставить эти изменения с сообщениями об ошибках отказа в соединении.
Если mysqld НЕ перезапускается, т. е. идентификатор процесса остается прежним, попробуйте что-то вроде «truss -v listen,accept -p». Это должно давать вам некоторый результат каждый раз, когда клиент подключается - возможно, вы можете сопоставить "множество вещей, происходящих в ферме" с "мне сейчас отказывают в соединении". Но не делайте этого в сильно загруженной производственной системе, иначе ферма а) утопит вас в выводе и б) значительно замедлит работу вашего сервера.
person
Guntram Blohm
schedule
06.12.2013