Як накласти обмеження на пам'ять сценарію оболонки?


10

У мене є сценарій PHP, який, хоча папка містить XML-файли, обробляє їх у базі даних.

В даний час на сервері працює PHP версії 5.3.10 і є звіт про помилки щодо проблем із пам'яттю, викликаних ZEND_MM_HEAPв циклі.

Це призводить до того, що PHP не звільняє пам'ять належним чином, тим самим призводячи до помилок і збоїв сценарію:

 zend_mm_heap is corrupted

Деякі рішення знайдені, але я не маю доступу до налаштувань сервера.

Для вирішення цього питання я підготував наступний скрипт bash, щоб піклуватися про цикл, залишаючи сценарій PHP відповідальним лише за обробку 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

Моя мета зараз - обмежити розподіл пам’яті bash (пам'ять та віртуальна пам’ять), тим самим запобігаючи зависанню системи, якщо щось піде не так.

Моє запитання:
Як я можу обмежити пам'ять, яку використовує цей скрипт оболонки, певним обсягом?


1
Зверніть увагу, що ви можете використовувати зміни способу розподілу пам'яті, запустивши export USE_ZEND_ALLOC=0.
Педро Кордейро

Відповіді:


12

Ви можете обмежити використання пам'яті за допомогою сценарію Bash, виконавши наступне.

Обмежте використання пам'яті на кб (2 Гб у цьому прикладі):

ulimit -m 2048000

Обмежити використання віртуальної пам'яті:

ulimit -v 2048000

Встановіть обмеження віртуальної пам’яті як жорсткий ліміт, щоб цей процес був убитий при перевищенні цього ліміту:

ulimit -H -v

Я думаю, що це може робити те, що ти хочеш.


1
Чи враховується ця межа і для дитячих процесів? Наприклад, якщо я породжую Erlang REPL у цьому скрипті bash, чи буде накладено обмеження на пам'ять?
Крістоф Де Троєр

2
@ChristopheDeTroyer Ліміт буде успадкований дочірніми процесами, тому дочірні процеси не можуть перевищувати це. Але цей ліміт не застосовуватиметься до всього дерева процесів.
мультфільм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.