де встановлені значення ulimit за замовчуванням? (linux, centos)


34

У мене є два сервери CentOS 5 з майже однаковими характеристиками. Коли я входжу і роблю ulimit -u, на одній машині я отримую unlimited, а на іншій - я 77824.

Коли я запускаю cron на зразок:

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

Я отримую ті ж результати ( unlimited, 77824).

Я намагаюся визначити, де вони встановлені, щоб я міг їх змінити. Вони не встановлені ні в одному з моїх профілів ( .bashrc, /etc/profileі т.д.). Вони ніяк не впливатимуть на cron), ні на /etc/security/limits.conf(що порожній).

Я переглянув google і навіть зайшов так далеко grep -Ir 77824 /, але нічого поки не з'явилося. Я не розумію, як ці машини могли бути встановлені з різними межами.

Мені насправді цікаво не для цих машин, а для іншої машини (CentOS 6), яка має обмеження 1024, яке занадто мало. Мені потрібно запускати задачі cron з більш високою межею, і єдиний спосіб я знаю, як встановити це в самій роботі cron. Це нормально, але я вважаю за краще встановити його в широкій системі, щоб він не був таким хитким.

Дякуємо за будь-яку допомогу. Здається, це повинно бути легко (НЕ).


РЕДАКТУВАТИ - РЕШЕНО

Гаразд, я зрозумів це. Здається, це проблема або з CentOS 6, або, можливо, з моєю конфігурацією машини. У конфігурації CentOS 5 я можу встановити /etc/security/limits.conf:

* - nproc unlimited

і це дозволило б ефективно оновити облікові записи та ліміти клієнтів. Однак це не працює в моєму вікні CentOS 6. Натомість я повинен зробити:

myname1 - nproc unlimited
myname2 - nproc unlimited
...

І все працює так, як очікувалося. Можливо, специфікація UID працює, але підстановка (*) напевно НЕ тут. Як не дивно, подстановочні символи DO працюють на nofileобмеження.

Я все ще хотів би знати, звідки насправді беруться значення за замовчуванням, тому що за замовчуванням цей файл порожній, і я не міг зрозуміти, чому у мене були різні параметри за замовчуванням для двох ящиків CentOS, які мали однакове обладнання та були від того самого постачальника .


3
У вас є щось /etc/security/limits.d/?
Патрік

Ні, цей
рейтинг

1
Відповідь можна опублікувати як фактичну відповідь після певного періоду очікування.
sysadmin1138

2
Я колись це десь заглядав. За замовчуванням встановлюється ядро. Частково жорстко закодований, частково залежить від наявного барана. Я думаю, що я виявив це на Oracle Metalink в контексті налаштування SLES10 для Oracle-DB 11.2
Nils

1
Чи можна було б позначити це питання як вирішене?

Відповіді:


45

Ці обмеження "за замовчуванням" застосовуються:

  • Linux ядра при завантаженніinitпроцесі),
  • успадкування , з обмежень батьківського процесу (на fork(2)час),
  • PAM при відкритті сеансу користувача (може замінити значення ядра / успадковані),
  • сам процес (може замінити PAM & kernel / успадковані значення, див. setrlimit(2)).

Нормальні процеси користувачів не можуть підняти жорсткі межі.

Ядро Linux

Під час завантаження Linux встановлює обмеження за замовчуванням для initпроцесу, які потім успадковуються усіма іншими (дітьми) процесами. Щоб побачити ці обмеження: cat /proc/1/limits.

Наприклад, за замовчуванням ядра для максимальної кількості дескрипторів файлів ( ulimit -n) було 1024/1024 (м'який, жорсткий), і підвищено до 1024/4096 в Linux 2.6.39.

Максимальна кількість за замовчуванням процесів, про які ви говорите , обмежена приблизно:

Total RAM in kB / 128

для архітектур х86 (принаймні), але розподілів іноді змінює значення ядра по замовчуванням, так що перевірити ядро вихідного коду для kernel/fork.c, fork_init(). Межа "кількість процесів" називається RLIMIT_NPROC там.

ПАМ

Зазвичай для забезпечення автентифікації користувача при вході в систему використовується PAM разом з деякими модулями (див. /etc/pam.d/login).

В Debian, модуль PAM відповідає за встановлення обмежень тут: /lib/security/pam_limits.so.

Ця бібліотека буде читати свою конфігурацію з /etc/security/limits.confі /etc/security/limits.d/*.conf, але навіть якщо ці файли порожні, pam_limits.so може використовувати HARDCODED значень , які ви можете перевірити в вихідному коді.

Наприклад, на Debian бібліотека була виправлена таким чином, що за замовчуванням максимальна кількість процесів ( nproc) не обмежена, а максимальна кількість файлів ( nofile) - 1024/1024:

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

Отже, перевірте вихідний код модуля PAM модуля CentOS (шукайте RLIMIT_NPROC).

Однак зауважте, що багато процесів не пройдуть через PAM (як правило, якщо вони не запущені користувачем, який увійшов у систему, як, наприклад, демони та, можливо, завдання cron).


Щоправда, пункт взятий, коментар видалений. Я думаю, я б сказав, що для більшості користувачів PAM, ймовірно, увімкнено, тому я рекомендую спочатку перевірити ваші /etc/security/limits.conf та /etc/security/limits.d/* файли. У цьому конкретному випадку, до якого я також зіткнувся, існує обмеження 1024 процесу / загальних потоків користувачів, встановлене за замовчуванням у CentOS 6 через файл limit.d.
rogerdpack

@rogerdpack так, PAM, безумовно, увімкнено, але, знову ж таки, як я вже сказав у своїй відповіді: "зауважте, що багато процесів не пройдуть через PAM (зазвичай, якщо вони не запускаються зареєстрованим користувачем, як демони і, можливо, cron робочі місця) ". Наша дискусія не має додаткової вартості, тому, якщо ви видалите всі свої коментарі, я видалю свої. Дякую.
Тотор

У дистрибутивах SuSE є пакет ulimit, який передбачав /etc/initscript- "зручне місце для настройки за обмеженнями процесу", яке можна налаштувати через /etc/sysconfig/ulimit.
надішлітьінфо

також бібліотека Linux-PAM зчитує обмеження, встановлені ядром (тобто /proc/1/limits) з версії 1.1.4 (випущена 2011).
надішлітьінфо

@sendmoreinfo і що робить Linux-PAM бібліотека з обмеженнями, встановленими ядром, крім того, щоб їх читати?
Тотор

15

У RHEL6 (CentOS6) "максимальні користувацькі процеси" встановлено за замовчуванням 1024.
Ви можете змінити це значення у файлі:

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

Дивіться https://bugzilla.redhat.com/show_bug.cgi?id=432903, якщо ви хочете поскаржитися на це :)


Я сумніваюся, що це значення 1024 для nproc є правильним, і автор сказав, що його limit.d dir порожній, тому значення за замовчуванням там, очевидно, не визначене.
Тотор

Тотор не може посперечатися з вами технічно, але Том я вважав це корисним, тому дякую!
мінлива хмарність

3

Коли ви перевіряли обмеження, чи використовували ви це користувачі root?

На сторінці сторінки limits.conf:

ПРИМІТКА: обмеження групи та підстановки не застосовуються до кореневого користувача. Щоб встановити обмеження для користувача root, це поле повинно містити буквальний корінний ім'я користувача.

Використання явних імен користувачів дозволить вирішити проблему в цьому випадку.


Будьте уважні, це, мабуть, специфічна «функція» Debian .
Тотор

Також limits.confфайл порожній (як limits.dкаталог).
Тотор

3

Інформація про це жахлива в Інтернеті, ось файл limit.conf, який я створив для Linux Linux, показуючи всі можливі варіанти та їх максимальні "безпечні" межі, налаштувати відповідно.

Це найвищі значення, які ви можете встановити, деякі речі вимкнено, активація цих причин призводить до помилок і неможливості увійти в консоль, змінювати коментовані варіанти на свій страх і ризик, але вам цього не потрібно (за замовчуванням не обмежено на більшості)

Я сподіваюся, що це комусь корисно, тому що я не міг знайти цю інформацію ніде, там 4 години дослідження цього файлу.

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

ядро / fork.c

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

На 64-бітному розмірі теми є 8192

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

Тепер я отримую загальну суму в kb у поділі на 4

 echo $((8069352/4))
 2017338

Тепер я отримав кількість сторінок

 echo $((8 * 8192 / 4096)
 16

Кінцевий результат -

echo $((2017338/16))
126083

Таким чином ви отримали параметр nit-max і обмеження користувальницького процесу за замовчуванням - наполовину

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

ulimit від кореня

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

1

Схоже, це /etc/security/limits.conf

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


1
Я це вже згадував у своєму дописі. Це не має ефекту, і ті значення (необмежені, 77824) там не встановлюються для відповідних машин (цей файл порожній).
nomercysir

о, я бачив, що ви перевірили .bashrc і т.д., але не бачили, що ви згадали і про це.
jamesbtate

1

Є ще одна можливість, що конфігурація для "noproc" не працює під час налаштування в /etc/security/limits.conf.

Є ще один файл, який перекриває вашу конфігурацію /etc/security/limits.d/90-nproc.conf.

* м'який nproc 1024
root soft nproc необмежений

Тут * config замінить все, що ви встановили в попередньому конфігураційному файлі. Тому в ідеалі ви налаштуєте свої налаштування в цьому файлі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.