¿Por qué la cantidad de archivos abiertos está limitada en Linux?

136

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?

xanpeng
fuente
2
@Rob buscó en Google un poco y descubrió que es una bomba tenedor , ¿se puede usar para explicar el límite de archivo abierto?
xanpeng
66
Bueno, los límites del proceso y los límites del archivo son importantes para que cosas como las bombas de horquilla no rompan un servidor / computadora para todos los usuarios, solo el usuario que lo hace y solo temporalmente. De lo contrario, alguien en un servidor compartido podría activar una bifurcación y eliminarlo por completo para todos los usuarios, no solo para ellos mismos.
Rob
3
¡Un buen resumen de algunos comandos muy útiles! : +1:
Joshua Pinter
77
@Rob, una bomba tenedor no tiene nada que ver, ya que el límite del archivo es por proceso y cada vez que se bifurca no abre un nuevo identificador de archivo.
psusi

Respuestas:

86

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 (p echo 800000 > /proc/sys/fs/file-max. Ej .).

jofel
fuente
21
También hay una razón de seguridad: si no hubiera límites, un software de usuario podría crear archivos sin fin hasta que el servidor se caiga.
Coren
15
@Coren Los límites discutidos aquí son solo para el recuento de controladores de archivos abiertos. Como un programa también puede cerrar controladores de archivos, podría crear tantos archivos y tan grandes como desee, hasta que todo el espacio disponible en el disco esté lleno. Para evitar esto, puede usar cuotas de disco o particiones separadas. En cierto sentido, es cierto que un aspecto de la seguridad es evitar el agotamiento de los recursos, y para esto hay límites.
jofel
1
@jofel Gracias. Supongo que los identificadores de archivos abiertos están representados por instancias de archivos de estructura , y el tamaño de esta estructura es bastante pequeño (nivel de bytes), así que ¿puedo establecer /.../file-maxun valor bastante grande siempre que la memoria no se agote?
xanpeng
77
@xanpeng No soy un experto en kernel, pero por lo que puedo ver, el valor predeterminado para file-maxparece 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 de struct filemás memoria dependiente del controlador), este parece un límite bastante conservador.
jofel
63

Tenga en cuenta que lsof | wc -lresume 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:

# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr 
40096   0       65536
# lsof | wc -l
521504
grebneke
fuente
1
Como lsofinformará 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
Yvan
puede usar lsof|awk '!a[$NF]++{c++}END{print c}'para obtener el recuento no duplicado de archivos abiertos.
P ....
18

Creo que es en gran parte por razones históricas.

Un descriptor de archivo de Unix es un pequeño intvalor, devuelto por funciones como openy creat, y se pasa a read, 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.

Keith Thompson
fuente
1
20 era el límite de Solaris para estructuras de datos de ARCHIVO en lenguaje C. El recuento de identificadores de archivo siempre fue mayor.
Lothar
@Lothar: Interesante. Me pregunto por qué los límites serían diferentes. Dadas las funciones filenoy fdopen, esperaría que fueran casi intercambiables.
Keith Thompson,
Un archivo unix es más que solo el identificador de archivo (int) devuelto. Hay memorias intermedias de disco y un bloque de control de archivos que define el desplazamiento actual del archivo, el propietario del archivo, los permisos, el inodo, etc.
ChuckCottrill
@ChuckCottrill: Sí, por supuesto. Pero la mayor parte de esa información debe almacenarse si se accede a un archivo mediante un intdescriptor o un FILE*. Si tiene más de 20 archivos abiertos a través de open(), ¿ fdopen()fallaría?
Keith Thompson el