Назад | Перейти на главную страницу

select () зависает из-за исчерпания ресурсов - но какой ресурс?

Подключение к моему серверу через sftp иногда приводит к зависанию:

if (select(max+1, rset, wset, NULL, NULL) < 0) {

это строка 1428 из openssh 5.2p1 sftp-server.c (основной цикл sftp_server_main ()).

Такое же зависание происходит при открытии соединения для передачи данных, например, через ванильный FTP. Иногда мне удается пройти через несколько секунд или минут, но иногда время ожидания соединения на стороне клиента прерывается, прежде чем сервер сможет ответить. Когда сервер отвечает, и я подключен, тогда, если я выдаю, например, 'ls' он снова будет зависать в select () на некоторое время.

ssh в порядке; может подключаться без задержки и выдавать команды и т. д.

Не думаю, что это смерть гнезда:

root@dl:~# cat /proc/net/sockstat
sockets: used 304
TCP: inuse 444 orphan 302 tw 152 alloc 451 mem 5280
UDP: inuse 4
RAW: inuse 0
FRAG: inuse 0 memory 0

root@dl:~# netstat -tan | awk '{print $6}' | sort | uniq -c
    2 CLOSE_WAIT
  121 CLOSING
    1 established)
  109 ESTABLISHED
    17 FIN_WAIT1
    9 FIN_WAIT2
    1 Foreign
  300 LAST_ACK
    20 LISTEN
    2 SYN_RECV
  433 TIME_WAIT

Также, похоже, нет дескрипторов файлов, но я не уверен в этом на 100%. И даже если бы это было так, разве это не привело бы к ошибке, а не зависанию?

Кажется, это несколько связано с количеством подключений, которые обслуживает nginx. Я могу закрыть nginx, и проблема исчезнет. При этом nginx и apache могут сосуществовать в этом состоянии без проблем (apache никогда не зависает). Люди также могут без проблем подключаться к IRC-серверу на той же машине во время этих «эпизодов». Так, может быть, он ограничен select ()?

Какой ресурс использует nginx, кроме сокетов / файловых дескрипторов, который вызывает зависание select ()? Я рву из-за этого волосы.

Я пробовал все обычные настройки сети (различные настройки через sysctl, уменьшение таймаутов), но безрезультатно. В машине не закончилось ОЗУ, и ЦП, и ввод-вывод в порядке.

Linux dl 2.6.26-2-486 #1 Sat Jun 11 14:47:34 UTC 2011 i686 GNU/Linux

Он работает под управлением Debian Lenny.

Что может привести к зависанию select () при проверке некоторых сокетов?

Две вещи:

  1. Ошибка в коде вызова select.

  2. Никакой информации пока не поступало.

Я решил эту проблему; посмотри пожалуйста мой последний вопрос для подробностей. По сути, сервер страдал от нехватки энтропии (проверено с помощью cat /proc/sys/kernel/random/entropy_avail). Установка haveged пакет через бэкпорты Debian разрешил очень долгие зависания при использовании sftp, который предположительно подключается к тому, что сказал Дэвид Шварц («Информация еще не получена») ... потому что его нельзя было зашифровать. Мне пока не ясно, почему ssh не пострадал (или пострадал не так сильно).