@oligofren
Ich habe auch einige Tests durchgeführt, um festzustellen, wie "ulimits -Sn"
für "open files"
erzwungen wurde.
Wie das im Link erwähnte Poster Chosen wird das ulimit for in der Tat pro Prozess angewendet. So ermitteln Sie die aktuellen Grenzen des Prozesses:"open files"
cat /proc/__process_id__/limits
Um festzustellen, wie viele Dateien ein Prozess geöffnet hat, müssen Sie den folgenden Befehl verwenden:
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
Erklärung der oben genannten und meiner Testmethode / Ergebnisse
Die "-P -M -l -n"
Argumente zu lsof sind einfach dazu da, lsof so schnell wie möglich arbeiten zu lassen. Fühlen Sie sich frei, sie herauszunehmen.
-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
Das "-d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt'"
Argument weist lsof
an, Dateideskriptoren des Typs auszuschließen: cwd / err / ltx / mem / mmap / pd / rtd / txt.
Aus der Manpage von 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;
Ich habe es "Lnn,jld,m86,tr,v86"
als nicht zutreffend für Linux erachtet und habe mich daher nicht darum gekümmert, sie der Ausschlussliste hinzuzufügen. Da bin ich mir nicht sicher "Mxx"
.
Wenn Ihre Anwendung mit Speicher verknüpfte Dateien / Geräte verwendet, möchten Sie möglicherweise "^mem"
und "^mmap"
aus der Ausschlussliste entfernen .
BEARBEITEN --- Snip starten ---
Bearbeiten: Ich habe den folgenden Link gefunden, der darauf hinweist, dass:
Speicherabgebildete .so-Dateien sind technisch gesehen nicht dasselbe wie ein Dateihandle, über das die Anwendung die Kontrolle hat. / proc // fd ist der Messpunkt für offene Dateideskriptoren
Wenn in Ihrem Prozess Speicherzuordnungsdateien verwendet werden, müssen Sie * .so-Dateien herausfiltern.
Die JVM von Sun speichert JAR-Dateien
Eine speicherabgebildete JAR-Datei, in diesem Fall die Datei, die die "JDK-Klassen" enthält. Wenn Sie eine JAR-Datei im Speicher zuordnen, können Sie sehr effizient auf die darin enthaltenen Dateien zugreifen (anstatt sie jedes Mal von vorn zu lesen). Die Sun-JVM ordnet alle JARs auf dem Klassenpfad im Speicher zu. Wenn Ihr Anwendungscode auf eine JAR zugreifen muss, können Sie auch eine Speicherzuordnung vornehmen.
Dinge wie Tomcat / Glassfish zeigen daher auch JAR-Dateien mit Speicherzuordnungen an. Ich habe nicht getestet, ob diese zum "ulimit -Sn"
Limit zählen.
BEARBEITEN --- Snip beenden ---
Empirisch habe ich festgestellt, dass "cwd,rtd,txt"
im Hinblick auf das Pro-Prozess-Dateilimit (ulimit-Sn) nicht gezählt wird .
Ich bin mir nicht sicher, ob diese "err,ltx,pd"
auf das Dateilimit angerechnet werden, da ich nicht weiß, wie Dateizugriffsnummern dieser Deskriptortypen erstellt werden.
Das "-p __process_id__"
Argument beschränkt sich darauf lsof
, nur Informationen für die __process_id__
angegebene zurückzugeben. Entfernen Sie diese Option, wenn Sie eine Zählung für alle Prozesse erhalten möchten.
Das "-a"
Argument wird zur UND-Verknüpfung der Auswahlen verwendet (dh die Argumente "-p" und "-d").
Die "awk '{if (NR>1) print}'"
Anweisung wird verwendet, um die Kopfzeile zu überspringen, die lsof
in der Ausgabe gedruckt wird.
Ich habe mit dem folgenden Perl-Skript getestet:
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---
Ich musste das Skript im Perl-Debugger ausführen, um sicherzustellen, dass das Skript nicht beendet und die Dateideskriptoren freigegeben werden.
Ausführen: perl -d test.pl
Im Perl-Debugger können Sie das Programm ausführen, indem c
Sie die Eingabetaste drücken. Wenn Sie ulimit -Sn
den Wert 1024 hatten , wird das Programm nach dem Erstellen der Test1017.log
Datei in angehalten /tmp
.
Wenn Sie jetzt die PID des Perl-Prozesses identifizieren und den obigen lsof
Befehl verwenden, werden Sie sehen, dass er auch 1024 ausgibt .
Entfernen Sie das Symbol "wc -l"
und ersetzen Sie es durch ein Symbol "less"
, um die Liste der Dateien anzuzeigen, die bis zum Grenzwert von 1024 gezählt haben . Entfernen Sie auch das "-d ^....."
Argument, um zu sehen, dass die cwd,txt
und rtd
-Deskriptoren nicht zum Limit gezählt haben.
Wenn Sie jetzt ausführen "ls -l /proc/__process_id__/fd/ | wc -l"
, wird der Wert 1025 zurückgegeben. Dies liegt daran , dass der Ausgabe ls
ein "total 0"
Header hinzugefügt wurde , der gezählt wurde.
Hinweis:
Um zu überprüfen, ob dem Betriebssystem die Dateideskriptoren ausgehen, ist es besser, den Wert von zu vergleichen :
cat /proc/sys/fs/file-nr | awk '{print $1}'
mit
cat /proc/sys/fs/file-max
https://www.kernel.org/doc/Documentation/sysctl/fs.txt dokumentiert, was file-nr
und was file-max
bedeutet.