• This forum has a zero tolerance policy regarding spam. If you register here to publish advertising, your user account will be deleted without further questions.

Apache memory error

themonk

New Member
Hallo,

ich habe eine vServer mit 4GB Arbeitspeicher + 4GB dynamisch. Hier laufen ein Apache Webserver (FCGI), Postfix und eine MySQL Datenbank.
Jetzt bekomme ich ab und zu auf meinen Webseiten einen 500 Fehler. In der Log steht dazu folgendes:
Code:
Fatal Error Unable to allocate shared memory segment of 67108864 bytes: mmap: Cannot allocate memory (12)
Wenn ich mir zur selben Zeit die Auslastung mit htop ansehen ist der RAM kaum ausgelastet.
Was mich allerdings wundert ist, dass unter free -m folgendes angezegit wird.
total used free shared buffers cached
Mem: 4000 3127 872 603 0 2876
-/+ buffers/cache: 251 3748
Swap: 4000 262 3737
Demnach ist so wie ich das sehe viel RAM in Gebrauch, obwohl das unter htop nicht so ersichtlich ist. Außerdem kann ich mir gerade nicht erklären was soviel RAM verbraucht.
Meine Frage daher: Kann der Fehler daher kommen, dass nur 872 RAM frei sind oder kommt der Fehler woanders her?
 
Code:
Fatal Error Unable to allocate shared memory segment of 67108864 bytes: mmap: Cannot allocate memory (12)

Laut deinem Auszug bekommst du vom Provider weniger als 4GB RAM, aber dein Webserver fordert 8GB RAM.

Im Idealfall müßte deine Ausgabe wie folgt aussehen:
Code:
free -m
              total        used        free      shared  buff/cache   available
Mem:           8192           8        8075           2         107        8041
Swap:          4096           0        4096
 
Das mir nur 4 GB zustehen und ich 6GB oder mehr nur bekomme wenn diese auch frei sind ist mir schon klar.
Aber ich kann mir nicht vorstellen, dass ich Zeitweise 6GB RAM gebnötige bzw. kann ich irgendwo sehen was soviel RAM verbraucht unter htop und top kann ich nichts feststellen.

Laut deinem Auszug bekommst du vom Provider weniger als 4GB RAM, aber dein Webserver fordert 8GB RAM.
Damit meinst du, dass ich statt 4096 nur 4000 MB habe? Und woran siehst du das der Webserver 8GB RAM fordert?
 
Aber auch "nur" 96MB zu wenig. Denke das es daran nicht liegen wird.

Sind 67108864 bytes nicht 64MB oder 0,0625GB?
Bezüglich der 64MB fällt mir noch ein, dass ich ein memory_limit von 64MB habe.

Ich vermute mal, dass Apache 8GB haben möchte, da es dem System auch dynamisch zur Verfügung steht. Gibt es eine Möglichkeit, dass Apache nur auf die 4GB zugreift oder wie könnte ich sonst den Fehler beheben?

Habe hier eine mögliche Lösung gefunden. Allerdings verstehe ich diese nicht so ganz und möchte ungern einfach die Zeilen abtippen
 
Kam denn die gleiche Fehlermeldung, wie von dir zu Anfang hier reingestellt, oder gab es dann mal eine andere Fehlermeldung?

Es kam genau die gleiche Fehlermeldung.

Kann es vielleicht auch damit zusammenhängen, dass gleichzeitig ein PHP Skript per Cronjob ausgeführt wird? Für diese Skript ist das memory_limit bei 128M.


==Edit==
Bei den Skript über den Cronjob kommt der Fehler auch mit einem memory_limit von 1024M.
 
Last edited by a moderator:
Wieviel shared Memory darfst Du denn laut vServer-Konfiguration insgesamt und pro Segment maximal anfordern?

Shared Memory und dessen maximale Segmentgrösse haben erstmal weniger mit freiem/verfügbarem RAM zu tun, als mit den entsprechenden Kernellimits.
 
Kann es vielleicht auch damit zusammenhängen, dass gleichzeitig ein PHP Skript per Cronjob ausgeführt wird? Für diese Skript ist das memory_limit bei 128M.

Das glaube ich eher weniger.

Laut der deiner oben genannten 'free -m' Ausgabe wird derzeitig 3127MB genutzt.

Hast du die Möglichkeit, mal testweise ohne Server-Neustart so viele Dienste wie möglich herunter zu fahren, damit mehr RAM für den Webserver frei wird? Falls ja: Frag danach auch mal den Status des Webservers ab.
 
Wieviel shared Memory darfst Du denn laut vServer-Konfiguration insgesamt und pro Segment maximal anfordern?

Shared Memory und dessen maximale Segmentgrösse haben erstmal weniger mit freiem/verfügbarem RAM zu tun, als mit den entsprechenden Kernellimits.

Meinst du damit die Werte bei der Ausgabe von ipcs -lm?

Code:
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
 
Also 32MB Limit ;)

memory_limit auf 32M? Habe ich gemacht. Das Problem ist immernoch das gleiche.
Hat vielleicht der OPcache noch etwas damit zutun?

Auf der Seite von meinem Hoster sehe ich, dass maximal so 2300 MB in gebrauch sind und das obwohl zu diesem Zeitpunkt die 500 Fehler erscheinen. Demnach müsste noch genügend RAM zur Verfügung stehen.
Auch unter free -m sind zu diesem Zeitpunkt unter free mindestens 700MB
 
memory_limit auf 32M?
Nein. Das Limit für Shared Memory Segments liegt bei 32MB, Dein Prozess will aber mehr reservieren und wird deshalb abgeschossen.

Völlig korrektes Verhalten Deines Kernels.

Du solltest Deinem Prozess beibringen mehrere Segments < 32 MB zu reservieren...
 
Auf der Seite von meinem Hoster sehe ich, dass maximal so 2300 MB in gebrauch sind und das obwohl zu diesem Zeitpunkt die 500 Fehler erscheinen.

Wie sieht denn deine 500 Fehlermeldung genau aus?

Und kannst du einfach mal in deiner php.ini die folgenden Parameter mit einfügen, um dann mehr sehen zu können?

Code:
error_reporting = E_ALL
display_errors = On

Eventuell hast du auch nur einfach einen Fehler, wie z.B. ein vergessenes Semikolon am Ende des Befehls im PHP-Script, was gerade ausgeführt werden soll.
 
@andreas0 habe ich mal gemacht. Konnte aber keiine Fehler feststellen.



Du solltest Deinem Prozess beibringen mehrere Segments < 32 MB zu reservieren...

hmm hört sich gut an. Aber wie kann ich ihm das beibringen?

Habe mal opcache.memory_consumption auf 32 gesetzt. Ist das der richtige weg?
 
Aber wie kann ich ihm das beibringen?
Zunächst sollte der root des Systems erstmal den wahren Übeltäter identifizieren, denn dass da jetzt jeder x-beliebige Dritte wild an irgendwelchen Konfigurationen rumfummelt, trägt nicht zur Lösung bei, ganz im Gegenteil.

Auch ich bin nicht root des Systems (und will es auch gar nicht sein) und kann somit nur die gelieferten Logs und Fehlermeldungen interpretieren. Meine diesbezügliche Interpretation lautet "irgendein Prozess versucht mehr shared memory zu reservieren als er darf" und die Ursachenforschung obliegt nun root, denn weder ich noch sonstwer, abgesehen von dessen root, kennt das betroffene System.


Insbesondere für shared memory Reservierungen gibt es soviele theoretisch mögliche Ursachen, dass dies auch hier im Forum, wenn überhaupt, nur durch einen unglücklichen Zufall gelöst werden könnte.

Also ja und nein, es kann am fehlkonfigurierten OPCache von PHP liegen.
Es kann aber auch an irgendeinem Script, oder einer Library oder einem Binary oder einer Fehlkonfiguration oder am Kernel oder einem Bug irgendwo oder einfach nur an der Mondphase liegen.

So einfach ist es manchmal ;)



Dein root sollte also erstmal alle (ich betone ALLE) auf dem System vorhandene Konfigurationen sorgfältig überprüfen (sollte er ohnehin regelmässig tun). Danach das System auf das absolut Nötigste zusammenschrumpfen und wenn das Problem dann immernoch besteht, geht es los mit strace und anderen Debuggern das System systematisch abzuklappern. Wenn auch das nicht hilft, sollten bereits genug Infos für das Abklappern diverser Bugzillas vorhanden sein. Bleibt auch dies ohne Erfolg, dann kann man noch die Mailinglisten durchsuchen und letztendlich einen Bugreport vefassen.
 
Back
Top