где установлены значения ulimit по умолчанию? (Linux, Centos)


34

У меня есть два сервера CentOS 5 с почти одинаковыми характеристиками. Когда я вхожу и делаю ulimit -u, на одной машине я получаю unlimited, а на другой я получаю 77824.

Когда я запускаю cron вроде:

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

Я получаю те же результаты ( unlimited, 77824).

Я пытаюсь определить, где они установлены, чтобы я мог их изменить. Они не установлены ни в одном из моих профилей ( .bashrc, /etc/profileи т. Д.). Это никак не повлияет на cron) или in /etc/security/limits.conf(который пуст).

Я покопался в гугле и даже зашел так далеко, что grep -Ir 77824 /ничего не нашел. Я не понимаю, как эти машины могли предустановиться с разными ограничениями.

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

Спасибо за любую помощь. Кажется, это должно быть легко (НЕ).


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

Хорошо, я понял это. Кажется, это проблема с CentOS 6 или, возможно, с конфигурацией моей машины. В конфигурации CentOS 5 я могу установить /etc/security/limits.conf:

* - nproc unlimited

и это будет эффективно обновлять счета и лимиты cron. Тем не менее, это не работает в моей коробке CentOS 6. Вместо этого я должен сделать:

myname1 - nproc unlimited
myname2 - nproc unlimited
...

И все работает как положено. Может быть, спецификация UID работает, но подстановочный знак (*) определенно НЕ здесь. Как ни странно, подстановочные знаки работают на 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 и ядро ​​/ унаследованные значения, см. 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 может использовать жестко закодированные значения, которые вы можете проверить в исходном коде.

Например, в Debian библиотека была исправлена так, что по умолчанию максимальное количество процессов ( nproc) не ограничено, а максимальное количество файлов ( nofile) равно 1024/1024:

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

Итак, проверьте исходный код модуля CentOS PAM (ищите 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.
sendmoreinfo

также библиотека Linux-PAM считывает ограничения, установленные ядром (то есть /proc/1/limits) начиная с версии 1.1.4 (выпущенной в 2011 году).
sendmoreinfo

@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. Чтобы установить ограничение для пользователя root, это поле должно содержать буквальное имя пользователя root.

Использование явных имен пользователей решило бы проблему в этом случае.


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

Также limits.confфайл пуст (как limits.dкаталог).
Тотор

3

Информация об этом ужасна в интернете, вот файл limit.conf, который я создал для Debian 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

Теперь я получаю сумму в КБ в делении на 4

 echo $((8069352/4))
 2017338

Теперь я получил количество страниц

 echo $((8 * 8192 / 4096)
 16

Конечный результат

echo $((2017338/16))
126083

Таким образом, вы получили параметр thread-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.

* soft nproc 1024
root soft nproc безлимитный

Здесь * config переопределит все, что вы установили в предыдущем файле конфигурации. Так что в идеале вы настраиваете свои настройки в этом файле.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.