Jak nałożyć ograniczenia pamięci na skrypt powłoki?

10

Mam skrypt PHP, który choć folder zawiera pliki XML, przetwarza je w bazie danych.

Obecnie na serwerze działa PHP w wersji 5.3.10 i jest raport o błędzie dotyczący problemów z pamięcią wywoływanych przez ZEND_MM_HEAPpętlę.

To powoduje, że PHP nie zwalnia prawidłowo pamięci, co prowadzi do błędu i awarii skryptu:

 zend_mm_heap is corrupted

Znaleziono kilka rozwiązań , ale nie mam dostępu do ustawień serwera.

Aby temu zaradzić, przygotowałem następujący skrypt bash do obsługi pętli, pozostawiając skrypt PHP odpowiedzialny tylko za przetwarzanie pliku XML:

#!/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

Moim celem jest teraz ograniczenie tego przydziału pamięci bash (pamięć i pamięć wirtualna), aby zapobiec zawieszeniu się systemu, jeśli coś pójdzie nie tak.

Moje pytanie brzmi:
jak mogę ograniczyć pamięć używaną przez ten skrypt powłoki do określonej ilości?

Zuul
źródło
1
Pamiętaj, że możesz zmienić sposób przydzielania pamięci przez uruchomienie export USE_ZEND_ALLOC=0.
Pedro Cordeiro,

Odpowiedzi:

12

Możesz ograniczyć użycie pamięci za pomocą skryptu Bash, wykonując następujące czynności.

Ogranicz użycie pamięci o kb (2 GB w tym przykładzie):

ulimit -m 2048000

Ogranicz użycie pamięci wirtualnej:

ulimit -v 2048000

Ustaw limit pamięci wirtualnej na twardy, aby proces został zabity po przekroczeniu tego limitu:

ulimit -H -v

Myślę, że to może zrobić, co chcesz.

Octávio Filipe Gonçalves
źródło
1
Czy ten limit ma również znaczenie dla procesów potomnych? Na przykład, jeśli odrodzę erlang REPL w tym skrypcie bash, czy zostanie narzucony limit pamięci?
Christophe De Troyer
2
@ChristopheDeTroyer Limit zostanie odziedziczony przez procesy potomne, więc procesy potomne nie mogą go przekroczyć. Ale ten limit nie zostanie zastosowany do całego drzewa procesów.
rysownik