¿Dónde se establecen los valores predeterminados de ulimit? (linux, centos)

34

Tengo dos servidores CentOS 5 con especificaciones casi idénticas. Cuando inicio sesión y lo hago ulimit -u, en una máquina obtengo unlimited, y en la otra obtengo 77824.

Cuando ejecuto un cron como:

* * * * * ulimit -u > ulimit.txt

Obtengo los mismos resultados ( unlimited, 77824).

Estoy tratando de determinar dónde están configurados para poder alterarlos. Ellos no están escritas en cualquiera de mis perfiles ( .bashrc, /etc/profile, etc.). Estos no afectarían cron de todos modos) ni en /etc/security/limits.conf(que está vacío).

He buscado en Google e incluso he ido tan lejos como para hacerlo grep -Ir 77824 /, pero nada ha aparecido hasta ahora. No entiendo cómo estas máquinas podrían haber sido preestablecidas con límites diferentes.

De hecho, no me pregunto por estas máquinas, sino por una máquina diferente (CentOS 6) que tiene un límite de 1024, que es demasiado pequeño. Necesito ejecutar trabajos cron con un límite más alto y la única forma en que sé cómo configurarlo es en el trabajo cron en sí. Está bien, pero prefiero configurarlo en todo el sistema para que no sea tan hacky.

Gracias por cualquier ayuda. Esto parece que debería ser fácil (NO).


EDITAR - RESUELTO

Ok, me di cuenta de esto. Parece ser un problema con CentOS 6 o quizás con la configuración de mi máquina. En la configuración de CentOS 5, puedo configurar /etc/security/limits.conf:

* - nproc unlimited

y eso actualizaría efectivamente las cuentas y los límites cron. Sin embargo, esto no funciona en mi caja CentOS 6. En cambio, debo hacer:

myname1 - nproc unlimited
myname2 - nproc unlimited
...

Y las cosas funcionan como se esperaba. Tal vez la especificación UID funciona, pero el comodín (*) definitivamente NO lo hace aquí. Curiosamente, los comodines sí funcionan para el nofilelímite.

Todavía me gustaría saber de dónde provienen los valores predeterminados, porque de manera predeterminada, este archivo está vacío y no pude ver por qué tenía diferentes valores predeterminados para las dos cajas CentOS, que tenían hardware idéntico y eran del mismo proveedor .

nomercysir
fuente
3
¿Tienes algo adentro /etc/security/limits.d/?
Patrick
No, ese directorio está vacío
nomercysir
1
Puede publicar la respuesta como una respuesta real después de un cierto período de espera.
sysadmin1138
2
Una vez busqué esto en alguna parte. Los valores predeterminados son establecidos por el núcleo. Parcialmente codificado, en parte dependiente del ariete disponible. Creo que encontré eso en Oracle Metalink en el contexto de la configuración de SLES10 para Oracle-DB 11.2
Nils
1
¿Podría esta pregunta ser marcada como resuelta?

Respuestas:

45

Estos límites "predeterminados" se aplican mediante:

  • el kernel de Linux en el momento del arranque (al initproceso),
  • herencia , de los límites del proceso padre (en el fork(2)momento),
  • PAM cuando se abre la sesión del usuario (puede reemplazar el núcleo / valores heredados),
  • el proceso en sí (puede reemplazar PAM y kernel / valores heredados, ver setrlimit(2)).

Los procesos normales de los usuarios no pueden aumentar los límites duros.

El kernel de Linux

En el momento del arranque, Linux establece límites predeterminados para el initproceso, que luego son heredados por todos los demás procesos (secundarios). Para ver estos límites: cat /proc/1/limits.

Por ejemplo, el valor predeterminado del núcleo para el número máximo de descriptores de archivo ( ulimit -n) era 1024/1024 (suave, duro) y se ha elevado a 1024/4096 en Linux 2.6.39.

El número máximo predeterminado de procesos del que está hablando se limita a aproximadamente:

Total RAM in kB / 128

para arquitecturas x86 (por lo menos), pero a veces las distribuciones cambiar los valores predeterminados del núcleo, por lo que comprobar su código fuente del kernel para kernel/fork.c, fork_init(). El límite de "número de procesos" se llama RLIMIT_NPROC allí.

PAM

Por lo general, para garantizar la autenticación del usuario al iniciar sesión, se usa PAM junto con algunos módulos (ver /etc/pam.d/login).

En Debian, el módulo PAM responsable de establecer límites está aquí: /lib/security/pam_limits.so.

Esta biblioteca leerá su configuración desde /etc/security/limits.confy /etc/security/limits.d/*.conf, pero incluso si esos archivos están vacíos, pam_limits.so podría usar valores codificados que puede verificar dentro del código fuente.

Por ejemplo, en Debian, la biblioteca ha sido parcheada de manera que, por defecto, el número máximo de procesos ( nproc) es ilimitado y el número máximo de archivos ( nofile) es 1024/1024:

  case RLIMIT_NOFILE:
      pl->limits[i].limit.rlim_cur = 1024;
      pl->limits[i].limit.rlim_max = 1024;

Por lo tanto, verifique el código fuente del módulo PAM de CentOS (busque RLIMIT_NPROC).

Sin embargo, tenga en cuenta que muchos procesos no pasarán por PAM (generalmente, si no son iniciados por un usuario conectado, como demonios y tal vez trabajos cron).

Totor
fuente
Es cierto, punto tomado, comentario eliminado. Supongo que diría que para la mayoría de los usuarios, PAM probablemente esté habilitado, por lo que recomendaría verificar primero sus archivos /etc/security/limits.conf y /etc/security/limits.d/*. En este caso particular, con el que también me encontré, hay un límite de 1024 procesos / hilos de usuario totales impuestos por defecto en CentOS 6 a través de un archivo limits.d.
rogerdpack
@rogerdpack sí, PAM ciertamente está habilitado, pero, nuevamente, como dije en mi respuesta: "tenga en cuenta que muchos procesos no pasarán por PAM (por lo general, si no son iniciados por un usuario conectado, como demonios y tal vez cron trabajos)". Nuestra discusión no tiene valor agregado, por lo tanto, si eliminas todos tus comentarios, eliminaré los míos. Gracias.
Totor
Las distribuciones SuSE tienen un paquete ulimit que proporciona /etc/initscript: "un lugar conveniente para ajustar por límites de proceso", configurable a través de /etc/sysconfig/ulimit.
sendmoreinfo
también, la biblioteca Linux-PAM lee los límites establecidos por el núcleo (es decir /proc/1/limits) desde la versión 1.1.4 (lanzada en 2011).
sendmoreinfo
@sendmoreinfo y ¿qué hace la biblioteca Linux-PAM con los límites establecidos por el núcleo aparte de leerlos?
Totor
15

En RHEL6 (CentOS6) "procesos de usuario máximos" se establece en 1024 de forma predeterminada.
Puede cambiar este valor en el archivo:

/etc/security/limits.d/90-nproc.conf

Consulte https://bugzilla.redhat.com/show_bug.cgi?id=432903 si desea quejarse al respecto :)

Tomás
fuente
Dudo que este valor de 1024 para nproc sea correcto y el autor dijo que su límite d dir estaba vacío, por lo que el valor predeterminado obviamente no está definido allí.
Totor
Totor no puede discutir técnicamente con usted, pero Tom lo encontré útil, ¡así que gracias!
Parcialmente nublado
3

Cuando revisó los límites, ¿estaba usando el usuario root para hacerlo?

Desde la página del limits.confmanual:

NOTA: los límites de grupo y comodín no se aplican al usuario raíz. Para establecer un límite para el usuario root, este campo debe contener la raíz del nombre de usuario literal.

El uso de nombres de usuario explícitos resolvería el problema en este caso.

Christopher Cashell
fuente
Tenga cuidado, esta es probablemente una "característica" específica de Debian .
Totor
Además, el limits.confarchivo está vacío (como el limits.ddirectorio).
Totor
3

La información sobre esto es terrible en Internet, heres un archivo limit.conf que hice para Debian Linux, que muestra todas las opciones posibles y sus límites máximos "seguros", ajustar en consecuencia.

Estos son los valores más altos que puede establecer, algunas cosas se descifran, la activación de esas causas hace que salga por error y no pueda iniciar sesión en su consola, modifique las opciones comentadas bajo su propio riesgo, pero no debería necesitarlo (el valor predeterminado es ilimitado en la mayoría)

Espero que esto sea útil para alguien, ya que no pude encontrar esta información en ninguna parte, hay 4 horas de investigación en este archivo.

==== FILE START =====
# /etc/security/limits.conf
# 
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:
#<domain> can be:
#- a user name
#- a group name, with @group syntax
#- the wildcard     *, for default entry
#- the wildcard %, can be also used with %group syntax,
#         for maxlogin limit
#- NOTE: group and wildcard limits are not applied to     root.
#  To apply a limit to the     root user, <domain> must be
#  the literal username     root.
#
#<type> can have the two values:
#- "soft" for enforcing the soft limits
#- "hard" for enforcing hard limits
#
#<item> can be one of the following:
#- core - limits the core file size (KB)
#- data - max data size (KB)
#- fsize - maximum filesize (KB)
#- memlock - max locked-in-memory address space (KB)
#- nofile - max number of open files
#- rss - max resident set size (KB)
#- stack - max stack size (KB)
#- cpu - max CPU time (MIN)
#- nproc - max number of processes
#- as - address space limit (KB)
#- maxlogins - max number of logins for this user
#- maxsyslogins - max number of logins on the system
#- priority - the priority to run user process with
#- locks - max number of file locks the user can hold
#- sigpending - max number of pending signals
#- msgqueue - max memory used by POSIX message queues (bytes)
#- nice - max nice priority allowed to raise to values: [-20, 19]
#- rtprio - max realtime priority
#- chroot - change     root to directory (Debian-specific)
#
#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#root            hard    core            100000
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#ftp             -       chroot          /ftp
#@student        -       maxlogins       4

# -- Defaults:
#(core) core file size                (blocks, -c) 0 (ulimit -Hc or -Sc)
#(data) data seg size                  (bytes, -d) unlimited
#(priority) scheduling priority               (-e) 0
#(fsize) file size                    (blocks, -f) unlimited
#(sigpending) pending signals                 (-i) 378197
#(memlock) max locked memory          (kbytes, -l) 64
# max memory size                     (kbytes, -m) unlimited
#(nofile) open files                          (-n) 65536
# pipe size                        (512 bytes, -p) 8
#(msgqueue) POSIX message queues       (bytes, -q) 819200
#(rtprio) real-time priority                  (-r) 0
#(stack) stack size                   (kbytes, -s) 8192
#(cpu) cpu time                      (seconds, -t) unlimited
#(nproc) max user processes                   (-u) 378197
# virtual memory                      (kbytes, -v) unlimited
#(locks) file locks                           (-x) unlimited

# --     root Limits:
root               -    core            -1
root               -    data            -1
root               -    fsize           -1
root               -    memlock         -1
root               -    nofile          999999
root               -    stack           -1
root               -    cpu             -1
root               -    nproc           -1
root               -    priority        0
root               -    locks           -1
root               -    sigpending      -1
root               -    msgqueue        -1
root               -    rtprio          -1
root               -    maxlogins       -1
root               -    maxsyslogins    -1
#root               -    rss             -1
#root               -    as              -1
#root               -    nice            0
#root               -    chroot          -1

#All Users:
# -- Hard Limits
*               hard    core            -1
*               hard    data            -1
*               hard    fsize           -1
*               hard    memlock         -1
*               hard    nofile          999999
*               hard    stack           -1
*               hard    cpu             -1
*               hard    nproc           -1
*               hard    priority        0
*               hard    locks           -1
*               hard    sigpending      -1
*               hard    msgqueue        -1
*               hard    rtprio          -1
*               hard    maxlogins       -1
*               hard    maxsyslogins    -1
#*               hard    rss             -1
#*               hard    as              -1
#*               hard    nice            0
#*               hard    chroot          -1

# -- Soft Limits
*               soft    core            -1
*               soft    data            -1
*               soft    fsize           -1
*               soft    memlock         -1
*               soft    nofile          999999
*               soft    stack           -1
*               soft    cpu             -1
*               soft    nproc           -1
*               soft    priority        0
*               soft    locks           -1
*               soft    sigpending      -1
*               soft    msgqueue        -1
*               soft    maxlogins       -1
*               soft    maxsyslogins    -1
*               soft    rtprio          -1
#*               soft    rss             -1
#*               soft    as              -1
#*               soft    nice            0
#*               soft    chroot          -1

#randomuser:
# -- Soft Limits
randomuser           soft    core            -1
randomuser           soft    data            -1
randomuser           soft    fsize           -1
randomuser           soft    memlock         -1
randomuser           soft    nofile          999999
randomuser           soft    stack           -1
randomuser           soft    cpu             -1
randomuser           soft    nproc           -1
randomuser           soft    priority        0
randomuser           soft    locks           -1
randomuser           soft    sigpending      -1
randomuser           soft    msgqueue        -1
randomuser           soft    maxlogins       -1
randomuser           soft    maxsyslogins    -1
randomuser           soft    rtprio          -1
#randomuser           soft    rss             -1
#randomuser           soft    as              -1
#randomuser           soft    nice            0
#randomuser           soft    chroot          -1

# End of file
XionicFire
fuente
2

kernel / fork.c

max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);

En 64 bits, el tamaño de la rosca es 8192

 grep -i total /proc/meminfo 
 MemTotal:        8069352 kB

Ahora obtengo el total en kb en división por 4

 echo $((8069352/4))
 2017338

Ahora tengo el número de páginas.

 echo $((8 * 8192 / 4096)
 16

El resultado final es

echo $((2017338/16))
126083

De esta manera, obtuvo el parámetro thread-max y el límite predeterminado del proceso del usuario es la mitad

init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

ulimit desde la raíz

ulimit -u
62932
echo $((62932*2))
125864 #we are near
c4f4t0r
fuente
1

Parece ser /etc/security/limits.conf

http://ss64.com/bash/limits.conf.html

jamesbtate
fuente
1
Ya lo mencioné en mi publicación. No tiene ningún efecto, ni esos valores (ilimitados, 77824) se establecen allí para las máquinas respectivas (ese archivo está vacío).
nomercysir
oh, vi que revisaste el .bashrc, etc. pero no te vi mencionar este también.
jamesbtate
1

Hay una posibilidad más de que la configuración de "noproc" no funcione mientras se configura en /etc/security/limits.conf.

Hay un archivo más que anula su configuración /etc/security/limits.d/90-nproc.conf.

* soft nproc 1024
root soft nproc ilimitado

Aquí * config anulará lo que haya establecido en el archivo de configuración anterior. Lo ideal es que configure su configuración en este archivo.

Suyash Jain
fuente