Tengo un servidor HTTP C simple. Cierro los descriptores de archivo para los archivos de disco y los nuevos fd
s de conexión devueltos por accept(...)
, pero noté que obtengo nuevos números de descriptor de archivo que son más grandes que los números anteriores: por ejemplo, el descriptor de archivo de accept return comienza con 4 , luego 5, luego 4 nuevamente y así sucesivamente hasta que el descriptor de archivo alcance el máximo descriptor de archivo abierto en un sistema.
Establecí el valor en 10,000
en mi sistema, pero no estoy seguro de por qué exactamente el número del descriptor de archivo salta al valor máximo. Y estoy un poco seguro de que mi programa está cerrando los descriptores de archivos.
Entonces, me gustaría saber si no hay miles de conexiones, entonces ¿por qué el nuevo número de descriptores de archivo aumenta periódicamente: en aproximadamente 24 horas recibo el mensaje accept: too many open files
. ¿Qué es este mensaje?
Además, ¿el valor ulimit -n number
se restablece automáticamente sin reiniciar el sistema?
como se menciona en la respuesta. La salida de _2$ ps aux | grep lh
es
dr-x------ 2 fawad fawad 0 Oct 11 11:15 . dr-xr-xr-x 9 fawad fawad 0 Oct 11 11:15 .. lrwx------ 1 fawad fawad 64 Oct 11 11:15 0 -> /dev/pts/3 lrwx------ 1 fawad fawad 64 Oct 11 11:15 1 -> /dev/pts/3 lrwx------ 1 fawad fawad 64 Oct 11 11:15 2 -> /dev/pts/3 lrwx------ 1 fawad fawad 64 Oct 11 11:25 255 -> /dev/pts/3
y la salida de ls -la /proc/$$/fd
es
root 49855 0.5 5.4 4930756 322328 ? Sl Oct09 15:58 /usr/share/atom/atom --executed-from=/home/fawad/Desktop/C++-work/lhparse --pid=49844 --no-sandbox root 80901 0.0 0.0 25360 5952 pts/4 S+ 09:32 0:00 sudo ./lh root 80902 0.0 0.0 1100852 2812 pts/4 S+ 09:32 0:00 ./lh fawad 83419 0.0 0.0 19976 916 pts/3 S+ 11:27 0:00 grep --color=auto lh
Me gusta saber qué es la columna pts/4, etc. ¿Es este el número del descriptor del archivo?
Es probable que el socket representado por el descriptor de archivo esté en estado close_wait o time_wait. Lo que significa que la pila TCP mantiene el fd abierto durante un poco más de tiempo. Por lo tanto, no podrá reutilizarlo inmediatamente en este caso.
Una vez que el socket esté completamente terminado y cerrado, el número del descriptor de archivo estará disponible para su reutilización dentro de su programa.
Ver: https://en.m.wikipedia.org/wiki/Transmission_Control_Protocol
Operación de protocolo y específicamente estados de espera.
Para ver qué archivos aún están abiertos, puede ejecutar
ls -la /proc/$$/fd
La salida de esto también será de ayuda.
ss -tan | head -5 LISTEN 0 511 *:80 *:* SYN-RECV 0 0 192.0.2.145:80 203.0.113.5:35449 SYN-RECV 0 0 192.0.2.145:80 203.0.113.27:53599 ESTAB 0 0 192.0.2.145:80 203.0.113.27:33605 TIME-WAIT 0 0 192.0.2.145:80 203.0.113.47:50685