Что в действительности контролирует $wgMaxShellMemory в MediaWiki?
Мой главный вопрос: ограничивает ли wgMaxShellMemory общий объем памяти, используемый всеми процессами для задач оболочки, таких как создание эскизов ImageMagick? Или это скорее ограничение на процесс? Документация для этого параметра кажется расплывчатой.
У меня есть вики, которая использует слишком много памяти на общем хосте. Я сузил виновника до ImageMagick, используя слишком много памяти при преобразовании загруженных изображений. Я уменьшил максимальный размер загрузки в php.ini, что поможет, но я надеялся, что wgMaxShellMemory послужит жестким ограничением общего использования памяти ImageMagick и другими фоновыми процессами MediaWiki.
В качестве идентификатора я также не смог выяснить из документации, является ли преобразование изображений частью очереди заданий, что позволило wgJobRunRate замедлить создание миниатюр.
1 ответ
Во-первых, ограничение памяти относится только к GNU/Linux, но не к Windows.
Краткий ответ: это ограничение для каждого сценария bash, которое, вероятно, (это верно для "своих" дочерних систем, и в других случаях это ограничение не очень эффективно) также применяется к дочерним процессам. Таким образом, каждый вызов ImageMagick получает свой отдельный лимит.
Создание миниатюр для изображений не является частью очереди заданий (мультимедиа, такие как видео, это другой вопрос).
Подробности:
По умолчанию это работает так:
- Когда вызывается wfShellExec, он создает новый процесс bash с proc_open.
- Это запускает скрипт bash с именем limit.sh.
- Этот новый процесс bash устанавливает предел памяти (wgMaxShellMemory), используя
ulimit -v
, - Затем процесс bash запускает желаемую команду с помощью /usr/bin/timeout (если есть также предел настенных часов) или eval.
Страница man для bash ulimit гласит: "-v" - это "Максимальный объем виртуальной памяти, доступной оболочке и, в некоторых системах, ее дочерним элементам".
ПРИМЕЧАНИЕ. Существует возможность использовать cgroups, но по умолчанию она отключена.