Modificar ulimit (arquivos abertos) de um processo específico

27

É possível alterar o limite flexível e flexível de um processo específico ?

No meu caso, meu processo é mongode muitos recursos da Web me dizem para simplesmente executar:

ulimit -n <my new value>

Meus pensamentos atuais:

  • Como o comando saberá o limite do processo que modificarei? Isso não modifica todo o limite de arquivos abertos do sistema?
  • Eu estou supondo que este comando apenas altera o limite flexível. Então, há uma maneira de aumentar o limite rígido também?
teste
fonte
Você leu esta informação valiosa? docs.mongodb.org/manual/reference/ulimit
tink
Sim, aprendi tudo de cor. Não sei se estou perdendo alguma coisa, mas essa página apenas mostra como VER os detalhes. Ele apenas diz para você escrever ulimit -n <valor> ...
teste

Respostas:

29

Um processo pode alterar seus limites através da setrlimit(2)chamada do sistema. Quando você executa, ulimit -nvocê deve ver um número. Esse é o limite atual para o número de descritores de arquivos abertos (que incluem arquivos, soquetes, tubulações etc.) para o processo. O ulimitcomando executou a getrlimit(2)chamada do sistema para descobrir qual é o valor atual.

Aqui está o ponto principal: um processo herda seu limite atual do processo pai. Portanto, se você executasse ulimit -n 64, definiria o limite de descritores de arquivo aberto desse shell para 64. Qualquer processo iniciado pelo shell teria o mesmo limite, a menos que esse novo processo chame setrlimit()adequadamente.

Para alterar mongodb'so limite do descritor de arquivo aberto, você executaria ulimit -n 2048(ou qualquer número grande que seu kernel permitir) em um shell. Você usaria esse shell para iniciar mongodb. Como um processo filho, mongodbherdaria o limite (grande) dos descritores de arquivos abertos.

Para modificar o limite de arquivos abertos do sistema, que parece mais a soma de todos os processos, o limite de descritores de arquivos abertos, você precisa fazer algo como modificar /etc/sysctl.confe executar sysctl -p. Olhe para o valor do fs.file-maxparâmetro /etc/sysctl.conf.

Bruce Ediger
fonte
Que ótima explicação! Muito obrigado. Vou tentar isso imediatamente!
teste
Essa resposta me ajudou muito, mas o problema agora é que o limite máximo é 2048, e isso não é suficiente no meu caso. 1) como posso encontrar o limite que meu kernel permite? 2) É possível alterar o LIMITE DURO agora? Obrigado novamente!
teste
@test - Eu nunca levantei o limite máximo. Encontrou isso: blog.samat.org/2011/04/05/… e este wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux Eles dizem a mesma coisa.
Bruce Ediger #
18

Para alterar os limites de um processo em execução, você pode usar o comando do utilitário prlimit.

prlimit --pid 12345 --nofile=1024:1024

O que isso faz internamente é chamar setrlimit(2). A página de manual do prlimit deve conter alguns exemplos úteis de chamada.

Fonte: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/

user7610
fonte
Isso salvou meu dia, obrigado. Eu tive um processo Python de longa duração que estava produzindo too many files openerros. Sua resposta resolveu meu problema sem interromper o processo.
Visionscaper
1

No Linux, pelo menos, a maioria das distros parece usar o pam para autenticação. Um módulo que vem com o pam é o módulo de limites . Citando o README para pam_limits:

The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.

As a result, you can set per user, per group, and default limits, in both categories hard (root sets this and the process cannot request higher) and soft limits. The soft limits are typically set lower than the hard limits, and the app can increase it upwards until it hits the hard limit.

No seu caso, se o processo que você deseja aumentar os limites de execuções como um usuário comum, você pode aumentar os limites para esse usuário ou grupo. Como exemplo, eu tenho alguns trabalhos mysql cron em alguns servidores que exigem que identificadores de arquivos extras sejam abertos, então defino isso:

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

Não há nada que precise ser reiniciado; quando você processa esse usuário, pode ver imediatamente que os novos limites entram em vigor.

Outra coisa que você pode fazer se estiver em um sistema derivado do RedHat típico é colocar a chamada ulimit que você deseja no script / etc / sysconfig / $ SERVICE. Como exemplo, o script init do apache é nomeado /etc/init.d/httpd, e ele origina o arquivo de configuração / etc / sysconfig / httpd, se encontrado. Achei mais fácil gerenciar isso, em vez de editar o próprio script init, porque os scripts init são atualizados quando o rpm é atualizado, mas os arquivos sysconfig são atualizados apenas se não forem alterados do padrão.

Todd Lyons
fonte
Melhor e mais prática solução.
N
0

Como o comando saberá o limite do processo que modificarei? Isso não modifica todo o limite de arquivos abertos do sistema?

O comando alterará o limite do processo atual (seu shell) e de qualquer processo filho (qualquer coisa que você execute a partir do shell posteriormente).

Os processos são organizados em uma árvore. Todo processo tem um pai (que o invocou). O número do processo 1, init, é um processo especial, pois é seu próprio pai. Ferramentas como htop ou top podem mostrar os processos exibidos como uma árvore de pais e filhos.

user7610
fonte