¿Cómo cambio la cantidad de límite de archivos abiertos en Linux? [cerrado]

194

Cuando ejecuto mi aplicación, a veces recibo un error too many files open.

Running ulimit -ainforma que el límite es 1024. ¿Cómo aumento el límite por encima de 1024?

Editar ulimit -n 2048 resultados en un error de permiso.

John Meagher
fuente
ver también: unix.stackexchange.com/a/8949/231660
Guy Avraham
Acabo de leer esto en Centos 7 (lo mismo en RHEL) e hice una publicación de blog que lo cubría porque tenía muchos problemas incluso con todas estas publicaciones: coding-stream-of-consciousness.com/2018/12/21/… . A menudo, junto con los archivos abiertos, debe aumentar nproc, que en realidad reside en varios archivos de configuración ... y si usa systemd / systemctl, tiene sus propias configuraciones separadas. Es un poco loco.
John Humphreys - w00te
Si está utilizando VSCode en Linux, esta solución podría ayudarlo: stackoverflow.com/a/55027686/1190948
Juri Sinitson el

Respuestas:

153

Siempre puedes intentar hacer un ulimit -n 2048. Esto solo restablecerá el límite de su shell actual y el número que especifique no debe exceder el límite estricto

Cada sistema operativo tiene una configuración de límite rígido diferente en un archivo de configuración. Por ejemplo, el límite de archivo abierto en Solaris se puede establecer en el arranque desde / etc / system.

set rlim_fd_max = 166384
set rlim_fd_cur = 8192

En OS X, estos mismos datos deben establecerse en /etc/sysctl.conf.

kern.maxfilesperproc=166384
kern.maxfiles=8192

En Linux, estas configuraciones suelen estar en /etc/security/limits.conf.

Hay dos tipos de límites:

  • los límites suaves son simplemente los límites impuestos actualmente
  • los límites estrictos marcan el valor máximo que no se puede exceder estableciendo un límite flexible

Cualquier usuario puede establecer límites suaves, mientras que los límites rígidos solo se pueden cambiar por root. Los límites son propiedad de un proceso. Se heredan cuando se crea un proceso secundario, por lo que los límites de todo el sistema deben establecerse durante la inicialización del sistema en scripts de inicio y los límites de los usuarios deben establecerse durante el inicio de sesión del usuario, por ejemplo, utilizando pam_limits.

A menudo hay valores predeterminados establecidos cuando la máquina arranca. Por lo tanto, aunque puede restablecer su ulimit en un shell individual, puede encontrar que se restablece al valor anterior al reiniciar. Es posible que desee seleccionar los scripts de arranque para los comandos ulimit de existencia si desea cambiar el valor predeterminado.

hoyhoy
fuente
44
¿Me puede decir cómo usar esto en Windows?
Pritam
@hoyhoy ¿Puedo cambiarlo 2048pero no por 4500qué? ver esto
alhelal
@GaneshKrishnan, ¿qué agregar en los archivos de Linux que ha mencionado?
aviral sanjay
@Pritam Windows no tiene ninguno ulimit. Debe especificar lo que está utilizando (por ejemplo, WSL, Cygwin).
Melebius el
99

Si está utilizando Linux y recibió el error de permiso, deberá aumentar el límite permitido en el archivo /etc/limits.confo /etc/security/limits.conf(el lugar donde se ubica el archivo depende de su distribución específica de Linux).

Por ejemplo, para permitir que cualquier persona en la máquina aumente su número de archivos abiertos hasta 10000, agregue la línea al limits.confarchivo.

* hard nofile 10000

Luego cierre sesión y vuelva a iniciar sesión en su sistema y debería poder hacer:

ulimit -n 10000

sin un error de permiso

Jonathan Stanton
fuente
66
NOTA: El comodín no se aplica al rootusuario. Debe especificar root hard nofile 10000si desea ajustar el rootlímite.
Joshua Pinter el
1
@JoshPinter Jaja, acabo de pasar las últimas 3 horas más o menos revisando cada tutorial sobre cómo cambiar ulimity finalmente descubrí que he iniciado sesión como root. Es por eso que seguí viendo el 1024 in ulimit -a. Cambié el cuidado salvaje y agregué un *interior limits.conf. Todo está bien ahora, (estoy usando las teclas ssh no te preocupes: P) - ¡Gracias!
NiCk Newman
1
@NiCkNewman ¡Me alegra que te estés riendo de eso! Ese es un buen rasgo en una persona programadora / sysops. Hice lo mismo y no fui tan jovial. Me alegro de que haya ayudado! :)
Joshua Pinter
SUPLEMENTO: Usted puede encontrar también una configuración en este directorio: /etc/security/limits.d/.
Waldemar Wosiński
2
Abrí /etc/security/limits.conf por primera vez y noté que todo está comentado. ¿Cuál es el valor predeterminado de "hard nofile" entonces?
ka3ak
36

1) Agregue la siguiente línea a /etc/security/limits.conf

webuser hard nofile 64000

luego inicie sesión como usuario web

su - webuser

2) Edite los siguientes dos archivos para el usuario web

anexar archivos .bashrc y .bash_profile ejecutando

echo "ulimit -n 64000" >> .bashrc ; echo "ulimit -n 64000" >> .bash_profile

3) Cierre sesión, luego vuelva a iniciar sesión y verifique que los cambios se hayan realizado correctamente:

$ ulimit -a | grep open
open files                      (-n) 64000

Eso es todo y ellos bum, bum bum.

Vikrant Telkar
fuente
9
Si consigue cambiar su línea en limits.conf de 'hard' a 'soft', debería convertirse en el nuevo valor predeterminado y no requerir cambios en los perfiles de bash.
RishiD
Parece que estás repitiendo unos pasos adicionales. Establecer límites solo hará lo mismo que el perfil, pero en todas las sesiones.
Eddie
6

Si algunos de sus servicios se están reduciendo a ulimits, a veces es más fácil poner los comandos apropiados en el script de inicio del servicio. Por ejemplo, cuando Apache informa

[alerta] (11) Recurso temporalmente no disponible: apr_thread_create: no se puede crear el subproceso de trabajo

Intenta poner ulimit -s unlimiteden /etc/init.d/httpd. Esto no requiere un reinicio del servidor.

Sysadmin
fuente