Límites en la cantidad de descriptores de archivo

34

Estoy tratando de instalar 389-ds, y me da esta advertencia:

WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.

Entiendo sobre los descriptores de archivos, pero no entiendo sobre los límites suaves y duros.

Cuando corro cat /proc/sys/fs/file-max, regreso 590432. Esto debería implicar que puedo abrir hasta 590432 archivos (es decir, tener hasta 590432 descriptores de archivo).

Pero cuando corro ulimit, me da resultados diferentes:

$ ulimit
unlimited

$ ulimit -Hn    # Hard limit
4096

$ ulimit -Sn    # Soft limit
1024

Pero, ¿cuál es el límite duro / blando ulimity cómo se relacionan con el número almacenado /proc/sys/fs/file-max?

Rafael Adel
fuente

Respuestas:

39

De acuerdo con la documentación del núcleo , /proc/sys/file-maxes el número máximo, total y global de descriptores de archivo que el núcleo asignará antes de la asfixia. Este es el límite del núcleo, no el de su usuario actual. Por lo tanto, puede abrir 590432, siempre que esté solo en un sistema inactivo (modo de usuario único, sin demonios en ejecución).

Tenga en cuenta que la documentación no está actualizada: el archivo ha estado proc/sys/fs/file-maxdurante mucho tiempo. Gracias a Martin Jambon por señalar esto.

La diferencia entre límites blandos y duros se responde aquí, en SE . Puede aumentar o disminuir un límite flexible como usuario normal, siempre que no sobrepase el límite rígido. También puede reducir un límite rígido (pero no puede aumentarlo nuevamente para ese proceso). Como superusuario, puede aumentar y disminuir los límites tanto duros como blandos. El esquema de límite doble se utiliza para aplicar políticas del sistema, pero también permite a los usuarios comunes establecer límites temporales para sí mismos y luego modificarlos.

Tenga en cuenta que si intenta reducir un límite rígido por debajo del límite flexible (y usted no es el superusuario), EINVALvolverá (argumento no válido).

Entonces, en su caso particular, ulimit(que es lo mismo que ulimit -Sf) dice que no tiene un límite flexible en el tamaño de los archivos escritos por el shell y sus subprocesos . (Esa es probablemente una buena idea en la mayoría de los casos)

Su otra invocación ulimit -Hninforma sobre el -nlímite (número máximo de descriptores de archivo abiertos), no el -flímite, por lo que el límite flexible parece más alto que el límite rígido. Si ingresas ulimit -Hftambién obtendrás 'ilimitado'.

Alexios
fuente
14
En Linux 4.4.0, la ruta del archivo máximo es /proc/sys/fs/file-max.
Martin Jambon
por favor, ¿el límite rígido ulimit -Hn apunta al límite mismo del sistema a las capacidades de descriptor de archivo asignadas?
Webwoman
2
@Webman: no, no lo hace. ulimitsolo afecta los límites del proceso actual . Los límites del proceso actual también se legan a los procesos secundarios, pero cada proceso tiene un recuento separado. Por ejemplo ulimit -Hn 10, con , solo puede tener 10 descriptores de archivo abiertos a la vez. Cada proceso secundario que cree solo puede tener hasta 10 descriptores de archivo también. Solo el superusuario puede aumentar un límite una vez establecido. Si establece uno demasiado bajo, su única opción puede ser matar su proceso de shell e iniciar uno nuevo.
Alexios
0

La llamada al sistema "select" es una de las muchas decisiones terribles de diseño de muerte cerebral de Unix que hace que incluso Windows95 se vea tan bien en comparación.

Debería haber sido prohibido hace 20 años y es posible que ahora tengamos la capacidad de tener controladores de archivos ilimitados sin problemas.

Puede aumentar el número de descriptores de archivos fácilmente con la configuración del kernel y ulimit PERO recuerde que si alguna biblioteca usa el sistema "select" llame a su programa se volverá inestable (corrupción de memoria) y fallará.

Select solo puede manejar descriptores de archivo de 0 a 1023 y si alimenta uno con un valor más alto, se introducirá aleatoriamente en su memoria y la selección nunca repetirá el descriptor como que funciona. Desafortunadamente, muchas bibliotecas usan select.

Lothar
fuente
Su comentario es una advertencia útil, pero en lugar de tomar un tono despotricante, hubiera sido mucho más útil haber citado la fd_set(3)página del manual y de donde proviene el límite FD_SETSIZE. Y lo mejor hubiera sido una sugerencia de una llamada de reemplazo como poll(3), como en esta respuesta
Davor Cubranic