Тысячи TIME_WAIT несмотря на SO_LINGER, выключение и т. Д. - PullRequest
5 голосов
/ 22 января 2010

Я работаю над сайтом, который подключается ко многим URL-адресам одновременно (мы надеемся получить ~ 600 в минуту), и независимо от того, что я пытаюсь, всегда остаются открытыми тысячи TIME_WAIT. Я понимаю, что это жизненно важно для соединений TCP, но они используют все доступные порты. В PHP нет SO_REUSEPORT, а SO_REUSEADDR не работает с удаленными подключениями. Вот начало кода:

$s = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($s, SOL_SOCKET, SO_LINGER,array('l_linger'=>0, 'l_onoff'=>0)); //I have tried l_onoff=1 
socket_set_option($s, SOL_SOCKET, SO_RCVTIMEO,array('sec'=>0,'usec'=>500000));
socket_set_option($s, SOL_SOCKET, SO_SNDTIMEO,array('sec'=>0,'usec'=>500000));
socket_set_option($s, SOL_SOCKET, SO_KEEPALIVE,0);
socket_set_option($s, SOL_SOCKET, SO_REUSEADDR,1);
socket_set_nonblock($s);
socket_bind($s,$ip,0);
socket_connect($s,$host,$port);

$ s входит в массив, содержащий все ожидающие записи, после записи мы вызываем socket_shutdown ($ s, 1); закрыть запись на сокете. Затем после прочтения мы:

socket_shutdown($s,2); socket_close($s);

Все чтение и запись выполняются в цикле while, цикл имеет максимум 12 одновременных подключений, если это не сделано, он перемещается и продолжает добавлять другой URL в массив. Каждый цикл вызывает socket_select с таймаутом 0.

У кого-нибудь есть предложения? Я хотел бы увеличить скорость, а также уменьшить значения TIME_WAIT, которые появляются в netstat.

Спасибо, Джеймс Хартиг

Ответы [ 2 ]

4 голосов
/ 18 декабря 2010

Вы можете отправить HTTP-заголовок Connection: close вместе с вашим запросом, в результате чего сервер отправит TCP FIN после того, как отправит вам ваш запрос. Поскольку другая сторона отправляет первый FIN, это будет другая сторона, которая будет ждать в TIME_WAIT, а не вы.

1 голос
/ 11 декабря 2010

Если вы хотите уменьшить TIME_WAIT в Linux, вы можете изменить параметр proc:

echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

Это изменит время ожидания до 30 секунд. Обратите внимание, что TIME_WAIT является частью стандартного поведения TCP / IP - если вы действительно не испытываете недостатка в ресурсах, я бы не стал так много гадать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...