/etc/security/limits.conf soft nproc limit parece ignorarse

18

Mi base de datos MongoDB estaba teniendo problemas bajo carga, con los siguientes errores enviando spam a los registros:

[initandlisten] pthread_create failed: errno:11 Resource temporarily unavailable
[initandlisten] can't create new thread, closing connection

Llegué a la conclusión de que necesito elevar la configuración "ulimit -u" o "Procesos máximos" que estaban en 1024, y el uso podría haber sido superior al dado los frontends web lanzados (no estoy seguro de cómo verificar esto) .

Edité /etc/security/limits.conf para agregar las dos últimas líneas (las dos primeras ya estaban allí):

*                soft    nofile          350000
*                hard    nofile          350000
*                soft    nproc           30000
*                hard    nproc           30000

Luego reinicié el sistema (por cierto, ¿debería haberlo hecho, o debería ser suficiente un reinicio del servicio mongod?)

Después de reiniciar, al revisar los límites del proceso para el proceso mongod, parece que el límite flexible se ha ignorado:

$ cat /proc/2207/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             1024                 30000                processes
Max open files            350000               350000               files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       273757               273757               signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

$ whoami
mongod


$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 273757
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 350000
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Esperaba que "Max procesa" los límites rígidos y flexibles estarán en 30000 según el archivo /etc/security/limits.conf, pero solo el rígido lo es.

¿Qué estoy haciendo mal?

Estoy ejecutando Amazon Linux en AWS EC2.

bash-4.1$ cat /etc/*-release
Amazon Linux AMI release 2012.09
John M
fuente
2
Mire en /etc/security/conf.d/? A veces hay un archivo allí que anula lo que se establece en los límites principales.conf.
dmourati
dmourati, gracias, tenías razón (igual que Scott Mcinyre).
John M

Respuestas:

22

Verifique el archivo /etc/security/limits.d/90-nproc.conf ya que es probable que esto anule su configuración. Escribí sobre este mismo problema el año pasado http://scott.cm/max-processes-1024-limits-conf/

Scott Mcintyre
fuente
Gracias, eso parece haber sido. ¿También puede decirme si simplemente reiniciar el proceso "mongod" debería ser suficiente para que lea la nueva configuración?
John M
Sí, una vez que cambie el límite, todo lo que tendrá que hacer es reiniciar el proceso mongod y leerá los nuevos límites.
Scott Mcintyre
Gracias, eso también funcionó, ambos límites están ahora en 30000. ¡Muchas gracias por tu ayuda, Scott!
John M
En lugar de editar un archivo del sistema, recomiendo crear un archivo /etc/security/limits.d/que comience con 99_local(para mostrar que lo creó) y anular todo lo que desee allí.
Alastair Irvine
1

Podría intentar cambiar el valor de ulimit al comienzo del script, que está iniciando la base de datos mongodb.

Un proceso secundario hereda los límites de recursos del proceso de llamada.

Gooseman
fuente
Me gustaría cambiar el valor global. Funcionó para 'nofile' y para el límite estricto de 'nproc', pero no para el límite flexible de 'nproc'.
John M