Die Situation
Ich habe ein Problem mit einem PHP-Skript, bei dem die folgende Fehlermeldung angezeigt wird:
Fatal error: Out of memory (allocated 359923712) (tried to allocate 72 bytes) in /path/to/piwik/core/DataTable.php on line 969
Das Skript, das ich ausführe, ist: /path/to/piwik/misc/cron/archive.sh
Ich gehe davon aus, dass die Zahlen Bytes sind, was bedeutet, dass die Gesamtzahl ungefähr 360 MB beträgt.
In jeder Hinsicht habe ich die Speicherbeschränkungen auf dem Server deutlich über 360 MB erhöht, aber dies ist die Anzahl (Geben oder Nehmen eines Bytes), bei der ständig Fehler auftreten.
Bitte beachten Sie : Bei dieser Frage geht es weder um die Behebung eines Speicherverlusts im Skript noch darum, warum das Skript selbst so viel Speicher verwendet. Das Skript ist Teil des Piwik-Archivierungsprozesses, daher kann ich keine Speicherlecks usw. beheben. Weitere Informationen zu diesem Skript und warum ich das Speicherlimit erhöhe, finden Sie unter "Einrichten der automatischen Archivierung".
Die Frage
Angesichts der Tatsache, dass das Skript versucht, mehr als 360 MB Speicher zu verwenden, den ich nicht ändern kann, warum scheint es mir nicht möglich zu sein, die für PHP auf meinem Server verfügbare Speichermenge zu erhöhen?
Update 23. Juni : Hintergrundinformationen finden Sie unter "Was ich versucht habe"> "Erhöhen der Speicherbeschränkungen pro Prozess unter Linux". Wenn ich dies einstelle ulimit -v 1024000
, überprüfen Sie es mit " ulimit -v
Ich erhalte den korrekten Wert" 1024000 ". Wenn ich das Skript erneut ausführe, wird es viel weiter gehen, aber irgendwann wird ein Fehler auftreten, wenn das gleiche Speicherlimit (~ 360 MB) erreicht wurde. Wenn ich es sofort überprüfe ulimit -v
, wurde es auf den ursprünglichen Wert von '524288' zurückgesetzt. Dies scheint die Hauptursache des Problems zu sein.
Was ich versucht habe
Erhöhung des Speicherlimits von PHP
Angesichts der Datei php.ini:
php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/lib
Loaded Configuration File => /usr/local/lib/php.ini
Ich habe diese Datei bearbeitet, daher lautet die Anweisung memory_limit.
memory_limit = -1
Starten Sie Apache neu und überprüfen Sie, ob der neue Wert feststeckt.
$ php -i | grep memory_limit
memory_limit => -1 => -1
Führen Sie das Skript aus und erhalten Sie den gleichen Fehler.
Ich habe auch versucht 1G
, 768M
usw. alle zum gleichen Ergebnis (dh keine Änderung).
Update 22. Juni : Basierend auf Vangel's Hilfe habe ich versucht, post_max_size
in Kombination mit der Einstellung 20M einzustellen memory_limit
. Auch dies hat keine Auswirkung.
Update 23. Juni : Basierend auf der Hilfe von olefebvre kann ich bestätigen, dass der Benutzer, der das Skript ausführt, über Lese- / Schreibberechtigungen für die Datei php.ini verfügt, die die Einstellungen von enthält memory_limit
.
Entfernen des Speicherlimits für untergeordnete Prozesse von Apache
Ich habe die Datei httpd.conf gefunden und bearbeitet, um sicherzustellen, dass es keine RLimitMEM
Direktive gibt.
Ich habe dann WHMs Apache-Konfiguration> Speichernutzungsbeschränkungen verwendet, um eine Einschränkung zu generieren, die angeblich 1000 MB betrug (und durch Überprüfen von httpd.conf bestätigt wurde).
Beides führte zu keiner Änderung des Skriptfehlers bei 360 MB.
Erhöhen der Speichergrenzen pro Prozess unter Linux
Die im System festgelegten aktuellen Grenzwerte:
$ ulimit -m
524288
$ ulimit -v
524288
Ich habe versucht, beide auf unbegrenzt zu setzen:
$ ulimit -m unlimited
$ ulimit -v unlimited
$ ulimit -m
unlimited
$ ulimit -v
unlimited
Dies hat wiederum zu keiner Verbesserung meines Problems geführt.
Update 23. Juni : Ich bin hier auf ein verwandtes Problem gestoßen. Wenn ich einstelle ulimit -v 1024000
, überprüfe es mit ulimit -v
Ich erhalte den korrekten Wert von '1024000'. Wenn ich das Skript erneut ausführe, wird es viel weiter gehen, aber irgendwann wird ein Fehler auftreten, wenn dasselbe Speicherlimit erreicht wurde. Wenn ich es sofort überprüfe ulimit -v
, wurde es auf den ursprünglichen Wert von '524288' zurückgesetzt. Dies scheint die Hauptursache des Problems zu sein.
Mein Setup
$ cat /etc/redhat-release
CentOS release 5.5 (Final)
$ uname -a
Linux example.com 2.6.18-164.15.1.el5 #1 SMP Wed Mar 17 11:30:06 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
$ php -i | grep "PHP Version"
PHP Version => 5.2.9
$ httpd -V
Server version: Apache/2.0.63
Server built: Feb 2 2011 01:25:12
Cpanel::Easy::Apache v3.2.0 rev5291
Server's Module Magic Number: 20020903:13
Server loaded: APR 0.9.17, APR-UTIL 0.9.15
Compiled using: APR 0.9.17, APR-UTIL 0.9.15
Architecture: 64-bit
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D HTTPD_ROOT="/usr/local/apache"
-D SUEXEC_BIN="/usr/local/apache/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
Ausgabe von $ php -i
: http://pastebin.com/EiRut6Nm