Los límites del descriptor de archivos Ulimit no se aplican para un proceso en particular

14

Recientemente verifiqué uno de nuestros procesos de redis para determinar qué límites se aplicaron con:

cat /proc/<redis-pid>/limits

Y me sorprendió saber que estaba en el valor predeterminado bajo:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

Me sorprendió, porque tenemos configurado lo siguiente:

# /etc/sysctl.conf 
fs.file-max = 100000

.

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

.

# /etc/ssh/sshd_config
UsePAM yes

.

# /etc/pam.d/sshd
session required pam_limits.so

¿Alguien puede decirme por qué el aumento de ulimit no se aplica al proceso de redis en ejecución?

El proceso de redis se ejecuta como el usuario 'redis', el servidor se ha reiniciado desde que se aumentaron los límites. Estamos en Debian Squeeze.

Hasta el arroyo
fuente

Respuestas:

19

En Linux, los límites de recursos se pueden establecer en varias ubicaciones según el tipo de requisito.

  1. /etc/security/limits.conf archivo.
  2. /etc/sysctl.conf archivo.
  3. ulimit mando

/etc/security/limits.confes parte de pam_limits y, por lo tanto, los límites establecidos en este archivo los lee el módulo pam_limits durante las sesiones de inicio de sesión. La sesión de inicio de sesión puede ser por ssho a través de terminal. Y pam_limits no afectará los procesos de daemon como se menciona aquí .

/etc/sysctl.confes una configuración global de todo el sistema, no podemos establecer la configuración específica del usuario aquí. Establece la cantidad máxima de recursos que pueden ser utilizados por todos los usuarios / procesos reunidos.

ulimitEl comando se utiliza para establecer los límites del shell. Y así, cuando se establece un límite ulimiten un shell, el proceso que se genera desde el shell también obtiene ese valor debido a la regla de que child processhereda las parent processespropiedades.

Y así, para su caso, ya que el redisinicio como parte de initninguno de los anteriores lo ayudará directamente. La forma correcta de hacerlo es que debe usar el ulimitcomando para establecer el nuevo valor en el script de inicio. Como a continuación en el guión,

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

Ya hay un error archivado en la lista de deseos para agregar una ulimitcaracterística start-stop-daemon .

También verifique la redisconfiguración si hay alguna forma de proporcionar límites allí.

Kannan Mohan
fuente
Gran resumen Kannan! Ahora seguí adelante y agregué el ulimit al script de inicio. Es una pena que no haya forma de establecer el límite para el usuario que trabajará con procesos desamonizados (ya que tenemos múltiples scripts de inicio), pero esto funciona. ¡Gracias!
UpTheCreek
Gran respuesta. El proceso secundario que hereda las propiedades del proceso primario fue lo que me sorprendió, todos los límites parecían correctos para el usuario que ejecutaba el proceso secundario, pero era el límite del propietario del proceso primario que se estaba utilizando.
sincronización
2

El parámetro sysctl fs.file-max es un amplio límite global del sistema, no creo que sea una buena idea establecer ulimit el mismo valor.

Si configura en ulimit 100000 y también en sysctl.conf 100000, un usuario puede bloquear el sistema

De cualquier manera, hablando de su problema, debe estar seguro, su sistema usa pam_limits

man pam_limits
grep -i limit /etc/pam.d/*
c4f4t0r
fuente
Gracias. Consideraré aumentar el valor de fs.file-max entonces. Con respecto a pam, creo que estamos usando esto (he agregado alguna configuración adicional a la pregunta). Sin embargo, no estoy seguro de entender PAM, ya que nuestra configuración parece estar relacionada con SSH, que este usuario no utiliza. ¿Hay algún otro archivo que deba configurar? Siempre podría poner una configuración ulimit en los scripts de inicio para redis, pero preferiría no tener que hacer esto.
UpTheCreek
2

Ha habilitado pam_limits para sshd, pero ¿se está ejecutando este comando desde una sesión SSH? Es posible que deba agregar la misma línea a /etc/pam.d/loginy / o /etc/pam.d/suy / o /etc/pam.d/sudo.

Omnipresencia
fuente
Gracias. Sospeché que eso no estaba del todo bien. El proceso se ponga en marcha esta línea en un script de init.d: if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS. ¿Qué pam sería apropiado en este caso?
UpTheCreek
en su script puede usar ulimit -n 100000
c4f4t0r el
¿El script init.d usa un su [user] -ccomando para iniciar el script como otro usuario, o su programa se ejecuta como root? Si está usando su, entonces lo pondrías /etc/pam.d/su. Si está ejecutando como root, probablemente sea mejor con la sugerencia de c4f4t0r de agregar el ulimitcomando en su script de inicio. rootse le permite establecer los límites que desee, por lo que realmente no tiene que preocuparse por pam para ese caso.
Omnipresencia el
1
Gracias. Se usa --chuid redis:redisen start-stop-daemon. He agregado el ulimit al script de inicio ahora.
UpTheCreek