
En muchas guías de optimización web y TCPIP, se recomienda aumentar el número máximo de descriptores de archivos cuando aparece el error "Demasiados archivos abiertos".
pero no puedo ver TIME_WAIT en las salidas de "lsof -i"
¿Alguien sabe que TIME_WAIT consume descriptores de archivos? O no
Respuesta1
La aplicación utiliza el descriptor de archivo para leer/escribir desde el socket. Por lo tanto, si la aplicación llama a close(), el descriptor del archivo se libera inmediatamente.
Por otro lado, si la aplicación llama a Shutdown(), el descriptor de archivo seguirá siendo efectivo para que la aplicación aún pueda leer/escribir desde/hacia el socket.
Citas dehttps://oroboro.com/file-handle-leaks-server/:
Mito: Los sockets en TCP TIME_WAIT mantienen identificadores de archivos como rehenes
Cuando cierra un socket TCP/IP, el sistema operativo no libera el socket de inmediato. Por razones complejas, la estructura del socket debe mantenerse fuera de circulación durante unos minutos porque existe una pequeña posibilidad de que llegue un paquete IP a ese socket después de que se haya cerrado. Si el sistema operativo reutilizara el socket, la sesión del nuevo usuario de esa conexión se vería afectada por los paquetes perdidos de otra persona.
Pero esto no mantiene abierto un identificador de archivo. Cuando cierra el descriptor de archivo del socket, el descriptor de archivo en sí se cierra. No aparecerá el error "Demasiados archivos abiertos". Si tiene demasiados sockets abiertos, es posible que su servidor deje de aceptar nuevas conexiones. Hay formas de lidiar con eso (permitir que se reutilicen los sockets o reducir TCP TIME_WAIT), pero aumentar el límite de manejo de archivos no es una de ellas.
Mito: Se necesita tiempo para que se publiquen los identificadores de archivos
Esto está relacionado con el mito de TCP TIME_WAIT. La creencia errónea de que cuando cierra un identificador de archivo debe esperar un tiempo hasta que el sistema operativo lo suelte.
Al cerrar un identificador de archivo, se llamará a cualquier método del sistema operativo que libere el recurso, y el sistema operativo liberará ese recurso inmediatamente o, a veces, más tarde, como en el caso de los sockets, pero close() liberará el identificador del archivo en la tabla de identificadores de archivos inmediatamente. Su proceso tiene control total de su tabla de identificadores de archivos y no necesita esperar a que nada libere un espacio en su propia tabla de descriptores de archivos.
Respuesta2
TIME_WAIT es un estado TCP y no consume descriptores de archivos por ensayo. Sin embargo, los sockets en TIME_WAIT consumirán descriptores de archivos. Un socket es un archivo como casi todo lo demás en Unix. Si se trata de Linux, puede ajustar el tiempo de caducidad de los sockets (cuánto tiempo están en espera), así como habilitar el reciclaje de sockets en /proc/sys/net/ipv4/
.
Probablemente dos elementos de particular interés sean:
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_tw_reuse=1
Como siempre, pruébelos de antemano si puede.