Я пытаюсь ограничить использование памяти процессом
$ulimit -m 2
$/usr/bin/time -l ./myProcess arg1 arg2
Процесс выполняется без остановки до тех пор, пока не time
появятся выходные данные
7.00 real 4.83 user 2.16 sys
4154855424 maximum resident set size
0 average shared memory size
0 average unshared data size
0 average unshared stack size
1014384 page reclaims
0 page faults
0 swaps
0 block input operations
2 block output operations
0 messages sent
0 messages received
0 signals received
0 voluntary context switches
15 involuntary context switches
показывая, что предел был превышен, несмотря на ulimit -m 5
командную строку. Я также пробовал параметры -v
, -l
но ни один из них, похоже, на самом деле не ограничивает использование памяти. Я также пробовал с, time
чтобы убедиться, что он не упустит возможность увидеть использование памяти подпроцессом. Вот все пределы после использования all -m
, -v
и-l
$ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 3
max memory size (kbytes, -m) 2
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) 2
Если я ограничиваю время ЦП ( ulimit -t 3
), то все работает нормально и процесс завершается через 3 секунды.
Вопрос
Я что-то не понимаю ulimit -m 5
? Может, в моей версии ulimit есть ошибка?
Есть ли альтернатива ulimit
ограничению времени и использования памяти процессом (не обязательно сеансом bash)?
Версии
Я нахожусь на MAC OSX 10.11.6
и bash version 3.2.57
.
Связанный пост
Пост "ulimit не ограничивает использование памяти"очень похоже, но я не думаю, что принятый ответ предлагает какое-либо решение проблемы
решение1
С современными ядрами Linux ulimit
становится все менее и менее значимым с каждым релизом. Вы действительно не можете использовать, -v
потому что ваша версия glibc может предпочесть загрузку файлов с помощью, mmap()
поэтому вам нужно установить -v
достаточно большое значение, чтобы включить все файлы, которые процесс собирается открыть. В результате флаг -v
нельзя использовать для ограничения использования физической оперативной памяти.
Кроме того, этот -m
флаг ничего не делает, поэтому его нельзя использовать для ограничения использования физической памяти.
В настоящее время приходится использовать cgroups
интерфейс к ядру, чтобы ограничить использование физической памяти, но API немного сложно использовать, к сожалению. Возможно, однажды у нас будет какой-то процесс, похожий на nice
и ionice
который сможет ограничивать память для процесса, заданного в качестве параметра.
Теоретически, с достаточно недавними обновлениями systemd
вы сможете сделать что-то вроде
systemd-run --scope --user -p MemoryMax=250M -- /path/to/program/to/use
и это должно волшебным образом работать. Нет никаких технических причин, по которым это не работает (потому что базовая cgroup
функция Linux поддерживает требуемые вещи), но некоторые systemd
версии просто молча откажут и фактически не ограничат использование памяти. Вы также можете добавить что-то вроде -p MemoryHigh=200M
to systemd-run
options, если хотите заставить программу снизить потребление памяти, не убивая ее. Однако имейте в виду, что превышение этого MemoryHigh
значения значительно замедлит процесс, потому что ядро будет выполнять дополнительную работу по освобождению всей памяти (включая кэши) от этого процесса, чтобы уменьшить использование памяти. Во многих случаях вам это не нужно, если вы хотите принудительно установить максимальный предел.