Warning: Unknown: failed to open stream: Too many open files in Unknown on line 0
Hab inzwischen rausgefunden, dass es an Apache liegt. Wir haben momentan etwas über 1000 viruelle Hosts. Pro VirtualHost wird eine eigene access.log definiert. Offensichtlich hat das zu dem o.g. Fehler geführt. Apache Neustarten hilft nicht. Wahrscheinlich öffnet er die ganzen Log-Files. Normaler Betrieb scheitert dann.
Der Ausweg ist, das Limit von geöffneten Dateien pro Prozess hochzuschrauben. Gibt es evtl. eine Alternative seitens Apache?
Roger Wilco wrote:Alternative: Alle VirtualHosts in die gleiche Datei loggen lassen und (falls überhaupt erforderlich) nachträglich nach VirtualHost aufteilen.
Das Problem ist, die Log-Dateien sind bereits zusammengefasst.
Es sind momentan nur max. 500 Log-Files vorhanden, trotzdem greift das 1024 Limit. Ich frage mich warum?
VirtualHosts habe ich ca. 1000. Wird jede Log-Datei also u.U. zwei Mal geöffnet bzw. vom System als geöffnet gezählt?
man ulimit
ulimit -n <eine Zahl Deiner Wahl>
gilt das nicht nur für die jeweils aktuelle Shell und bleibt also für Apache ohne Wirkung?
stickybit wrote:Wird jede Log-Datei also u.U. zwei Mal geöffnet bzw. vom System als geöffnet gezählt?
Das kannst du mit `lsof` prüfen. Außerdem sind es ja nicht nur die Logfiles, die geöffnet sind. Der Apache greift durchaus noch auf andere Dateien zu, so dass bei 1000 VirtualHosts das voreingestellte Limit 1024 Dateien schnell erreicht ist.
bei mir öffnet der Apache sehr viele Dateien, sodass das System-Limit von 1024 pro Prozess/Benutzer überschritten wird.
Wie kann ich für Apache-Prozesse den Wert erhöhen (debian 4.0)?
Hab schon gegoogelt. http://www.linux-community.de/Neues/story?storyid=17853
Da steht:
Damit auch Squid oder andere Programme in den Genuss des höheren Limits kommen, muss noch in der Datei /usr/include/bits/types.h der Wert von __FD_SETSIZE angepasst werden:
#define __FD_SETSIZE 4096
Dann übersetzt man die entsprechenden Programme neu.
Ist das richtig? Ich finde zwar die types.h Datei aber __FD_SETSIZE darin nicht.
matzewe01 wrote:Ich habe aber gar keine limits.conf für was gilt es denn?
limits.conf(5) wrote:limits.conf - configuration file for the pam_limits module
Der Pfad lautet /etc/security/limits.conf und nicht /etc/limits.conf, wie zuerst von mir geschrieben. In /etc gibt es dafür die /etc/limits, welche wiederum etwas ähnliches macht, nur ohne PAM-Modul.
matzewe01 wrote:Mit Sicherheit auch.
Setzte es in dessen Umgebung.
z.B. in /etc/init.d/apache2
Sorry, das hab ich jetzt nicht ganz verstanden. Werden die /etc/init.d/* Scripts nicht vom Root ausgeführt und die sämtlichen Anweisungen würden dann nur für Root gelten?
Tja, also unter FreeBSD gäbe es dafür die Login Classes... (da lassen sich solche Limits an den User binden). Kann man unter Linux nicht ulimit umgehen und per sysctl einen entsprechenden Wert für max. File Handles pro Prozess setzen?
Sind mir durchaus bekannt, aber /etc/limits ist nicht so fein granular, und das Funktionieren der Limits in /etc/security/limits.conf hängt davon ab, dass PAM nicht umgangen wird. Über sysctl lässt sich da übrigens unter Linux nichts festlegen, habe ich grade noch mal nachgeschaut.
jfreund wrote:Über sysctl lässt sich da übrigens unter Linux nichts festlegen, habe ich grade noch mal nachgeschaut.
sysctl fs.file-max
/usr/linux/Documentation/filesystems/proc.txt wrote:file-nr and file-max
--------------------
The kernel allocates file handles dynamically, but doesn't free them again at
this time.
The value in file-max denotes the maximum number of file handles that the
Linux kernel will allocate. When you get a lot of error messages about running
out of file handles, you might want to raise this limit. The default value is
10% of RAM in kilobytes. To change it, just write the new number into the
file:
This method of revision is useful for all customizable parameters of the
kernel - simply echo the new value to the corresponding file.
Historically, the three values in file-nr denoted the number of allocated file
handles, the number of allocated but unused file handles, and the maximum
number of file handles. Linux 2.6 always reports 0 as the number of free file
handles -- this is not an error, it just means that the number of allocated
file handles exactly matches the number of used file handles.
Attempts to allocate more file descriptors than file-max are reported with
printk, look for "VFS: file-max limit <number> reached".
„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.
Joe User wrote:Gelten aber nur für Logins per Shadow beziehungsweise PAM und helfen hier nicht wirklich weiter...
um das Thema abzuschließen. Ich muss also ulimit -n XXX Befehl in einem der Init-Scripte aufrufen. Die Beschränkung gilt dann für alle Serverprozesse. Richtig?
jfreund wrote:Sollte so sein, da vom init-Skript aus gestartete Prozesse als Child des Shell-Prozesses gestartet werden, der das init-Skript abarbeitet.