Wie kann man einem Shell-Skript Speicherbeschränkungen auferlegen?


10

Ich habe ein PHP-Skript, das, obwohl ein Ordner XML-Dateien enthält, diese in der Datenbank verarbeitet.

Derzeit läuft auf dem Server PHP Version 5.3.10 und es gibt einen Fehlerbericht über Speicherprobleme, die ZEND_MM_HEAPinnerhalb einer Schleife ausgelöst werden .

Dies führt dazu, dass PHP den Speicher nicht ordnungsgemäß freigibt, was zu einem Fehler und einem Skriptabsturz führt:

 zend_mm_heap is corrupted

Einige Lösungen wurden gefunden, aber ich habe keinen Zugriff auf die Servereinstellungen.

Um dies zu bewältigen, habe ich das folgende Bash-Skript vorbereitet, um die Schleife zu behandeln, wobei das PHP-Skript nur für die Verarbeitung der XML-Datei verantwortlich ist:

#!/bin/bash

# Check for files to process
# If files are present, call
# the PHP script

DIR="/path/to/dir/with/files"
while [ "$(ls -A $DIR)" ]; do
        php /path/to/php/script/myscript.php
done

Mein Ziel ist es nun, diese Bash-Speicherzuordnung zu begrenzen (Speicher und virtueller Speicher), um zu verhindern, dass das System hängen bleibt, wenn etwas schief geht.

Meine Frage lautet:
Wie kann ich den von diesem Shell-Skript verwendeten Speicher auf eine bestimmte Menge beschränken?


1
Bitte beachten Sie, dass Sie die Art und Weise, wie der Speicher zugewiesen wird, durch Ausführen ändern können export USE_ZEND_ALLOC=0.
Pedro Cordeiro

Antworten:


12

Sie können die Speichernutzung durch ein Bash-Skript einschränken, indem Sie die folgenden Schritte ausführen.

Begrenzen Sie die Speichernutzung um KB (in diesem Beispiel 2 GB):

ulimit -m 2048000

Beschränken Sie die Nutzung des virtuellen Speichers:

ulimit -v 2048000

Setzen Sie das Limit für den virtuellen Speicher auf ein hartes Limit, damit der Prozess abgebrochen wird, wenn dieses Limit überschritten wird:

ulimit -H -v

Ich denke, das kann machen, was du willst.


1
Zählt dieses Limit auch für untergeordnete Prozesse? Wenn ich beispielsweise in diesem Bash-Skript eine erlang REPL spawne, wird dann das Speicherlimit festgelegt?
Christophe De Troyer

2
@ChristopheDeTroyer Das Limit wird von untergeordneten Prozessen geerbt, sodass die untergeordneten Prozesse diesen Wert nicht überschreiten können. Diese Grenze wird jedoch nicht auf alle Prozessbäume angewendet.
Karikaturist
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.