Cómo eludir "Demasiados archivos abiertos" en Debian

8

Si quiero ver todos los archivos de registro relevantes de mi servidor apache2 a la vez, uso

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/apache2/*log |grep -v robots|grep -v favicon

Pero dado que esos son demasiados archivos por ahora, me gustaría aumentar ese límite.

¿Cómo puedo aumentarlo para una sesión ssh? ¿Y cómo podría aumentarlo globalmente en todo el sistema?

Puedo ver que el límite de archivos abiertos es 1024 en mi máquina:

ulimit -n
1024
rubo77
fuente
Exceder el límite del archivo es a menudo una señal de un problema. Como ya se señaló, es posible que tenga un problema con la rotación de registros. (El registro rotado puede dejar su comando). Fuera de / var / log / apache2 no debería haber muchos (ninguno) registros relacionados con su servidor Apache. Según su patrón grep, es probable que desee restringir su acceso a los registros de acceso.
BillThor
gracias por la pista, pero mi logrotaion funciona bien. Tengo tantos registros, porque los 1025 dominios de mi servidor tienen su propio archivo de registro;)
rubo77
1
Parece que sus patrones también recogerán registros de errores y registros de acceso. Esto debería ser un problema menor si tiene un único registro de errores. Si deja esto ejecutándose en un shell, es posible que desee usarlo en -Flugar de hacerlo -fpara que los registros se vuelvan a abrir al rotarlos.
BillThor

Respuestas:

15

Es importante saber que hay dos tipos de límites:

  • Un límite rígido es configurable solo por root. Este es el valor (límite) más alto posible para el límite flexible.
  • Un usuario normal puede establecer un límite flexible . Este es el límite real vigente.

Solución para una sola sesión

En el shell establece el límite suave:

ulimit -Sn 2048

Este ejemplo elevará el límite real a 2048, pero el comando tendrá éxito solo si el límite rígido (check:) ulimit -Hnes el mismo o mayor. Si necesita valores más altos, aumente el límite rígido utilizando uno de los métodos a continuación. Los límites se establecen por proceso y los procesos recién generados los heredan, por lo que todo lo que ejecute después de este comando en el mismo shell tendrá los nuevos límites.

Cambiar el límite duro en una sola sesión

Esto no es fácil porque solo la raíz puede cambiar un límite estricto y después de cambiar a la raíz, debe volver al usuario original. Aquí está la solución con sudo:

sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""

Solución para todo el sistema

En Debian y en muchos otros sistemas que usan pam_limits, puede establecer los límites de todo el sistema en /etc/security/limits.confy en archivos /etc/security/limits.d. El archivo conf contiene descripción. Líneas de ejemplo:

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192

Esto establecerá el límite rígido y el límite flexible predeterminado para los usuarios del grupo webadminsdespués de iniciar sesión.

Otros limites

El valor límite estricto está limitado por el límite global del valor de los descriptores de archivos abiertos, /proc/sys/fs/file-maxque es bastante alto por defecto en las distribuciones modernas de Linux. Este valor está limitado por el NR_OPENvalor utilizado durante la compilación del núcleo.

¿No hay una mejor solución?

Tal vez podría verificar si todos los *logarchivos que alimenta tail -fson archivos realmente activos que necesitan ser monitoreados. Es posible que algunos de ellos ya estén cerrados para iniciar sesión y simplemente puede abrir una cantidad menor de archivos.

pabouk
fuente
ulimit -Sn 4096 -bash: ulimit: archivos abiertos: Kann die Grenze nicht ändern: Das Argument ist ungültig - significa que el argumento no es válido
rubo77
@ rubo77: agregué información sobre el límite rígido, que probablemente sea la causa del problema.
pabouk
@ rubo77: También es posible establecer el límite estricto en una sesión de shell, pero es complicado ya que tiene que sususu -c "ulimit -Hn 6000 ; su $USER"
rootear
OK, entonces para un cambio temporal del límite lo ulimit -Hn 6000; ulimit -Sn 6000
usaré
1
@amenthes Supongo que te refieres a los archivos de configuración /etc/limits.*. Estos límites se aplican cada vez que pam_limits.sose llama al módulo PAM . Normalmente es al comienzo de una sesión. Por ejemplo, en Ubuntu 14.04 es en estas herramientas / comandos: cron, login(texto de la consola de inicio de sesión), lightdm(el nombre de usuario GUI), su. Puede establecer dónde se pam_limitsusa /etc/pam.*. Ver por ejemplo: faqs.org/docs/securing/chap5sec44.html
pabouk el
0

Tenía la advertencia de PHP en mi error Apache.log:

failed to open stream: Too many open files in ...

Entonces descubrí que apache establece este valor individualmente al iniciar (en mi Ubuntu 14.04). Está configurado en /etc/apache2/envvars. Dice:

## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'

así que tuve que ajustar la tercera línea.

Miguel
fuente