Wie kann lsof eine höhere Anzahl geöffneter Dateien melden, als laut ulimit zulässig sein sollte?

7

Wie kann lsof mehr offene Dateien melden, als laut ulimit das Limit ist?

prod_web3(i-ca0b05aa):~$ sudo lsof | wc -l
4399
prod_web3(i-ca0b05aa):~$ ulimit -n
1024
Adam Nelson
quelle

Antworten:

7

Aus der ulimit builtins Manpage

The ulimit builtin provides control over the resources available to the shell 
and to processes started by it on systems that allow such control.

Ihr lsofBefehl listet alle geöffneten Dateien für alle Prozesse für alle Benutzer im System auf. Sie vergleichen nicht wie mit wie.

user9517
quelle
4

Dies ist ein häufiger Fehler beim Vergleich der Ergebnisse eines Rohanrufs lsofmit dem angenommenen Limit.

Für das globale Limit ( /proc/sys/fs/file-max) sollten Sie sich /proc/sys/fs/file-nr-> ansehen. Der erste Wert gibt an, was verwendet wird, und der letzte Wert ist das Limit

Das OpenFile-Limit gilt für jeden Prozess, ist jedoch für einen Benutzer definiert. Siehe Befehl ulimit -Hnfür Benutzerlimits und /etc/security/limits.confDefinitionen. Wird im Allgemeinen mit "App-Benutzer" angewendet, z. B.: "Tomcat": Setzen Sie das Limit für Benutzer Tomcat auf 65000, das für den ausgeführten Java-Prozess gilt.

Wenn Sie das auf einen Prozess angewendete Limit überprüfen möchten, rufen Sie die PID ab und gehen cat /proc/${PID}/limits Sie wie folgt vor: Wenn Sie überprüfen möchten, wie viele Dateien von einem Prozess geöffnet werden, rufen Sie die PID ab und dann od: ls -1 /proc/{PID}/fd | wc -l(Hinweis: Für ls ist es 'minus eins', nicht mit 'minus el' zu verwechseln)

Wenn Sie Details wissen möchten, lsofaber nur für diejenigen Dateihandler, die für das Limit zählen, versuchen Sie es mit diesen Befehlen:

  • lsof -p ${PID} | grep -P "^(\w+\s+){3}\d+\D+"
  • lsof -p ${PID} -d '^cwd,^err,^ltx,^mem,^mmap,^pd,^rtd,^txt' -a

Anmerkung: Die 'Dateien' sind Dateien / Pipe / TCP-Verbindungen / etc.

Beachten Sie, dass Sie manchmal wahrscheinlich root sein oder verwenden müssen sudo, um das richtige Ergebnis für die Befehle zu erhalten. Ohne Privileg haben Sie manchmal keinen Fehler, nur weniger Ergebnisse.

Wenn Sie wissen möchten, auf welche 'Dateien' in Ihrem Dateisystem von einem Prozess zugegriffen wird, schauen Sie sich Folgendes an: lsof -p {PID} | grep / | awk '{print $9}' | sort | uniq

habe Spaß !

Ronan Kerdudou
quelle
Punkte für gründlich zu sein. Vielen Dank!
killdash9
3

Ulimit, ein integriertes Bash (1), definiert die maximale Anzahl geöffneter Dateien pro Prozess.

Dies ist in keiner Weise eine systemweite Einstellung.

adaptr
quelle
3

Obwohl dies alt ist, wollte ich die gleiche Frage stellen ... die Antwort ist in meinem Fall nicht zufriedenstellend, da dies passiert:

$ sudo su tomcat -c "ulimit -n"
1024
$ lsof -u tomcat
3967

Ich bin mir nicht ganz sicher, warum das passiert ist. Ich vermute, dass offene Dateien aus dem Unterprozess im übergeordneten nicht berücksichtigt werden.

estani
quelle
1
Das von festgelegte Limit ulimitgilt pro Prozess und nicht pro Benutzer. Wenn Sie die Anzahl der geöffneten Dateihandles für einen bestimmten Prozess überprüfen möchten, verwenden Sielsof -p $pid
Tonin
@Tonin Ich kann mich jetzt nicht genau erinnern, aber ich bin mir ziemlich sicher, dass es nur einen (Haupt-) Prozess gab. Könnte es sein, dass das Limit auch für Teilprozesse gilt (gleiche ppid)? Oder vielleicht gibt es eine Ventilkonfiguration, die neue Prozesse anstelle von Unterprozessen in Tomcat startet ...
estani
Der Grenzwert wird von untergeordneten Prozessen geerbt. Die Durchsetzung des Limits erfolgt jedoch pro Prozess: Der Elternteil kann 1024 offene Dateien haben, und das Kind kann auch 1024 offene Dateien haben. Ich bin mir nicht sicher, wie viele Prozesse Tomcat beim Ausführen hat. Dies hängt möglicherweise von der Installation / Konfiguration ab.
Tonin