Muitos arquivos abertos no Debian

15

Eu tenho um longo processo de execução no Debian. Em algum momento, lance um erro:

Muitos arquivos abertos.

Corrida:

ulimit -a

mostra:

abrir arquivos (-n) 1024

Desejo aumentar o número de arquivos abertos em 2 vezes. Após execução

ulimit -n 2048

o limite está ativo até o final da minha sessão, o que não é aplicável à tarefa.

Como posso aumentar permanentemente o número de arquivos abertos?

FoxyBOA
fonte

Respostas:

12

Se seu processo for iniciado por meio de um script, você poderá fazer a chamada para ulimit no script antes de executar o daemon.

Se você deseja aumentar o ulimit para seu usuário ou para todos os usuários, é possível definir limites que são aplicados via pam_limitsno login. Estes estão definidos /etc/security/limits.conf. No seu caso, você pode fazer algo como:

*               hard    nofile             2048

Observe que "rígido" indica um limite rígido - que não pode ser excedido e não pode ser alterado. Um limite flexível pode ser alterado por um usuário (por exemplo, alguém sem recursos raiz), mas não além do limite rígido.

Leia limits.confpara obter mais informações sobre o uso pam_limits.

Daniel Lawson
fonte
No limite conf eu tenho 2 linhas: * soft nofile 4096 * hard nofile 8192 Que não tem efeito.
FoxyBOA 5/06/09
E você se desconectou e fez login novamente desde que os testou? Isto significa logout direita do X / GNOME / KDE etc, se você está tentando isso em uma máquina local
Daniel Lawson
Sim. O /etc/security/limits.conf não funciona para mim. Vou tentar a segunda abordagem.
FoxyBOA 5/06/09
3
O /etc/security/limits.conf funciona apenas para serviços que usam pam e o módulo pam pam_limits (consulte /etc/pam.d/ para a configuração do PAM de cada serviço e /etc/pam.d/common-* em particular) . Trata-se, portanto, todos os usuários de sessão criados por sshd, gdm, login, etc. Não diz respeito todos os programas iniciados durante a inicialização ...
Raphaël Hertzog
Eu disse algo nesse sentido, mas obrigado por esclarecer. O OP não esclareceu se é um serviço ou processo que seu usuário está executando.
9119 Daniel Lawson
13

Há também um "total máximo" de arquivos abertos definidos no kernel, você pode verificar a configuração atual com:

cat /proc/sys/fs/file-max 

E defina um novo valor com:

echo "104854" > /proc/sys/fs/file-max

Se você deseja manter a configuração entre as reinicializações, adicione

sys.fs.file-max=104854

para

/etc/sysctl.conf

Para verificar o uso máximo atual do arquivo:

[root@srv-4 proc]# cat /proc/sys/fs/file-nr
3391    969     52427
|        |       |
|        |       |
|        |       maximum open file descriptors
|        total free allocated file descriptors
total allocated file descriptors
(the number of file descriptors allocated since boot)
rkthkr
fonte
Mina mostra alguns números obscenos aqui: 49152 0 18446744073709551615 . Não entendo por que as duas primeiras colunas não somam a terceira. E se tenho 1,8 trilhão de trilhões disponíveis, não vejo como os usei todos.
mlissner
4

Como outros já disseram, você pode aplicar limites específicos por usuário ou grupo no /etc/security/limits.conf.

Nota: ulimit -n mostra o limite flexível.

ulimit -H -n 

irá mostrar o limite máximo.

Isso torna a saída ulimit -a e ulimit -n bastante confusa se, por exemplo, você estava aumentando o número de arquivos de 1024 para 4096, pois esperaria ver a saída do limite rígido, mas ainda está vendo 1024, que é o software mais fácil. limite.

Além disso, lembre-se de que esses limites são impostos por login, portanto, faça login novamente em um novo shell e verifique suas alterações, não espere que elas sejam propagadas para logins existentes.

Tom Feiner
fonte
2

Esteja ciente de que se você executar seu processo, definindo ulimits no /etc/security/limits.conf não funcionará. Se você, por exemplo, deseja aumentar o limite de arquivos abertos para o tomcat para 20000, precisará adicioná-los às linhas em /etc/default/tomcat:

ulimit -Hn 32768
ulimit -Sn 32768

Eu encontrei este problema no debian 6.0.4 Para outros processos, as respostas dadas devem ajudar.

Janning
fonte
1

Depende de como você inicia seu processo de longa execução. Se ele foi iniciado no momento da inicialização (via scripts /etc/rcX.d/*), você deve fazer uma chamada ulimit no script de inicialização, pois o limite padrão é definido pelo kernel e não pode ser ajustado sem recompilá-lo.

Usar /etc/security/limits.confpoderia funcionar se você o croniniciar, por exemplo, com uma entrada como esta:

@reboot $HOME/bin/my-program

Isso deve funcionar porque /etc/pam.d/cron habilita o pam_limits.so.

Raphaël Hertzog
fonte
-1

Você pode adicionar isso em /etc/security/limits.conf

root soft nofile 100000
root hard nofile 100000

salve e reinicie.

kxmp
fonte
3
Existe algo novo aqui que não esteja na resposta aceita para essa pergunta de cinco anos?
Andrew Schulman
-2

Um comando muito bom é, ulimit -nmas há um problema com muitas conexões e muitos arquivos abertos:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 519357
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
bate-papo
fonte
Tentei limpar sua resposta, mas ainda não estou claro o que você está tentando dizer para a pergunta original dos pôsteres. Você pode tentar limpar isso ainda mais?
Slm
Também esta é a saída de ulimit -a, não ulimit -n.
quer