@oligofren
También llevé a cabo algunas pruebas para determinar la forma "ulimits -Sn"
de "open files"
fue aplicada.
Al igual que el póster que Elegido mencionó en el enlace , el ulimit for "open files"
se aplica por proceso. Para ver cuáles son los límites actuales del proceso:
cat /proc/__process_id__/limits
Para determinar cuántos archivos tiene abierto un proceso, debe usar el siguiente 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
Explicación de lo anterior y mi método de prueba / resultados
Los "-P -M -l -n"
argumentos de lsof simplemente están ahí para hacer que lsof funcione lo más rápido posible. Siéntase libre de sacarlos.
-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
El "-d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt'"
argumento indica lsof
que se excluyan los descriptores de archivo de tipo: cwd / err / ltx / mem / mmap / pd / rtd / txt.
Desde la página de manual de 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;
Considero que "Lnn,jld,m86,tr,v86"
no es aplicable a Linux y, por lo tanto, no me molesté en agregarlos a la lista de exclusión. No estoy seguro de eso "Mxx"
.
Si sus aplicaciones utilizan marcas de archivos de memoria asignada / dispositivos a continuación, es posible que desee eliminar "^mem"
y "^mmap"
de la lista de exclusión.
EDITAR --- comenzar a cortar ---
Editar: encontré el siguiente enlace que indica que:
los archivos .so mapeados en memoria técnicamente no son lo mismo que un identificador de archivo sobre el que la aplicación tiene control. / proc // fd es el punto de medición para los descriptores de archivos abiertos
Entonces, si su proceso utiliza archivos asignados a la memoria, deberá filtrar los archivos * .so.
Además, JVM de Sun registrará archivos jar de mapas
Un archivo JAR mapeado en memoria, en este caso el archivo que contiene las "clases JDK". Cuando asigna un JAR en memoria, puede acceder a los archivos dentro de él de manera muy eficiente (en lugar de leerlo desde el principio cada vez). Sun JVM hará un mapeo de memoria de todos los JAR en el classpath; Si su código de aplicación necesita acceder a un JAR, también puede asignarlo en la memoria.
Así que cosas como tomcat / glassfish también mostrarán archivos jar mapeados en memoria. No he probado si estos cuentan para el "ulimit -Sn"
límite.
EDITAR --- cortar final ---
Empíricamente, he encontrado que "cwd,rtd,txt"
se no se cuenta con respecto al límite de archivo por proceso (ulimit Sn).
No estoy seguro de si "err,ltx,pd"
se cuentan para el límite de archivos, ya que no sé cómo crear identificadores de archivos de estos tipos de descriptores.
El "-p __process_id__"
argumento se limita lsof
a devolver solo información para lo __process_id__
especificado. Elimine esto si desea obtener un recuento de todos los procesos.
El "-a"
argumento se usa para AND las selecciones (es decir, los argumentos "-p" y "-d").
La "awk '{if (NR>1) print}'"
declaración se utiliza para omitir el encabezado que se lsof
imprime en su salida.
Probé usando el siguiente 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---
Tuve que ejecutar el script en el depurador perl para asegurarme de que el script no terminara y lanzara los descriptores de archivo.
Ejecutar: perl -d test.pl
En el depurador de perl, puede ejecutar el programa ingresando c
y presionando enter y, si ulimit -Sn
tiene un valor de 1024 , encontrará que el programa se detiene después de crear el Test1017.log
archivo /tmp
.
Si ahora identifica el pid del proceso perl y usa el lsof
comando anterior , verá que también genera 1024 .
Elimine "wc -l"
y reemplace con un "less"
para ver la lista de archivos que contaban hacia el límite de 1024 . Elimine también el "-d ^....."
argumento para ver que los descriptores cwd,txt
y no cuentan para el límite.rtd
Si ahora ejecuta "ls -l /proc/__process_id__/fd/ | wc -l"
, verá un valor de 1025 devuelto. Esto se debe a que ls
agregó un "total 0"
encabezado a su salida que se contó.
Nota:
Para verificar si el sistema operativo se está quedando sin descriptores de archivo, es mejor comparar el valor de:
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 qué file-nr
y qué file-max
significa.