dove sono impostati i valori ulimit predefiniti? (linux, centos)


34

Ho due server CentOS 5 con specifiche quasi identiche. Quando accedo e faccio ulimit -u, su una macchina ottengo unlimitede sull'altra ottengo 77824.

Quando eseguo un cron come:

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

Ottengo gli stessi risultati ( unlimited, 77824).

Sto cercando di determinare dove sono impostati in modo da poterli modificare. Essi non sono impostati in nessuno dei miei profili ( .bashrc, /etc/profile, ecc). Questi non influenzerebbero comunque cron) né in /etc/security/limits.conf(che è vuoto).

Ho setacciato google e ho persino fatto tutto il possibile grep -Ir 77824 /, ma finora non è successo nulla. Non capisco come queste macchine possano essere preimpostate con limiti diversi.

In realtà non mi chiedo per queste macchine, ma per una macchina diversa (CentOS 6) che ha un limite 1024, che è decisamente troppo piccolo. Ho bisogno di eseguire cron job con un limite superiore e l'unico modo in cui so come impostarlo è nel cron job stesso. Va bene, ma preferirei impostare il sistema in modo che non sia così caotico.

Grazie per qualsiasi aiuto. Sembra che dovrebbe essere facile (NON).


MODIFICA - RISOLTO

Ok, l'ho capito. Sembra essere un problema con CentOS 6 o forse con la mia configurazione della macchina. Sulla configurazione di CentOS 5, posso impostare /etc/security/limits.conf:

* - nproc unlimited

e ciò aggiornerebbe efficacemente i limiti di account e cron. Tuttavia, questo non funziona nella mia scatola CentOS 6. Invece, devo fare:

myname1 - nproc unlimited
myname2 - nproc unlimited
...

E le cose funzionano come previsto. Forse la specifica UID funziona, ma il carattere jolly (*) NON funziona sicuramente qui. Stranamente, i caratteri jolly funzionano per il nofilelimite.

Mi piacerebbe comunque sapere da dove provengono effettivamente i valori predefiniti, perché per impostazione predefinita questo file è vuoto e non riuscivo a capire perché avevo impostazioni predefinite diverse per le due scatole CentOS, che avevano hardware identico e provenivano dallo stesso provider .


3
Hai qualcosa dentro /etc/security/limits.d/?
Patrick,

No, quel dir è vuoto
nomercysir il

1
È possibile pubblicare la risposta come risposta effettiva dopo un determinato periodo di attesa.
sysadmin1138

2
Una volta l'ho cercato da qualche parte. I valori predefiniti sono impostati dal kernel. Parzialmente codificato, in parte dipendente dalla ram disponibile. Penso di averlo trovato su Oracle Metalink nel contesto della configurazione di SLES10 per Oracle-DB 11.2
Nils

1
Questa domanda potrebbe essere contrassegnata come risolta?

Risposte:


45

Questi limiti "predefiniti" sono applicati da:

  • il kernel di Linux al momento del boot (al initprocesso),
  • eredità , dai limiti del processo parent (al fork(2)momento),
  • PAM all'apertura della sessione utente (può sostituire kernel / valori ereditati),
  • il processo stesso (può sostituire PAM e kernel / valori ereditati, vedi setrlimit(2)).

I normali processi degli utenti non possono superare limiti rigidi.

Il kernel di Linux

Al momento dell'avvio, Linux imposta limiti predefiniti al initprocesso, che vengono quindi ereditati da tutti gli altri processi (figli). Per vedere questi limiti: cat /proc/1/limits.

Ad esempio, il kernel predefinito per il numero massimo di descrittori di file ( ulimit -n) era 1024/1024 (soft, hard), ed è stato portato a 1024/4096 in Linux 2.6.39.

Il numero massimo predefinito di processi di cui stai parlando è limitato a circa:

Total RAM in kB / 128

per x86 architetture (almeno), ma le distribuzioni a volte modificare i valori del kernel di default, in modo da controllare il codice sorgente del kernel per kernel/fork.c, fork_init(). Il limite del "numero di processi" si chiama RLIMIT_NPROC lì.

PAM

Di solito, per garantire l'autenticazione dell'utente al login, PAM viene usato insieme ad alcuni moduli (vedi /etc/pam.d/login).

Su Debian, il modulo PAM responsabile della definizione dei limiti è qui: /lib/security/pam_limits.so.

Questa libreria leggerà la sua configurazione da /etc/security/limits.confe /etc/security/limits.d/*.conf, ma anche se quei file sono vuoti, pam_limits.so potrebbe usare valori hardcoded che puoi controllare nel codice sorgente.

Ad esempio, su Debian, la libreria è stata patchata in modo tale che, per impostazione predefinita, il numero massimo di processi ( nproc) sia illimitato e il numero massimo di file ( nofile) sia 1024/1024:

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

Quindi, controlla il codice sorgente del modulo PAM di CentOS (cerca RLIMIT_NPROC).

Tuttavia, tieni presente che molti processi non passeranno attraverso PAM (di solito, se non vengono avviati da un utente connesso, come i demoni e forse i lavori cron).


Vero, punto preso, commento rimosso. Immagino che direi che per la maggior parte degli utenti, PAM è probabilmente abilitato, quindi consiglierei di controllare prima i file /etc/security/limits.conf e /etc/security/limits.d/*. In questo caso particolare, nel quale mi sono anche imbattuto, esiste un limite di 1024 processi / thread utente totale imposto di default in CentOS 6 tramite un file limits.d.
rogerdpack,

@rogerdpack sì, PAM è certamente abilitato, ma, come ho già detto nella mia risposta: "tieni presente che molti processi non passeranno attraverso PAM (di solito, se non vengono avviati da un utente connesso, come demoni e forse cron lavori)". La nostra discussione non ha valore aggiunto, pertanto, se elimini tutti i tuoi commenti, eliminerò i miei. Grazie.
Totor,

Le distribuzioni SuSE hanno il pacchetto ulimit che ha fornito /etc/initscript: "un posto conveniente per regolare i limiti di processo", configurabile tramite /etc/sysconfig/ulimit.
sendmoreinfo,

inoltre, la libreria Linux-PAM legge i limiti impostati dal kernel (cioè /proc/1/limits) dalla versione 1.1.4 (rilasciata nel 2011).
sendmoreinfo,

@sendmoreinfo e cosa fa la libreria Linux-PAM con i limiti impostati dal kernel oltre a leggerli?
Totor,

15

Su RHEL6 (CentOS6) "processi utente max" è impostato su 1024 per impostazione predefinita.
È possibile modificare questo valore nel file:

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

Vedi https://bugzilla.redhat.com/show_bug.cgi?id=432903 se desideri lamentarti :)


Dubito che questo valore 1024 per nproc sia corretto e l'autore ha detto che i suoi limiti.d dir erano vuoti, quindi il valore predefinito non è ovviamente definito lì.
Totor

Totor non può discutere con te tecnicamente, ma Tom l'ho trovato utile, quindi grazie!
Parzialmente nuvoloso

3

Quando hai controllato i limiti, stavi usando l'utente root per farlo?

Dalla limits.confmanpage:

NOTA: i limiti di gruppo e jolly non vengono applicati all'utente root. Per impostare un limite per l'utente root, questo campo deve contenere il nome utente letterale root.

L'uso di nomi utente espliciti risolverebbe il problema in questo caso.


Attenzione, questa è probabilmente una "caratteristica" specifica di Debian .
Totor

Inoltre, il limits.conffile è vuoto (come limits.ddirectory).
Totor

3

Le informazioni su questo sono terribili su Internet, ecco un file limits.conf che ho creato per debian linux, che mostra tutte le possibili opzioni e i loro limiti massimi "sicuri", modificate di conseguenza.

Questi sono i valori più alti che puoi impostare, alcune cose vengono cancellate, attivando quelle che causano errori e l'impossibilità di accedere alla tua console, modificare le opzioni commentate a tuo rischio e pericolo, ma non dovresti (l'impostazione predefinita è illimitata sulla maggior parte)

Spero che questo sia utile a qualcuno, dato che non sono riuscito a trovare queste informazioni da nessuna parte, ci sono 4 ore di ricerca su questo file.

==== 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

2

kernel / fork.c

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

Su 64 bit La dimensione del thread è 8192

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

Ora ottengo il totale in kb nella divisione per 4

 echo $((8069352/4))
 2017338

Ora ho il numero di pagine

 echo $((8 * 8192 / 4096)
 16

Il risultato finale è

echo $((2017338/16))
126083

In questo modo hai ottenuto il parametro thread-max e il limite del processo utente predefinito è la metà

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

ulimit dalla radice

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


1

C'è un'altra possibilità che la configurazione di "noproc" non funzioni durante la configurazione in /etc/security/limits.conf.

C'è un altro file che sovrascrive la tua configurazione /etc/security/limits.d/90-nproc.conf.

* soft nproc 1024
root soft nproc illimitato

Qui * config sovrascriverà qualunque cosa tu abbia impostato nel precedente file di configurazione. Quindi idealmente configuri le tue impostazioni in questo file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.