So umgehen Sie "Zu viele offene Dateien" in Debian

8

Wenn ich alle relevanten Protokolldateien meines Apache2-Servers gleichzeitig anzeigen möchte, verwende ich

tail -f /var/kunden/logs/*log /var/kunden/logs/*log /var/log/apache2/*log |grep -v robots|grep -v favicon

Aber da dies mittlerweile zu viele Dateien sind, möchte ich diese Grenze erhöhen.

Wie kann ich es für eine SSH-Sitzung erhöhen? Und wie könnte ich es weltweit systemweit erhöhen?

Ich kann sehen, dass das Limit für geöffnete Dateien auf meinem Computer 1024 beträgt:

ulimit -n
1024
rubo77
quelle
Das Überschreiten des Dateilimits ist häufig ein Zeichen für ein Problem. Wie bereits erwähnt, liegt möglicherweise ein Problem mit der Protokollrotation vor. (Das gedrehte Protokoll kann Ihren Befehl löschen.) Außerhalb von / var / log / apache2 sollten nicht viele (irgendwelche) Protokolle vorhanden sein, die sich auf Ihren Apache-Server beziehen. Basierend auf Ihrem Grep-Muster möchten Sie wahrscheinlich Ihren Zugriff auf Zugriffsprotokolle einschränken.
BillThor
danke für den hinweis, aber meine logrotaion funktioniert gut. Ich habe so viele Protokolle, weil alle 1025 Domänen auf meinem Server ihre eigene Protokolldatei haben;)
rubo77
1
Ihre Muster sehen so aus, als würden sie auch Fehlerprotokolle sowie Zugriffsprotokolle erfassen. Dies sollte ein kleines Problem sein, wenn Sie ein einzelnes Fehlerprotokoll haben. Wenn Sie dies in einer Shell ausführen lassen, möchten Sie möglicherweise -Fstattdessen verwenden, -fdamit die Protokolle beim Drehen wieder geöffnet werden.
BillThor

Antworten:

15

Es ist wichtig zu wissen, dass es zwei Arten von Grenzen gibt:

  • Ein festes Limit kann nur von root konfiguriert werden. Dies ist der höchstmögliche Wert (Grenzwert) für den weichen Grenzwert.
  • Ein Soft-Limit kann von einem normalen Benutzer festgelegt werden. Dies ist die tatsächlich geltende Grenze.

Lösung für eine einzelne Sitzung

Stellen Sie in der Shell das Soft-Limit ein:

ulimit -Sn 2048

In diesem Beispiel wird das tatsächliche Limit auf 2048 angehoben, aber der Befehl ist nur erfolgreich, wenn das harte Limit (check :) ulimit -Hngleich oder höher ist. Wenn Sie höhere Werte benötigen, erhöhen Sie das Hard-Limit mit einer der folgenden Methoden. Die Grenzwerte werden pro Prozess festgelegt und von neu erzeugten Prozessen geerbt. Alles, was Sie nach diesem Befehl in derselben Shell ausführen, hat die neuen Grenzwerte.

Ändern des Hard Limits in einer einzelnen Sitzung

Dies ist nicht einfach, da nur root ein festes Limit ändern kann und Sie nach dem Wechsel zu root wieder zum ursprünglichen Benutzer wechseln müssen. Hier ist die Lösung mit sudo:

sudo sh -c "ulimit -Hn 9000 ; exec su \"$USER\""

Systemweite Lösung

In Debian und vielen anderen Systemen können pam_limitsSie die systemweiten Grenzwerte in /etc/security/limits.confund in Dateien festlegen /etc/security/limits.d. Die conf-Datei enthält eine Beschreibung. Beispielzeilen:

@webadmins       hard     nofile     16384
@webadmins       soft     nofile      8192

Dadurch werden das harte Limit und das standardmäßige weiche Limit für Benutzer in der Gruppe webadminsnach der Anmeldung festgelegt.

Andere Grenzen

Der Hard-Limit-Wert wird durch das globale Limit für offene Dateideskriptoren begrenzt, /proc/sys/fs/file-maxdas in modernen Linux-Distributionen standardmäßig ziemlich hoch ist. Dieser Wert wird durch den NR_OPENWert begrenzt , der während der Kernelkompilierung verwendet wird.

Gibt es keine bessere Lösung?

Vielleicht könnten Sie überprüfen, ob alle *logDateien, die Sie füttern, tail -fwirklich aktive Dateien sind, die überwacht werden müssen. Es ist möglich, dass einige von ihnen bereits für die Protokollierung geschlossen sind und Sie nur eine kleinere Anzahl von Dateien öffnen können.

Pabouk
quelle
ulimit -Sn 4096 -bash: ulimit: offene Dateien: Kann die Grenze nicht ändern: Das Argument ist ungültig - bedeutet, dass das Argument nicht gültig ist
rubo77
@ rubo77: Ich habe Informationen über das harte Limit hinzugefügt, das höchstwahrscheinlich die Ursache des Problems ist.
Pabouk
@ rubo77: Es ist auch möglich, das harte Limit in einer Shell-Sitzung festzulegen, aber es ist schwierig, da Sie sususu -c "ulimit -Hn 6000 ; su $USER"
rooten
OK, also für eine vorübergehende Änderung des Limits werde ich dann ulimit -Hn 6000; ulimit -Sn 6000als root verwenden
rubo77
1
@amenthes Ich denke du meinst die Konfigurationsdateien in /etc/limits.*. Diese Grenzwerte werden angewendet, wenn das PAM-Modul pam_limits.soaufgerufen wird. Normalerweise ist es zu Beginn einer Sitzung. Zum Beispiel in Ubuntu 14.04 ist es in diesen Tools / Befehlen : cron, login(Textkonsolen-Login), lightdm(die GUI-Login) , su. Sie können festlegen, wo in pam_limitsverwendet wird /etc/pam.*. Siehe zum Beispiel: faqs.org/docs/securing/chap5sec44.html
pabouk
0

Ich hatte die PHP-Warnung in meinem Apache error.log:

failed to open stream: Too many open files in ...

Also fand ich heraus, dass Apache diesen Wert beim Starten individuell festlegt (auf meinem Ubuntu 14.04). Es ist in konfiguriert /etc/apache2/envvars. Es sagt:

## If you need a higher file descriptor limit, uncomment and adjust the
## following line (default is 8192):
#APACHE_ULIMIT_MAX_FILES='ulimit -n 65536'

also musste ich die dritte Zeile anpassen.

Michael
quelle