@oligofren
I também realizou alguns testes para determinar como "ulimits -Sn"
para "open files"
foi cumprida.
Como o pôster Escolhido mencionado no link , o ulimit for "open files"
é realmente aplicado por processo. Para ver quais são os limites atuais do processo:
cat /proc/__process_id__/limits
Para determinar quantos arquivos um processo abriu, você precisa usar o seguinte comando:
lsof -P -M -l -n -d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt' -p __process_id__ -a | awk '{if (NR>1) print}' | wc -l
Explicação do exposto e meu método / resultados de teste
Os "-P -M -l -n"
argumentos para lsof estão lá simplesmente para fazer lsof operar o mais rápido possível. Sinta-se livre para tirá-los.
-P - inhibits the conversion of port numbers to port names for network files
-M - disable reporting of portmapper registrations for local TCP, UDP and UDPLITE ports
-l - inhibits the conversion of user ID numbers to login names
-n - inhibits the conversion of network numbers to host names for network files
O "-d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt'"
argumento instrui lsof
a excluir descritores de arquivo do tipo: cwd / err / ltx / mem / mmap / pd / rtd / txt.
Na página do manual lsof:
FD is the File Descriptor number of the file or:
cwd current working directory;
Lnn library references (AIX);
err FD information error (see NAME column);
jld jail directory (FreeBSD);
ltx shared library text (code and data);
Mxx hex memory-mapped type number xx.
m86 DOS Merge mapped file;
mem memory-mapped file;
mmap memory-mapped device;
pd parent directory;
rtd root directory;
tr kernel trace file (OpenBSD);
txt program text (code and data);
v86 VP/ix mapped file;
Eu considerei "Lnn,jld,m86,tr,v86"
não aplicável ao Linux e, portanto, não me preocupei em adicioná-los à lista de exclusão. Eu não tenho certeza "Mxx"
.
Se seu aplicativo utiliza arquivos / dispositivos mapeados na memória, convém remover "^mem"
e "^mmap"
da lista de exclusão.
EDITAR --- começar recortar ---
Editar: Encontrei o seguinte link que indica que:
tecnicamente, os arquivos .so mapeados na memória não são iguais aos manipuladores de arquivos sobre os quais o aplicativo tem controle. / proc // fd é o ponto de medição para descritores de arquivos abertos
Portanto, se o seu processo usar arquivos mapeados na memória, será necessário filtrar os arquivos * .so.
Além disso, a JVM da Sun armazenará arquivos jar de memória
Um JARfile mapeado na memória, nesse caso, o arquivo que contém as "classes JDK". Ao mapear um JAR na memória, você pode acessar os arquivos nele com muita eficiência (em vez de lê-lo desde o início). A Sun JVM mapeará na memória todos os JARs no caminho de classe; se o código do aplicativo precisar acessar um JAR, você também poderá mapeá-lo na memória.
Portanto, coisas como tomcat / glassfish também mostrarão arquivos jar mapeados na memória. Eu não testei se isso conta até o "ulimit -Sn"
limite.
EDIT --- final snip ---
Empiricamente, descobri que não"cwd,rtd,txt"
são contados com relação ao limite de arquivos por processo (ulimit -Sn).
Não tenho certeza se "err,ltx,pd"
são contados no limite do arquivo, pois não sei como criar identificadores de arquivo desses tipos de descritores.
O "-p __process_id__"
argumento se restringe lsof
a retornar apenas informações para o __process_id__
especificado. Remova isso se desejar obter uma contagem para todos os processos.
O "-a"
argumento é usado para AND nas seleções (ou seja, os argumentos "-p" e "-d").
A "awk '{if (NR>1) print}'"
instrução é usada para pular o cabeçalho que é lsof
impresso em sua saída.
Eu testei usando o seguinte script perl:
File: test.pl
---snip---
#!/usr/bin/perl -w
foreach $i (1..1100) {
$FH="FH${i}";
open ($FH,'>',"/tmp/Test${i}.log") || die "$!";
print $FH "$i\n";
}
---snip---
Eu tive que executar o script no depurador perl para garantir que o script não termine e libere os descritores de arquivo.
Executar: perl -d test.pl
No depurador do perl, você pode executar o programa digitando c
e pressionando enter e, se você ulimit -Sn
tiver um valor de 1024 , verá que o programa para após a criação do Test1017.log
arquivo /tmp
.
Se você agora identificar o pid do processo perl e usar o lsof
comando acima , verá que ele também gera 1024 .
Remova "wc -l"
e substitua por a "less"
para ver a lista de arquivos contados no limite de 1024 . Remova o "-d ^....."
argumento também para ver que os descritores cwd,txt
e não contam para o limite.rtd
Se você executar agora "ls -l /proc/__process_id__/fd/ | wc -l"
, verá um valor de 1025 retornado. Isso ocorre porque foi ls
adicionado um "total 0"
cabeçalho à saída que foi contado.
Nota:
Para verificar se o sistema operacional está ficando sem descritores de arquivo, é melhor comparar o valor de:
cat /proc/sys/fs/file-nr | awk '{print $1}'
com
cat /proc/sys/fs/file-max
https://www.kernel.org/doc/Documentation/sysctl/fs.txt documenta o que file-nr
e o que file-max
significa.