Почему `ulimit` не ограничивает использование памяти, как я ожидаю?

Почему `ulimit` не ограничивает использование памяти, как я ожидаю?

Я пытаюсь ограничить использование памяти процессом

$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=200Mto systemd-runoptions, если хотите заставить программу снизить потребление памяти, не убивая ее. Однако имейте в виду, что превышение этого MemoryHighзначения значительно замедлит процесс, потому что ядро ​​будет выполнять дополнительную работу по освобождению всей памяти (включая кэши) от этого процесса, чтобы уменьшить использование памяти. Во многих случаях вам это не нужно, если вы хотите принудительно установить максимальный предел.

Связанный контент