Что вызывает ECONNREFUSED в сокетах домена UNIX?

Я понимаю, что на TCP-серверах отказ в подключении может быть вызван либо тем, что

  1. Процесс прекратил прослушивание, вызвав close на серверном сокете (существующие соединения остаются открытыми, а новые соединения отклоняются), или
  2. Процесс завершился или
  3. Процесс не принимал соединения достаточно часто, поэтому отставание стало полным/отставание было слишком маленьким.

Каковы возможные причины ECONNREFUSED при попытке подключения к сокетам домена UNIX.

Этот вопрос должен помочь мне сузить круг загадка подключения к MySQL в конфигурации Solaris 10.


person 700 Software    schedule 06.12.2013    source источник


Ответы (1)


Отказ в подключении НЕ означает, что сервер закрыл сокет (после того, как вы к нему подключились), это означает, что сервер не прослушивает сокет. Итак, сначала ваш сервер выходит из строя, ЗАТЕМ клиенты получают отказ в соединении. (За исключением случаев, когда отставание становится полным, если размер отставания, который вы передаете в listen(), слишком мал, или ваш сервер не принимает соединения() достаточно быстро, но я никогда не видел этого в реальных жизненных ситуациях).

Обычно я бы обвинил в этом какой-нибудь брандмауэр, но, поскольку в другом вашем посте вы говорите, что это происходит только время от времени, я предполагаю, что происходит следующее: ваш сервер mysql выходит из строя, safe_mysqld перезапускает его, что занимает несколько секунд, и во время на этой фазе запуска вы получаете сообщение об ошибке отказа в подключении, потому что там нет сервера, который мог бы вас слушать. Попробуйте настроить задание cron, которое выполняет «ps -ef | grep mysqld» каждую минуту, проверьте, меняется ли идентификатор процесса время от времени, и попытайтесь сопоставить эти изменения с сообщениями об ошибках отказа в соединении.

Если mysqld НЕ перезапускается, т. е. идентификатор процесса остается прежним, попробуйте что-то вроде «truss -v listen,accept -p». Это должно давать вам некоторый результат каждый раз, когда клиент подключается - возможно, вы можете сопоставить "множество вещей, происходящих в ферме" с "мне сейчас отказывают в соединении". Но не делайте этого в сильно загруженной производственной системе, иначе ферма а) утопит вас в выводе и б) значительно замедлит работу вашего сервера.

person Guntram Blohm    schedule 06.12.2013
comment
Пожалуйста, смотрите мою правку, я уточнил пункт 1. Пункт 1 действителен. Пожалуйста, смотрите мою правку в другом моем сообщении. mysqld не падает, а mysqld_safe не перезагружается mysqld. На самом деле это не вопрос о MySQL, это вопрос о возможных причинах ECONNREFUSED. Вы не можете винить брандмауэр, потому что это вопрос сокета домена UNIX. Возможно, использование truss может быть полезным. Я посмотрю, смогу ли я запланировать задачу для работы над этим. - person 700 Software; 06.12.2013