¿Qué es un archivo abierto?
Un archivo abierto puede ser un archivo normal, un directorio, un archivo especial de bloque, un archivo especial de caracteres, una referencia de texto en ejecución, una biblioteca, un flujo o un archivo de red.
¿Qué es el descriptor de archivo?
Un descriptor de archivo es una estructura de datos utilizada por un programa para controlar un archivo. Los más conocidos son:
0 for standard in 1 for standard out 2 for standard error
¿La cantidad de archivos abiertos es igual a la cantidad de descriptores de archivos abiertos?
Hay una diferencia en la cantidad de archivos abiertos actuales y la cantidad de descriptores/controladores de archivos actuales. Aunque un archivo esté abierto, es posible que no tenga un descriptor de archivo asociado, como directorios de trabajo actuales, archivos asignados a la memoria y archivos de texto ejecutables.
El comando 'lsof' proporcionará la cantidad de archivos abiertos asociados con un proceso. Por ejemplo, para el proceso con PID 4448:
# lsof | grep -w 2374 pickup 2374 postfix cwd DIR 202,1 4096 8945851 /var/spool/postfix pickup 2374 postfix rtd DIR 202,1 4096 128 / pickup 2374 postfix txt REG 202,1 285112 8945807 /usr/libexec/postfix/pickup pickup 2374 postfix mem REG 202,1 62184 463326 /usr/lib64/libnss_files-2.17.so pickup 2374 postfix mem REG 202,1 155744 758332 /usr/lib64/libselinux.so.1 pickup 2374 postfix mem REG 202,1 15688 125778 /usr/lib64/libkeyutils.so.1.5 pickup 2374 postfix mem REG 202,1 58728 127331 /usr/lib64/libkrb5support.so.0.1 pickup 2374 postfix mem REG 202,1 11384 37284 /usr/lib64/libfreebl3.so ....
# lsof | grep -w 2374 | wc -l 51
Hay un total de 51 archivos abiertos asociados con PID 2374 (postfijo).
Para determinar el número de descriptores de archivos abiertos asociados con un proceso, use lo siguiente. Para el mismo proceso de sufijo, 2374:
# ls -l /proc/2374/fd total 0 lrwx------. 1 root root 64 Nov 18 18:06 0 -> /dev/null lrwx------. 1 root root 64 Nov 18 18:06 1 -> /dev/null l-wx------. 1 root root 64 Nov 18 18:06 10 -> pipe:[28867] lrwx------. 1 root root 64 Nov 18 18:06 2 -> /dev/null lr-x------. 1 root root 64 Nov 18 18:06 3 -> pipe:[18701] l-wx------. 1 root root 64 Nov 18 18:06 4 -> pipe:[18701] lrwx------. 1 root root 64 Nov 18 18:06 5 -> socket:[18631] lrwx------. 1 root root 64 Nov 18 18:06 6 -> socket:[18629] lrwx------. 1 root root 64 Nov 18 18:06 7 -> socket:[28851] lrwx------. 1 root root 64 Nov 18 18:06 8 -> anon_inode:[eventpoll] lr-x------. 1 root root 64 Nov 18 18:06 9 -> pipe:[28867] l-wx------. 1 root root 64 Nov 18 18:06 92 -> pipe:[18702]
# ls -l /proc/2374/fd | wc -l 13
Hay 13 descriptores de archivo asociados con PID 2374 (postfijo). Podemos ver que hay una diferencia entre el número de archivos abiertos y el número de descriptores de archivo por proceso. postfix tiene 51 archivos abiertos pero solo 13 descriptores de archivos asociados con él. Algunos de los archivos abiertos no tienen descriptores de archivo asociados; por ejemplo, bibliotecas, directorios de trabajo actuales.
¿Cómo obtener el número máximo de descriptores de archivos?
En Linux, el límite máximo de descriptores de archivo se puede leer desde /proc sistema de archivos Para obtener el límite actual en la cantidad de descriptores de archivo para todo el sistema, use el siguiente comando.
# cat /proc/sys/fs/file-max 180451Nota :El parámetro /proc/sys/fs/file-max se puede cambiar dinámicamente.
¿Cómo calcular el número de descriptores de archivo que se están utilizando actualmente?
Usa el siguiente comando.
# cat /proc/sys/fs/file-nr 1344 0 180451 | | |_ Max no. of file descriptors allowed on the system | | | |__ Total free allocated file descriptors | |__ Total allocated file descriptors
Para calcular el número de descriptores de archivo que se están utilizando actualmente:
1344 - 0 = 1344
¿Cómo obtener los límites por proceso en los descriptores de archivos?
Utilice 'ulimit -a ‘ para obtener los límites por proceso.
# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7132 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 4096 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 7132 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
¿Cómo se encuentra el número de descriptores de archivos abiertos que utiliza un proceso determinado?
Use el siguiente comando (Sustituya su PID)
# ls -l /proc/2374/fd | wc -l 13
¿Cuáles son algunos otros parámetros útiles?
NR_OPEN = Maximum number of open files per process NR_FILE = Total number of files that can be open in the system at any time FILE-MAX = Kernel parameter refers to maximum number of file descriptors allowed per system FILE-NR = Refers to the number of current file descriptors used at any moment. LSOF = Gives the number of open files.