2010-01-22 20 views
5

Estoy trabajando en un sitio que se conecta a muchas URL a la vez, (esperamos llegar a ~ 600 por minuto) y no importa lo que intento, siempre hay miles de TIME_WAIT sigue abierto. Entiendo que estos son vitales para las conexiones TCP, pero están usando todos los puertos disponibles. PHP no tiene un SO_REUSEPORT y SO_REUSEADDR no funciona con conexiones remotas. Aquí está el principio del código:Miles de TIME_WAIT a pesar de SO_LINGER, cierre etc.

$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); 

El $ s va en una matriz que contiene toda la escrituras pendientes, después de una escritura que llamamos socket_shutdown ($ s, 1); para cerrar la escritura en el zócalo. Luego, después de una lectura que:

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

Todo lectura y la escritura se hace en un bucle while, el bucle tiene un máximo de 12 conexiones simultáneas, si eso no es alcanzado, entonces se pasa y se procede a añadir otra URL a la matriz. Cada bucle llama a socket_select con un tiempo de espera de 0.

¿Alguien tiene alguna sugerencia? Me gustaría aumentar la velocidad y reducir los TIME_WAIT que aparecen en netstat.

Gracias, James Hartig

Respuesta

3

Puede enviar el encabezado HTTP Connection: close junto con su solicitud, lo que provocaría que el servidor envíe un FIN de TCP después de que le envíe su solicitud. Debido a que el otro lado envía el primer FIN, será el otro lado el que tendrá que esperar en TIME_WAIT, no tú.

1

Si desea reducir TIME_WAIT en Linux, se puede modificar un ajuste proc:

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

Esto va a cambiar el tiempo de espera de 30 segundos. Tenga en cuenta que TIME_WAIT es una parte del comportamiento estándar de TCP/IP, a menos que realmente esté hambriento de recursos, no ensucie con esto.

Cuestiones relacionadas