Processo que excede o limite máximo de arquivos abertos

3

Estou contando os arquivos abertos atuais por um processo pid por: - cmd1: -

ls /proc/$pid/fd/* | wc -l 

e, em seguida, estou calculando a porcentagem buscando os limites máximos de arquivos abertos. cmd2: -

$ cat /proc/$pid/limits
Limit                     Soft Limit           Hard Limit           Units

Max resident set          unlimited            unlimited            bytes     
Max processes             30425                30425                processes
Max open files            4096                 4096                 files
Max locked memory         65536                65536                bytes

Apenas colando parte da saída.

Estou calculando a porcentagem: -

cmd1 / cmd2 * 100

isto é, se ls /proc/$pid/fd/* | wc -l der 1000. então a porcentagem será: 1000/4096 * 100 = aprox. 25%

às vezes estou recebendo esse percentual como 220.

cenário é reproduzível agora, aconteceu em um servidor e descobri que em /proc/pid/fd/29 : existem 5000 arquivos de log abertos por um processo.

Isso significa que o pid do processo está cruzando os limites máximos de arquivos abertos (4096).

    
por Gaurav KS 18.06.2015 / 11:47

1 resposta

1

Observe que o limite está no valor dos descritores de arquivo recém-criados (como em open() / socket() / pipe() e assim por diante nunca retornará um número maior que n-1 se o limite tiver sido definido como n e dup2(1, n or n+1...) falharão), não no número de arquivos atualmente abertos ou descritores de arquivos.

Com efeito, a partir do instante em que o limite for definido como n , isso evitará que o processo abra mais de n arquivos, mas se os descritores de arquivo acima de n já tiverem sido criados antes do limite ser reduzido então o processo pode ter mais de n arquivos abertos.

Exemplo:

$ limit descriptors 10000 # ulimit -n 10000 in bash
$ perl -MBSD::Resource -MPOSIX -e '
    dup2(1,$_) for (2000..4000);
    setrlimit(RLIMIT_NOFILE, 1024, 1024);
    exec zsh'
zsh$ ls /proc/$$/fd | wc -w
2009
zsh$ readlink /proc/$$/fd/3000
/dev/pts/1
zsh$ repeat 100 exec {a}>&1
zsh$ ls /proc/$$/fd | wc -w
2109
zsh$ grep files /proc/$$/limits
Max open files            1024                 1024                 files

No momento em que zsh foi executado, o processo tinha fds de 2000 a 4000 abertos para /dev/pts/1 . No entanto, o limite de fd foi 1024.

Já tinha 2009 fds, mas ainda conseguiu criar mais 100.

    
por 28.07.2016 / 21:25