@oligofren
Ho anche effettuato alcuni test per determinare come "ulimits -Sn"
per "open files"
è stato applicato.
Come il poster scelto nel link , l'ulimit per "open files"
viene effettivamente applicato per processo. Per vedere quali sono i limiti attuali del processo:
cat /proc/__process_id__/limits
Per determinare quanti file ha aperto un processo, è necessario utilizzare il comando seguente:
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
Spiegazione di quanto sopra e dei miei metodi / risultati del test
Gli "-P -M -l -n"
argomenti di lsof sono semplicemente lì per far funzionare lsof il più velocemente possibile. Sentiti libero di eliminarli.
-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
L' "-d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt'"
argomento indica lsof
di escludere i descrittori di file di tipo: cwd / err / ltx / mem / mmap / pd / rtd / txt.
Dalla pagina man 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;
Ho ritenuto "Lnn,jld,m86,tr,v86"
non applicabile a Linux e quindi non mi sono preoccupato di aggiungerli all'elenco di esclusione. Non ne sono sicuro "Mxx"
.
Se l'applicazione utilizza file / dispositivi associati alla memoria, è possibile che si desideri rimuovere "^mem"
e "^mmap"
dall'elenco di esclusione.
EDIT --- inizia a tagliare ---
Modifica: ho trovato il seguente link che indica che:
i file .so mappati in memoria tecnicamente non sono gli stessi di un file handle su cui l'applicazione ha il controllo. / proc // fd è il punto di misurazione per i descrittori di file aperti
Quindi, se il tuo processo utilizza file mappati in memoria, dovrai filtrare i file * .so.
Inoltre, JVM di Sun memorizzerà i file jar della mappa
Un file JAR mappato in memoria, in questo caso il file che contiene le "classi JDK". Quando si mappa in memoria un JAR, è possibile accedere ai file al suo interno in modo molto efficiente (anziché leggerlo dall'inizio ogni volta). Sun JVM mapperà in memoria tutti i JAR sul percorso di classe; se il codice dell'applicazione deve accedere a un JAR, è anche possibile mapparlo in memoria.
Quindi cose come tomcat / glassfish mostreranno anche file jar mappati in memoria. Non ho testato se questi contano ai fini del "ulimit -Sn"
limite.
EDIT --- fine snip ---
Empiricamente, ho scoperto che non"cwd,rtd,txt"
vengono conteggiati rispetto al limite del file per processo (ulimit -Sn).
Non sono sicuro che "err,ltx,pd"
vengano conteggiati ai fini del limite del file in quanto non so come creare handle di file di questi tipi di descrittori.
L' "-p __process_id__"
argomento si limita lsof
a restituire informazioni solo per l'oggetto __process_id__
specificato. Rimuovere questo se si desidera ottenere un conteggio per tutti i processi.
L' "-a"
argomento viene utilizzato per AND le selezioni (ovvero gli argomenti "-p" e "-d").
L' "awk '{if (NR>1) print}'"
istruzione viene utilizzata per saltare l'intestazione che viene lsof
stampata nel suo output.
Ho provato usando il seguente 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---
Ho dovuto eseguire lo script nel debugger perl per assicurarmi che lo script non terminasse e rilasciasse i descrittori di file.
Eseguire: perl -d test.pl
Nel debugger di perl, puoi eseguire il programma inserendo c
e premendo invio e se hai ulimit -Sn
un valore di 1024 , scoprirai che il programma si arresta dopo aver creato il Test1017.log
file /tmp
.
Se ora identifichi il pid del processo perl e usi il lsof
comando sopra , vedrai che genera anche 1024 .
Rimuovere "wc -l"
e sostituire con a "less"
per visualizzare l'elenco dei file conteggiati verso il limite 1024 . Rimuovere anche l' "-d ^....."
argomento per vedere che i descrittori cwd,txt
e non contano ai fini del limite.rtd
Se ora esegui "ls -l /proc/__process_id__/fd/ | wc -l"
, verrà visualizzato un valore di 1025 restituito. Questo perché è stata ls
aggiunta "total 0"
un'intestazione al suo output che è stata contata.
Nota:
Per verificare se il sistema operativo sta esaurendo i descrittori di file, è meglio confrontare il valore di:
cat /proc/sys/fs/file-nr | awk '{print $1}'
con
cat /proc/sys/fs/file-max
https://www.kernel.org/doc/Documentation/sysctl/fs.txt documenta cosa file-nr
e cosa file-max
significhi.