@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 lsofan, 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 lsofin 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 cSie die Eingabetaste drücken. Wenn Sie ulimit -Snden Wert 1024 hatten , wird das Programm nach dem Erstellen der Test1017.logDatei in angehalten /tmp.
Wenn Sie jetzt die PID des Perl-Prozesses identifizieren und den obigen lsofBefehl 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,txtund 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 lsein "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-nrund was file-maxbedeutet.