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 .


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).


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ć :)


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.


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

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

1

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

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.