¿Por qué redis informa el límite de 1024 archivos incluso después de actualizar a limits.conf?

9

Veo este error en la parte superior de mi archivo redis.log:

Los archivos abiertos máximos actuales son 1024. maxclients se ha reducido a 4064 para compensar el ulimit bajo.

He seguido estos pasos al pie de la letra (y reiniciado):

Además, veo esto cuando ejecuto ulimit:

ubuntu@ip-XX-XXX-XXX-XXX:~$ ulimit -n
65535

¿Es este error engañoso? Si no es así, ¿qué otros pasos debo realizar? Estoy ejecutando redis 2.8.13 (punta del árbol) en Ubuntu LTS 14.04.1 (nuevamente, punta del árbol).

Aquí está la información del usuario:

ubuntu@ip-XX-XXX-XXX-XXX:~$ ps aux | grep redis
root      1027  0.0  0.0  66328  2112 ?        Ss   20:30   0:00 sudo -u ubuntu /usr/local/bin/redis-server /etc/redis/redis.conf
ubuntu    1107 19.2 48.8 7629152 7531552 ?     Sl   20:30   2:21 /usr/local/bin/redis-server *:6379               

Por lo tanto, el servidor se ejecuta como ubuntu.

Aquí está mi archivo limit.conf sin comentarios:

ubuntu@ip-XX-XXX-XXX-XXX:~$ cat /etc/security/limits.conf | sed '/^#/d;/^$/d'
ubuntu soft nofile 65535
ubuntu hard nofile 65535
root soft nofile 65535
root hard nofile 65535

Y aquí está la salida de sysctl fs.file-max:

ubuntu@ip-XX-XXX-XXX-XXX:~$ sysctl -a| grep fs.file-max
sysctl: permission denied on key 'fs.protected_hardlinks'
sysctl: permission denied on key 'fs.protected_symlinks'
fs.file-max = 1528687
sysctl: permission denied on key 'kernel.cad_pid'
sysctl: permission denied on key 'kernel.usermodehelper.bset'
sysctl: permission denied on key 'kernel.usermodehelper.inheritable'
sysctl: permission denied on key 'net.ipv4.tcp_fastopen_key'

como sudo

ubuntu@ip-10-102-154-226:~$ sudo sysctl -a| grep fs.file-max
fs.file-max = 1528687

Además, veo este error en la parte superior del archivo redis.log, no estoy seguro de si está relacionado. Tiene sentido que el usuario de ubuntu no pueda cambiar los archivos abiertos máximos, pero dados los altos límites que he intentado configurar, no debería necesitar:

[1050] 23 Aug 21:00:43.572 # You requested maxclients of 10000 requiring at least 10032 max file descriptors.
[1050] 23 Aug 21:00:43.572 # Redis can't set maximum open files to 10032 because of OS error: Operation not permitted.
esilver
fuente

Respuestas:

4

Debes editar tus archivos dentro del /etc/pam.d/directorio.

En su caso, cuando ejecute sudo -u ubuntu /usr/local/bin/redis-server, debe agregar la siguiente línea /etc/pam.d/sudoao /etc/pam.d/common-session-noninteractiveen caso de que /etc/pam.d/sudoincluya esta:

session required pam_limits.so

Esto debería ayudar a establecer la configuración proporcionada en el interior /etc/security/limits.conf.

Navern
fuente
¡Eso fue todo! Muchas gracias. Suena como un cambio de Ubuntu 2012.04 LTS a Ubuntu 2014.04 LTS.
esilver
Me alegra que te haya ayudado. De hecho, mi xubuntu 14.04 no tiene esta línea dentro de /etc/pam.d/sudo. No puedo comprobar 12.04 en este momento.
Navern
Cuando use systemd en Debian, consulte serverfault.com/questions/770037/…
tholu
3

Otra sugerencia para los usuarios que encuentran esta publicación cuyo problema no está relacionado con pam_limits.so. En mi caso, Redis se estaba lanzando a través de un supervisor. En este caso, el método por el cual el supervisor cambió los contextos de usuario hizo que la nueva sesión se ejecutara con los límites predeterminados del sistema, no los que había configurado para el usuario.

La solución en ese caso se encontró aquí . En resumen, debe definir el límite a través de ulimit -n como parte del comando de inicio en la supervisión.

Ejemplo:

[program:redis-a]
command=bash -c "ulimit -n 32768; exec /usr/local/bin/redis-server /etc/redis/a.conf"
modea
fuente
1

Además de aumentar el límite de archivos abiertos. Necesita aumentar maxclients en su redis.conf. Solo es 10000 por defecto.

# Once the limit is reached Redis will close all the new connections sending
# an error 'max number of clients reached'.
maxclients 1024000
Kareem
fuente
0

Nota para otros usuarios de Ubuntu con un problema similar:

Si está iniciando Redis en el arranque, f.ex a través de Upstart, puede establecer este límite con la estrofa "limit".

Entonces para nofile:

limit nofile 4096 4096

Neurona Oscura
fuente