Demasiados archivos abiertos en Debian

15

Tengo un largo proceso de ejecución en Debian. En algún momento arroja un error:

Demasiados archivos abiertos.

Corriendo:

ulimit -a

muestra:

abrir archivos (-n) 1024

Deseo aumentar el número de archivos abiertos en 2 veces. Después de la ejecución

ulimit -n 2048

el límite está activo hasta el final de mi sesión, lo cual no es aplicable para la tarea.

¿Cómo puedo aumentar permanentemente el número de archivos abiertos?

FoxyBOA
fuente

Respuestas:

12

Si su proceso se inicia a través de un script, puede realizar la llamada a ulimit en el script justo antes de ejecutar el demonio.

Si desea aumentar el ulimit para su usuario, o para todos los usuarios, puede establecer límites que se aplican pam_limitsal iniciar sesión. Estos se establecen en /etc/security/limits.conf. En su caso, podría hacer algo como:

*               hard    nofile             2048

Tenga en cuenta que "duro" denota un límite duro, uno que no se puede exceder y no se puede modificar. Un usuario puede alterar un límite flexible (por ejemplo, alguien sin capacidades de root), pero no más allá del límite rígido.

Lea el limits.confpara obtener más información sobre el uso pam_limits.

Daniel Lawson
fuente
En límites conf tengo 2 líneas: * soft nofile 4096 * hard nofile 8192 que no tienen ningún efecto.
FoxyBOA
¿Y ha cerrado sesión y ha vuelto a iniciar sesión desde que las probó? Esto significa salir de la sesión derecha de X / GNOME / KDE, etc, si usted está tratando esto en una máquina local
Daniel Lawson
Si. /etc/security/limits.conf no funciona para mí. Intentaré un segundo acercamiento.
FoxyBOA 05 de
3
/etc/security/limits.conf funciona solo para servicios que usan pam y el módulo pam pam_limits (consulte /etc/pam.d/ para ver la configuración de PAM de cada servicio y /etc/pam.d/common-* en particular) . Por lo tanto, se refiere a todas las sesiones de usuario creadas por sshd, gdm, inicio de sesión, etc. No se refiere a todos los programas iniciados en el momento del arranque ...
Raphaël Hertzog
Dije algo al respecto, pero gracias por aclararlo. El OP no ha aclarado si es un servicio o un proceso que su usuario está ejecutando.
Daniel Lawson
13

También hay un "máximo total" de archivos abiertos establecidos en el núcleo, puede verificar la configuración actual con:

cat /proc/sys/fs/file-max 

Y establezca un nuevo valor con:

echo "104854" > /proc/sys/fs/file-max

Si desea mantener la configuración entre reinicios, agregue

sys.fs.file-max=104854

a

/etc/sysctl.conf

Para verificar el uso máximo de archivos actual:

[root@srv-4 proc]# cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors
(the number of file descriptors allocated since boot)
rkthkr
fuente
1
Tenga en cuenta que si se muestran descriptores de archivos asignados gratuitamente 0, solo significa que el número de identificadores de archivos asignados coincide exactamente con el número de identificadores de archivos utilizados.
tacotuesday
Mina muestra algunos números obscenas aquí: 49152 0 18446744073709551615 . No entiendo por qué las dos primeras columnas no se suman a la tercera. Y si tengo 1,8 billones de billones disponibles, no veo cómo los usé todos.
mlissner
4

Como otros han dicho, puede aplicar límites específicos por usuario o grupo en /etc/security/limits.conf.

Nota: ulimit -n muestra el límite suave.

ulimit -H -n 

te mostrará el límite duro.

Esto hace que la salida ulimit -a y ulimit -n sea bastante confusa si, por ejemplo, aumenta el número de archivos de 1024 a 4096, ya que esperaría ver la salida de límite duro, pero todavía está viendo 1024, que es el soft límite.

Además, recuerde que estos límites se aplican por inicio de sesión, por lo tanto, vuelva a iniciar sesión en un nuevo shell y verifique sus cambios, no espere que se propaguen a los inicios de sesión existentes.

Tom Feiner
fuente
2

Tenga en cuenta que si ejecuta su proceso start-stop-daemon, establecer ulimits en /etc/security/limits.conf no funciona. Si, por ejemplo, desea aumentar el límite de archivos abiertos para tomcat a 20000, debe agregarlos a las líneas para /etc/default/tomcat:

ulimit -Hn 32768
ulimit -Sn 32768

Encontré este problema en debian 6.0.4 Para otro proceso, las respuestas dadas deberían ayudar.

Janning
fuente
1

Depende de cómo comiences tu proceso de larga duración. Si se inicia en el momento del arranque (a través de las secuencias de comandos /etc/rcX.d/*), debe realizar una llamada ulimit en la secuencia de comandos de inicio ya que el núcleo establece el límite predeterminado y no se puede ajustar sin volver a compilarlo.

Usar /etc/security/limits.confpodría funcionar si lo usa cronpara iniciarlo, por ejemplo, con una entrada como esta:

@reboot $HOME/bin/my-program

Eso debería funcionar porque /etc/pam.d/cron habilita pam_limits.so.

Raphaël Hertzog
fuente
-1

Puede agregar esto en /etc/security/limits.conf

root soft nofile 100000
root hard nofile 100000

guardar y luego reiniciar.

kxmp
fuente
3
¿Hay algo nuevo aquí que no esté en la respuesta aceptada a esta pregunta de 5 años?
Andrew Schulman
-2

Un comando muy bueno es ulimit -npero hay un problema con demasiadas conexiones y demasiados archivos abiertos:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 519357
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
charla
fuente
Traté de aclarar su respuesta, pero todavía no estoy claro qué está tratando de decir a la pregunta original de los carteles. ¿Puedes intentar limpiar esto más?
slm
También esta es la salida de ulimit -a, no ulimit -n.
Yvan