En este momento, sé cómo:
- encontrar límite de archivos abiertos por proceso:
ulimit -n
- cuente todos los archivos abiertos por todos los procesos:
lsof | wc -l
- obtener el número máximo permitido de archivos abiertos:
cat /proc/sys/fs/file-max
Mi pregunta es: ¿Por qué hay un límite de archivos abiertos en Linux?
open-files
limit
xanpeng
fuente
fuente
Respuestas:
La razón es que el sistema operativo necesita memoria para administrar cada archivo abierto, y la memoria es un recurso limitado, especialmente en los sistemas integrados.
Como usuario root, puede cambiar el número máximo de archivos abiertos por proceso (vía
ulimit -n
) y por sistema (pecho 800000 > /proc/sys/fs/file-max
. Ej .).fuente
/.../file-max
un valor bastante grande siempre que la memoria no se agote?file-max
parece ser el tamaño de RAM dividido por 10k. Como la memoria real utilizada por el controlador de archivos debería ser mucho más pequeña (tamaño destruct file
más memoria dependiente del controlador), este parece un límite bastante conservador.Tenga en cuenta que
lsof | wc -l
resume muchas entradas duplicadas (los procesos bifurcados pueden compartir identificadores de archivos, etc.). Ese número podría ser mucho más alto que el límite establecido/proc/sys/fs/file-max
.Para obtener el número actual de archivos abiertos desde el punto de vista del kernel de Linux, haga lo siguiente:
cat /proc/sys/fs/file-nr
Ejemplo: este servidor tiene 40096 de un máximo de 65536 archivos abiertos, aunque lsof informa un número mucho mayor:
fuente
lsof
informará muchos archivos dos veces o más, por ejemplo/dev/null
, puede intentar una mejor suposición con:lsof|awk '{print $9}'|sort|uniq|wc -l
lsof|awk '!a[$NF]++{c++}END{print c}'
para obtener el recuento no duplicado de archivos abiertos.Creo que es en gran parte por razones históricas.
Un descriptor de archivo de Unix es un pequeño
int
valor, devuelto por funciones comoopen
ycreat
, y se pasa aread
,write
,close
, y así sucesivamente.Al menos en las primeras versiones de Unix, un descriptor de archivo era simplemente un índice en una matriz de estructuras de tamaño fijo por proceso, donde cada estructura contiene información sobre un archivo abierto. Si recuerdo correctamente, algunos sistemas tempranos limitaron el tamaño de esta tabla a 20 más o menos.
Los sistemas más modernos tienen límites más altos, pero han mantenido el mismo esquema general, en gran parte por inercia.
fuente
fileno
yfdopen
, esperaría que fueran casi intercambiables.int
descriptor o unFILE*
. Si tiene más de 20 archivos abiertos a través deopen()
, ¿fdopen()
fallaría?