onde os valores de ulimit padrão são definidos? (linux, centos)


34

Eu tenho dois servidores CentOS 5 com especificações quase idênticas. Quando eu faço o login e o faço ulimit -u, em uma máquina recebo unlimitede na outra recebo 77824.

Quando executo um cron como:

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

Eu obtenho os mesmos resultados ( unlimited, 77824).

Estou tentando determinar onde eles estão definidos para que eu possa alterá-los. Eles não estão definidas em nenhum dos meus perfis ( .bashrc, /etc/profile, etc.). Isso não afetaria o cron de qualquer maneira) nem em /etc/security/limits.conf(que está vazio).

Eu vasculhei o Google e até cheguei a ponto de fazê-lo grep -Ir 77824 /, mas nada apareceu até agora. Não entendo como essas máquinas podem ter sido predefinidas com limites diferentes.

Na verdade, estou me perguntando não para essas máquinas, mas para uma máquina diferente (CentOS 6) que tem um limite de 1024, que é muito pequeno. Preciso executar tarefas cron com um limite mais alto e a única maneira de saber como definir isso é na própria tarefa cron. Tudo bem, mas eu prefiro configurá-lo em todo o sistema para que não seja tão hacky.

Obrigado por qualquer ajuda. Parece que deve ser fácil (NÃO).


EDIT - RESOLVIDO

Ok, eu descobri isso. Parece ser um problema no CentOS 6 ou talvez na configuração da minha máquina. Na configuração do CentOS 5, posso definir /etc/security/limits.conf:

* - nproc unlimited

e isso atualizaria efetivamente as contas e os limites do cron. No entanto, isso não funciona na minha caixa do CentOS 6. Em vez disso, devo fazer:

myname1 - nproc unlimited
myname2 - nproc unlimited
...

E as coisas funcionam como esperado. Talvez a especificação UID funcione, mas o curinga (*) definitivamente NÃO ESTÁ aqui. Estranhamente, os curingas funcionam para o nofilelimite.

Eu ainda adoraria saber de onde os valores padrão realmente vêm, porque, por padrão, esse arquivo está vazio e não pude ver por que eu tinha padrões diferentes para as duas caixas do CentOS, que tinham hardware idêntico e eram do mesmo provedor .


3
Você tem alguma coisa /etc/security/limits.d/?
224 Patrick Patrick

Não, isso dir está vazia
nomercysir

11
Você pode postar a resposta como uma resposta real após um certo período de espera.
sysadmin1138

2
Uma vez eu procurei isso em algum lugar. Os padrões são definidos pelo kernel. Parcialmente codificado, parcialmente dependente da memória RAM disponível. Eu acho que descobri isso no Oracle Metalink no contexto da configuração do SLES10 para Oracle-DB 11.2
Nils

11
Esta pergunta pode ser marcada como resolvida?

Respostas:


45

Esses limites "padrão" são aplicados por:

  • o kernel Linux no momento da inicialização (para o initprocesso),
  • herança , dos limites do processo pai (no fork(2)momento),
  • PAM quando a sessão do usuário é aberta (pode substituir o kernel / valores herdados),
  • o próprio processo (pode substituir o PAM e o kernel / valores herdados, consulte setrlimit(2)).

Os processos dos usuários normais não podem atingir limites rígidos.

O kernel do Linux

No momento da inicialização, o Linux define limites padrão para o initprocesso, que são herdados por todos os outros processos (filhos). Para ver esses limites: cat /proc/1/limits.

Por exemplo, o padrão do kernel para o número máximo de descritores de arquivo ( ulimit -n) era 1024/1024 (flexível, rígido) e foi aumentado para 1024/4096 no Linux 2.6.39.

O número máximo padrão de processos dos quais você está falando está limitado a aproximadamente:

Total RAM in kB / 128

para x86 arquiteturas (pelo menos), mas distribuições por vezes, mudar os valores de kernel padrão, então verificar o seu código-fonte do kernel para kernel/fork.c, fork_init(). O limite "número de processos" é chamado RLIMIT_NPROC lá.

PAM

Geralmente, para garantir a autenticação do usuário no login, o PAM é usado junto com alguns módulos (consulte /etc/pam.d/login).

No Debian, o módulo PAM responsável pela definição de limites é aqui: /lib/security/pam_limits.so.

Essa biblioteca lerá sua configuração de /etc/security/limits.confe /etc/security/limits.d/*.conf, mas mesmo que esses arquivos estejam vazios, pam_limits.so pode usar valores codificados que você pode verificar no código-fonte.

Por exemplo, no Debian, a biblioteca foi corrigida para que, por padrão, o número máximo de processos ( nproc) seja ilimitado e o número máximo de arquivos ( nofile) seja 1024/1024:

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

Portanto, verifique o código-fonte do módulo PAM do CentOS (procure RLIMIT_NPROC).

No entanto, observe que muitos processos não passam pelo PAM (normalmente, se não forem iniciados por um usuário conectado, como daemons e talvez tarefas cron).


Verdadeiro, ponto em questão, comentário removido. Acho que diria que, para a maioria dos usuários, o PAM provavelmente está ativado, portanto, recomendo verificar primeiro os arquivos /etc/security/limits.conf e /etc/security/limits.d/*. Nesta instância em particular, na qual eu também me deparei, há um limite de 1024 processos / total de threads do usuário imposto por padrão no CentOS 6 por meio de um arquivo limits.d.
Rogerdpack # 12/14

@rogerdpack sim, o PAM certamente está habilitado, mas, novamente, como disse na minha resposta: "observe que muitos processos não passam pelo PAM (normalmente, se não forem iniciados por um usuário conectado, como daemons e talvez cron empregos)". Nossa discussão não tem valor agregado; portanto, se você excluir todos os seus comentários, eu excluirei os meus. Obrigado.
Totor

As distribuições SuSE têm um pacote ulimit que forneceu /etc/initscript- "um local conveniente para ajustar os limites por processo", configurável via /etc/sysconfig/ulimit.
sendmoreinfo

Além disso, a biblioteca Linux-PAM lê os limites definidos pelo kernel (ie /proc/1/limits) desde a versão 1.1.4 (lançada em 2011).
sendmoreinfo 7/16/16

@sendmoreinfo e o que a biblioteca Linux-PAM faz com os limites definidos pelo kernel além de lê-los?
Totor

15

No RHEL6 (CentOS6), "máx. Processos do usuário" é definido como 1024 por padrão.
Você pode alterar este valor no arquivo:

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

Consulte https://bugzilla.redhat.com/show_bug.cgi?id=432903 se você quiser reclamar sobre isso :)


Eu duvido que este valor 1024 para nproc esteja correto e o autor disse que seu limits.d dir estava vazio, portanto o valor padrão obviamente não está definido lá.
Totor

Totor não pode discutir com você tecnicamente, mas Tom achei útil, então obrigado!
Parcialmente nublado

3

Quando você verificou os limites, estava usando o usuário root para fazer isso?

Na página de limits.confmanual:

NOTA: os limites de grupo e curinga não são aplicados ao usuário raiz. Para definir um limite para o usuário raiz, este campo deve conter a raiz literal do nome de usuário.

O uso de nomes de usuário explícitos resolveria o problema nesse caso.


Cuidado, este é provavelmente um "recurso" específico do Debian .
Totor

Além disso, o limits.confarquivo está vazio (como o limits.ddiretório).
Totor 11/03/13

3

Informações sobre isso são terríveis na internet, eis um arquivo limits.conf que eu criei para o debian linux, mostrando todas as opções possíveis e seus limites máximos "seguros", alterando de acordo.

Esses são os valores mais altos que você pode definir, algumas coisas são resolvidas, ativar essas causas faz com que você entre em erro e não consiga entrar no console, modifique as opções comentadas por sua conta e risco, mas você não deve (o padrão é ilimitado na maioria)

Espero que isso seja útil para alguém, pois não consegui encontrar essas informações em nenhum lugar; há 4 horas de pesquisa nesse arquivo.

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

Em tamanho de segmento de 64 bits, 8192

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

Agora eu recebo o total em kb na divisão por 4

 echo $((8069352/4))
 2017338

Agora eu tenho o número de páginas

 echo $((8 * 8192 / 4096)
 16

O resultado final é

echo $((2017338/16))
126083

Dessa maneira, você obtém o parâmetro thread-max e o limite do processo do usuário padrão é metade

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

ulimit da raiz

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


1

Há mais uma possibilidade de que a configuração do "noproc" não esteja funcionando durante a configuração no /etc/security/limits.conf.

Há mais um arquivo que substitui sua configuração /etc/security/limits.d/90-nproc.conf.

* soft nproc 1024
raiz nproc macio ilimitado

Aqui * config substituirá o que você definir no arquivo de configuração anterior. Idealmente, você define sua configuração neste arquivo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.