gdzie są ustawione domyślne wartości ulimit? (linux, centos)

34

Mam dwa serwery CentOS 5 o prawie identycznych specyfikacjach. Kiedy się loguję i robię ulimit -u, na jednej maszynie dostaję unlimited, a na drugiej dostaję 77824.

Kiedy uruchamiam crona, takie jak:

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

Otrzymuję te same wyniki ( unlimited, 77824).

Próbuję ustalić, gdzie są one ustawione, abym mógł je zmienić. Nie są one ustawione w żadnym z moich profili ( .bashrc, /etc/profile, itd.). Nie wpłyną one i tak na crona) ani na /etc/security/limits.conf(który jest pusty).

Szukałem google, a nawet posunąłem się tak daleko, jak na razie grep -Ir 77824 /, ale jak dotąd nic się nie pojawiło. Nie rozumiem, w jaki sposób te maszyny mogły być ustawione z różnymi limitami.

Zastanawiam się nie dla tych maszyn, ale dla innej (CentOS 6) maszyny, która ma limit 1024, który jest zdecydowanie za mały. Muszę uruchamiać zadania cron z wyższym limitem i jedynym sposobem, w jaki wiem, jak to ustawić, jest samo zadanie cron. W porządku, ale wolałbym ustawić go szeroko, żeby nie był tak hackerski.

Dziękuję za wszelką pomoc. Wydaje się, że powinno to być łatwe (NIE).


EDYCJA - ROZWIĄZANE

Ok, rozgryzłem to. Wydaje się, że jest to problem z CentOS 6 lub konfiguracją mojej maszyny. W konfiguracji CentOS 5 mogę ustawić /etc/security/limits.conf:

* - nproc unlimited

i to skutecznie zaktualizowałoby konta i limity cron. Jednak to nie działa w moim pudełku CentOS 6. Zamiast tego muszę zrobić:

myname1 - nproc unlimited
myname2 - nproc unlimited
...

I wszystko działa zgodnie z oczekiwaniami. Może specyfikacja UID działa, ale symbol wieloznaczny (*) zdecydowanie NIE JEST tutaj. Dziwne, że symbole wieloznaczne działają dla nofilelimitu.

Nadal chciałbym wiedzieć, skąd faktycznie pochodzą wartości domyślne, ponieważ domyślnie ten plik jest pusty i nie mogłem zrozumieć, dlaczego miałem różne wartości domyślne dla dwóch urządzeń CentOS, które miały identyczny sprzęt i pochodziły od tego samego dostawcy .

nomercysir
źródło
3
Czy masz coś w sobie /etc/security/limits.d/?
Patrick
Nie, ten
katalog
1
Możesz opublikować odpowiedź jako faktyczną po pewnym okresie oczekiwania.
sysadmin1138
2
Kiedyś to gdzieś szukałem. Domyślne ustawienia są ustawiane przez jądro. Częściowo zakodowane na stałe, częściowo zależne od dostępnego pamięci RAM. Myślę, że znalazłem to w Oracle Metalink w kontekście konfigurowania SLES10 dla Oracle-DB 11.2
Nils,
1
Czy to pytanie można oznaczyć jako rozwiązane?

Odpowiedzi:

45

Te „domyślne” limity są stosowane przez:

  • jądro Linux w czasie startu (w initprocesie)
  • dziedziczenie po limitach procesu macierzystego (w fork(2)czasie),
  • PAM po otwarciu sesji użytkownika (może zastąpić jądro / odziedziczone wartości),
  • proces sam (można zastąpić PAM i kernel / odziedziczonych wartości, patrz setrlimit(2)).

Procesy zwykłych użytkowników nie mogą przekraczać twardych limitów.

Jądro Linux

W czasie uruchamiania Linux ustawia domyślne limity dla initprocesu, które są następnie dziedziczone przez wszystkie inne (potomne) procesy. Aby zobaczyć te limity: cat /proc/1/limits.

Na przykład domyślne ustawienie jądra dla maksymalnej liczby deskryptorów plików ( ulimit -n) wynosi 1024/1024 (miękki, twardy) i zostało podniesione do 1024/4096 w Linuksie 2.6.39.

Domyślna maksymalna liczba procesów, o których mówisz, jest ograniczona do około:

Total RAM in kB / 128

dla architektur x86 (co najmniej), ale czasami rozkładów zmienić domyślne wartości jądra, więc sprawdzić kod źródłowy jądra dla kernel/fork.c, fork_init(). Limit „liczby procesów” nazywa się tam RLIMIT_NPROC.

PAM

Zwykle, aby zapewnić uwierzytelnianie użytkownika podczas logowania, PAM jest używany wraz z niektórymi modułami (patrz /etc/pam.d/login).

Na Debianie, moduł PAM odpowiedzialny za ustalanie limitów jest tutaj: /lib/security/pam_limits.so.

Ta biblioteka odczyta swoją konfigurację z /etc/security/limits.confi /etc/security/limits.d/*.conf, ale nawet jeśli te pliki są puste, pam_limits.so może użyć na stałe wartości , które można sprawdzić w kodzie źródłowym.

Na przykład w Debianie biblioteka została załatana, więc domyślnie maksymalna liczba procesów ( nproc) jest nieograniczona, a maksymalna liczba plików ( nofile) to 1024/1024:

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

Więc sprawdzić kod do CentOS”pam źródłowy modułu (poszukaj RLIMIT_NPROC).

Należy jednak pamiętać, że wiele procesów nie przejdzie przez PAM (zwykle, jeśli nie są uruchamiane przez zalogowanego użytkownika, np. Demony i może zadania cron).

Totor
źródło
Prawda, punkt, komentarz usunięty. Myślę, że powiedziałbym, że dla większości użytkowników PAM jest prawdopodobnie włączony, dlatego zalecałbym najpierw sprawdzenie plików /etc/security/limits.conf i /etc/security/limits.d/*. W tym konkretnym przypadku, w którym również się zetknąłem, domyślnie na CentOS 6 narzucony jest limit 1024 procesów / wszystkich wątków użytkownika za pomocą pliku limit.d.
rogerdpack
@rogerdpack tak, PAM jest z pewnością włączony, ale znowu, jak powiedziałem w mojej odpowiedzi: „pamiętaj, że wiele procesów nie przejdzie przez PAM (zwykle, jeśli nie są uruchamiane przez zalogowanego użytkownika, np. demony i może cron Oferty pracy)". Nasza dyskusja nie ma wartości dodanej, dlatego jeśli usuniesz wszystkie swoje komentarze, usunę moje. Dziękuję Ci.
Totor
Dystrybucje SuSE mają pakiet ulimit , który zapewnia /etc/initscript- „wygodne miejsce do dostosowania limitów procesów”, konfigurowalne poprzez /etc/sysconfig/ulimit.
sendmoreinfo
biblioteka Linux-PAM odczytuje limity ustawione przez jądro (tj. /proc/1/limits) od wersji 1.1.4 (wydanej w 2011 r.).
sendmoreinfo
@sendmoreinfo i co robi biblioteka Linux-PAM z ograniczeniami określonymi przez jądro oprócz ich czytania?
Totor
15

Na RHEL6 (CentOS6) „maksymalna liczba procesów użytkownika” jest ustawiona domyślnie na 1024.
Możesz zmienić tę wartość w pliku:

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

Zobacz https://bugzilla.redhat.com/show_bug.cgi?id=432903, jeśli chcesz narzekać :)

Tomas
źródło
Wątpię, czy ta wartość 1024 dla nproc jest poprawna, a autor powiedział, że jej ograniczenia.d katalog jest pusty, więc domyślna wartość nie jest tam oczywiście zdefiniowana.
Totor
Totor nie może się z tobą kłócić technicznie, ale Tom uznałem to za pomocne, więc dzięki!
Częściowe zachmurzenie
3

Czy po sprawdzeniu limitów używałeś do tego użytkownika root?

Z strony limits.confpodręcznika:

UWAGA: limity grup i symboli zastępczych nie są stosowane do użytkownika root. Aby ustawić limit dla użytkownika root, pole to musi zawierać literalną nazwę użytkownika root.

W tym przypadku użycie jawnych nazw użytkowników rozwiązałoby problem.

Christopher Cashell
źródło
Uważaj, jest to prawdopodobnie „funkcja” specyficzna dla Debiana .
Totor
Ponadto limits.confplik jest pusty (jako limits.dkatalog).
Totor
3

Informacje na ten temat są okropne w Internecie, oto plik limit.conf, który zrobiłem dla systemu Linux Debian, pokazując wszystkie możliwe opcje i ich maksymalne „bezpieczne” limity, odpowiednio dostosuj.

Są to najwyższe wartości, które możesz ustawić, niektóre rzeczy są zakodowane, aktywacja tych powoduje błąd i niemożność zalogowania się do konsoli, modyfikowanie komentowanych opcji na własne ryzyko, ale nie musisz tego robić (domyślnie jest to nieograniczone w większości)

Mam nadzieję, że jest to przydatne dla kogoś, ponieważ nigdzie nie mogłem znaleźć tych informacji, są 4 godziny badań nad tym plikiem.

==== 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
źródło
2

jądro / fork.c

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

W 64-bitowym rozmiarze wątku to 8192

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

Teraz otrzymuję sumę w kb w dzieleniu przez 4

 echo $((8069352/4))
 2017338

Teraz mam liczbę stron

 echo $((8 * 8192 / 4096)
 16

Ostateczny wynik to

echo $((2017338/16))
126083

W ten sposób otrzymałeś parametr Thread-Max, a domyślny limit procesu użytkownika to połowa

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

ulimit z katalogu głównego

ulimit -u
62932
echo $((62932*2))
125864 #we are near
c4f4t0r
źródło
1

Wygląda na to, że /etc/security/limits.conf

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

jamesbtate
źródło
1
Wspomniałem już o tym w moim poście. Nie ma to żadnego wpływu, ani nie są tam ustawione wartości (nieograniczone, 77824) dla odpowiednich komputerów (ten plik jest pusty).
nomercysir
och, widziałem, że sprawdziłeś .bashrc itp., ale nie widziałem, że wspominałeś również o tym.
jamesbtate
1

Jest jeszcze jedna możliwość, że konfiguracja „noproc” nie działa podczas konfigurowania w /etc/security/limits.conf.

Jest jeszcze jeden plik, który przesłania twoją konfigurację /etc/security/limits.d/90-nproc.conf.

* miękki nproc 1024
root soft nproc nieograniczony

Tutaj * config zastąpi wszystko, co ustawiłeś w poprzednim pliku konfiguracyjnym. Idealnie więc skonfigurujesz swoje ustawienia w tym pliku.

Suyash Jain
źródło