Apache stürzt ab; "Zu viele offene Dateien im System"

7

Ich führe Apache2 mit mpm_prefork auf einem MediaTemple (dv) -Server aus. In letzter Zeit wurden keine wesentlichen Änderungen an meiner Serverkonfiguration vorgenommen. httpd.conf ist derzeit auf Folgendes eingestellt:

MaxKeepAliveRequests 200
KeepAliveTimeout 15

<IfModule prefork.c>
    StartServers           10
    MinSpareServers        10
    MaxSpareServers        10
    MaxClients            200
    MaxRequestsPerChild   4000
</IfModule>

Kurz vor einem vollständigen Apache-Absturz wird jedoch der folgende Fehler angezeigt:

[Thu Jun 04 18:30:24 2009] [warn-phpd] mmap cache can't open /var/www/vhosts/mydomain.com/httpdocs/filename.php - Too many open files in system (pid 19873)

Ich ärgere mich darüber, diesen Server zu babysitten, um ihn neu zu starten, wenn Apache abstürzt. Hilfe?

Eric Martindale
quelle
Hängt etwas, das auf dem Server ausgeführt wird, von einem externen Webdienst ab? Ich hatte ein leicht ähnliches Problem, das aus dem Nichts zu kommen schien. Das PHP hinter einem Suchfeld auf meiner Website hat einen externen Webdienst aufgerufen, um die Ergebnisse zu erhalten. Dieser Webdienst wurde im Laufe der Zeit unzuverlässig und jedes Mal, wenn ein Benutzer versuchte, nach etwas zu suchen, wartete der PHP-Prozess auf unbestimmte Zeit auf eine Antwort des Webdienstes. Sobald genug Leute dies ausgelöst hatten, erreichte ich mein Prozesskontingent und es konnten keine Seiten mehr abgerufen werden.
Ben Dunlap

Antworten:

9

Ich schlage vor, Sie versuchen, eine Zeile wie diese ulimit -n 16384 am Anfang der Datei / etc / default / apache2 hinzuzufügen und dann neu zu starten.

Siehe auch diesen Link .

Zoredache
quelle
Diese Datei existiert nicht auf meinem Server. Was sind andere mögliche Standorte dafür?
Eric Martindale
3
/ etc / sysconfig / httpd auf RHEL und Fedora
Slashterix
4

von 'man proc':

/ proc / sys / fs / file-max Diese Datei definiert eine systemweite Begrenzung der Anzahl geöffneter Dateien für alle Prozesse. (Siehe auch setrlimit (2), mit dem ein Prozess das pro-Prozess-Limit RLIMIT_NOFILE für die Anzahl der möglicherweise geöffneten Dateien festlegen kann.) Wenn Sie viele Fehlermeldungen zum Auslaufen der Dateihandles erhalten, versuchen Sie es diesen Wert erhöhen:

          echo 100000 > /proc/sys/fs/file-max

          The  kernel constant NR_OPEN imposes an upper limit on the

Wert, der in file-max platziert werden kann.

          If you  increase  /proc/sys/fs/file-max,  be  sure  to 

Erhöhen Sie / proc / sys / fs / inode-max auf das 3-4-fache des neuen Werts von / proc / sys / fs / file-max, da sonst die Inodes ausgehen.

   **/proc/sys/fs/file-nr**
          This (read-only)  file  gives  the  number  of  files 

derzeit geöffnet. Es enthält drei Zahlen: die Anzahl der zugewiesenen Dateihandles; die Anzahl der freien Dateihandles; und die maximale Anzahl von Dateihandles. Der Kernel ordnet Dateihandles dynamisch zu, gibt sie jedoch nicht wieder frei. Wenn die Anzahl der zugewiesenen Dateien nahe am Maximum liegt, sollten Sie das Maximum erhöhen. Wenn die Anzahl der freien Dateihandles groß ist, haben Sie einen Spitzenwert bei der Verwendung von Dateihandles festgestellt, und Sie müssen das Maximum wahrscheinlich nicht erhöhen.

Die zweite Zahl ist einen Blick wert, um festzustellen, ob die erste Zahl das ist, was Sie erhöhen müssen. Wenn ja, können Sie es in Ihrer /etc/sysctl.conf festlegen mit:

fs.file-max=512000

Beachten Sie, dass dies die Sätze Systemgrenze; Das Limit pro Benutzer wird mit 'ulimit' festgelegt, mit dem Sie bereits vertraut waren.

pjz
quelle
Tatsächlich existiert / proc / sys / fs / inode-max jetzt nicht (seit RHEL 6.X). Die Man Proc-Seite ist falsch. h20564.www2.hpe.com/hpsc/doc/public/…
Cherif KAOUA
2

Überprüfen Sie lsof, um zu sehen, was tatsächlich los ist. Das Überschreiten eines unangemessen hohen Grenzwerts ist häufig auf ein Leck oder einen anderen Fehler zurückzuführen.

Carlito
quelle
2

MediaTemple verwendet die Virtuozzo- Virtualisierungstechnologie? Virtuozzo basiert auf OpenVZ. In OpenVZ ist die Anzahl der geöffneten Dateien begrenzt. Vielleicht hat Ihr Container das Limit erreicht?

Führen Sie diesen Befehl aus (wenn Sie können):

cat / proc / user_beancounters

und sehen Sie sich die Werte der Numfile-Ressource an.

miHost
quelle
Hey danke! Das war sehr hilfreich. Ich habe festgestellt, dass die Container von MediaTemple auf insgesamt 19200 Dateideskriptoren beschränkt sind. Ich passe meine Konfigurationen entsprechend an!
Eric Martindale
0

Versuchen Sie, "ulimit -n 8192" auszuführen, bevor Sie Apache starten. Es läuft wahrscheinlich in das maximale Limit für offene Dateien.

freiheit
quelle
Negativ, ich habe viele Iterationen davon durchlaufen, einschließlich der Version, in der ich es in mein Apachectl-Skript geschrieben habe. Trotzdem danke.
Eric Martindale
0

Das ist wahrscheinlich genau das, wonach es sich anhört - auf Ihrem Server sind mehr Dateien geöffnet, als der Kernel konfiguriert hat.

Ich nehme an, Sie haben einen gemeinsam genutzten Server? Wenn Sie root auf dem Server haben, können Sie das Limit für den Webserverbenutzer mit ulimit -n auf das in / proc / sys / fs / file-max konfigurierte Maximum erhöhen, aber für einen gemeinsam genutzten Server müssen Sie dies wahrscheinlich tun Sprechen Sie mit Ihrem Dienstanbieter.

Es ist auch möglich, dass der Server, auf dem Sie sich befinden, überfüllt ist, vorausgesetzt, Sie teilen ihn. In diesem Fall muss MediaTemple einige von Ihnen durcheinander bringen.

Haben Sie in letzter Zeit Ihrer Webpräsenz neue Funktionen hinzugefügt oder hat Ihr Datenverkehr stark zugenommen?


quelle
Nein, wir haben einen dedizierten virtuellen Server (dv) - unsere Ressourcen sind ausschließlich auf unsere eigene virtuelle Umgebung beschränkt. Nein, wir haben weder einen größeren Anstieg des Datenverkehrs noch neue Funktionen hinzugefügt.
Eric Martindale
Klingt so, als hätten Sie das unmittelbare Problem herausgefunden, aber ich würde empfehlen, weiter darüber nachzudenken, warum Sie das Limit erreicht haben - Sie sollten in der Lage sein, vorherzusagen, wann es wieder passieren wird, indem Sie Ihre offenen Dateideskriptoren im Auge behalten die Menge an Verkehr, die Sie erhalten und extrapolieren.
-1

Ich habe mein Problem gelöst, indem ich Folgendes zu / usr / sbin / apachectl hinzugefügt habe:

ULIMIT_MAX_FILES="ulimit -n 16384"

Das Problem scheint sich zumindest in den letzten 12 Stunden beruhigt zu haben.

Eric Martindale
quelle
"gelöst" ist so ein starkes Wort. ;-)
Ben Dunlap
Okay, ich denke, der passendere Begriff ist "umgangen". ; P Interessanter (und folglich in Kürze eine neue Frage ...) Ich habe festgestellt, dass wir immer noch auf einige zeitweise auftretende Probleme im Zusammenhang mit der Optimierung von MySQL stoßen. Meine Theorie ist, dass einige kleine Optimierungen von MySQL dazu führten, dass mehr Dateien auf der Festplatte verwendet wurden, was zu Apache-Problemen führte. Zitiere mich nicht dazu.
Eric Martindale