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

19

É possível alterar o soft - e o hard limit de um processo específico ?

No meu caso, meu processo é mongod e muitos recursos da web me dizem para simplesmente executar:

ulimit -n <my new value>

Minhas ideias atuais:

  • Como o comando saberá o limite do processo que será modificado? Isso não modificará todo o limite de arquivos abertos do sistema?
  • Estou supondo que este comando apenas altere o limite suave. Então, existe uma maneira de aumentar o limite rígido também?
por test 15.05.2013 / 23:46

4 respostas

24

Um processo pode alterar seus limites por meio da chamada do sistema setrlimit(2) . Quando você executar ulimit -n , deverá ver um número. Esse é o limite atual do número de descritores de arquivos abertos (que inclui arquivos, soquetes, canais etc.) para o processo. O comando ulimit executou a chamada do sistema getrlimit(2) para descobrir qual é o valor atual.

Aqui está o ponto chave: um processo herda seu limite atual de seu processo pai. Portanto, se você executasse ulimit -n 64 , definiria o limite de descritores de arquivos abertos desse shell para 64. Qualquer processo iniciado pelo shell teria o mesmo limite, a menos que esse novo processo chamasse setrlimit() apropriadamente.

Para alterar o limite de descritor de arquivo aberto mongodb's , 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, mongodb herdaria 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 de limite de descritores de arquivos abertos, você precisa fazer algo como modificar /etc/sysctl.conf e executar sysctl -p . Veja o valor do parâmetro fs.file-max em /etc/sysctl.conf .

    
por 16.05.2013 / 00:10
8

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 man do prlimit deve conter alguns exemplos de invocação úteis.

Fonte: link

    
por 08.02.2018 / 09:29
1

Pelo menos no Linux, a maioria das distros parece usar o pam para autenticação. Um módulo que vem com o pam é o módulo 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.

Como resultado, você pode definir limites por usuário, por grupo e padrão, em ambas as categorias hard (root define isso e o processo não pode solicitar mais) e soft limits. Os limites flexíveis normalmente são definidos abaixo dos limites rígidos e o aplicativo pode aumentá-lo para cima até atingir o limite máximo.

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. Por exemplo, eu tenho alguns trabalhos do cron do mysql em alguns servidores que requerem manipuladores de arquivos extras para serem abertos, então eu configurei isto:

$ 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ê su para aquele usuário, você pode ver imediatamente que os novos limites entram em vigor.

Outra coisa que você pode fazer se estiver em um sistema derivado típico do RedHat é colocar a chamada ulimit desejada no script / etc / sysconfig / $ SERVICE. Como exemplo, o script de inicialização do apache é denominado /etc/init.d/httpd, e ele cria o arquivo de configuração / etc / sysconfig / httpd se for encontrado. Achei mais fácil gerenciar fazendo isso em vez de editar o próprio script de inicialização 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.

    
por 08.05.2014 / 15:28
0

How will the command know the limit of the process that I'll be modifying? Won't this modify the whole systems open file limit?

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

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

    
por 08.02.2018 / 09:32

Tags