Was ist eine geöffnete Datei?
Eine geöffnete Datei kann eine normale Datei, ein Verzeichnis, eine spezielle Blockdatei, eine spezielle Zeichendatei, eine ausführende Textreferenz, eine Bibliothek, ein Stream oder eine Netzwerkdatei sein.
Was ist ein Dateideskriptor?
Ein Dateideskriptor ist eine Datenstruktur, die von einem Programm verwendet wird, um eine Datei zu handhaben. Die bekanntesten sind:
0 for standard in 1 for standard out 2 for standard error
Entspricht die Anzahl offener Dateien der Anzahl offener Dateideskriptoren?
Es gibt einen Unterschied in der Anzahl aktuell geöffneter Dateien und der Anzahl aktueller Dateideskriptoren/Handler. Auch wenn eine Datei geöffnet ist, ist ihr möglicherweise kein Dateideskriptor zugeordnet, wie z. B. aktuelle Arbeitsverzeichnisse, speicherabgebildete Dateien und ausführbare Textdateien.
Der Befehl „lsof“ gibt die Anzahl der geöffneten Dateien an, die einem Prozess zugeordnet sind. Zum Beispiel für den Prozess mit 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
Es gibt insgesamt 51 offene Dateien, die mit PID 2374 (Postfix) verknüpft sind.
Verwenden Sie Folgendes, um die Anzahl der offenen Dateideskriptoren zu bestimmen, die einem Prozess zugeordnet sind. Für denselben Postfix-Prozess 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
PID 2374 (Postfix) sind 13 Dateideskriptoren zugeordnet. Wir können sehen, dass es einen Unterschied zwischen der Anzahl der geöffneten Dateien und der Anzahl der Dateideskriptoren pro Prozess gibt. Postfix hat 51 geöffnete Dateien, aber nur 13 zugehörige Dateideskriptoren. Einigen der geöffneten Dateien sind keine Dateideskriptoren zugeordnet; B. Bibliotheken, aktuelle Arbeitsverzeichnisse.
Wie erhalte ich die maximale Anzahl an Dateideskriptoren?
Unter Linux kann die maximale Anzahl von Dateideskriptoren aus /proc gelesen werden Dateisystem. Verwenden Sie den folgenden Befehl, um die aktuelle Begrenzung der Anzahl von Dateideskriptoren für das gesamte System zu erhalten.
# cat /proc/sys/fs/file-max 180451Hinweis :Der Parameter /proc/sys/fs/file-max kann dynamisch geändert werden.
Wie berechnet man die Anzahl der aktuell verwendeten Dateideskriptoren?
Verwenden Sie den folgenden Befehl.
# 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
So berechnen Sie die Anzahl der aktuell verwendeten Dateideskriptoren:
1344 - 0 = 1344
Wie erhalte ich die Limits pro Prozess für die Dateideskriptoren?
Verwenden Sie „ulimit -a ‘, um die Limits pro Prozess abzurufen.
# 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
Wie findet man die Anzahl der offenen Dateideskriptoren, die von einem bestimmten Prozess verwendet werden?
Verwenden Sie den folgenden Befehl (Ersetzen Sie Ihre PID)
# ls -l /proc/2374/fd | wc -l 13
Was sind einige andere nützliche Parameter?
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.