7

При написании программы бывают случаи, когда сбегающая программа отбрасывает половину моей оперативной памяти (как правило, из-за практически бесконечных циклов при создании больших структур данных) и приводит к тому, что система становится действительно медленной, что я даже не могу уничтожить вызывающей программу. Поэтому я хочу использовать ulimit для автоматического уничтожения моей программы, когда моя программа использует ненормальный объем памяти:

$ ulimit -a
core file size          (blocks, -c) 1000
data seg size           (kbytes, -d) 10000
scheduling priority             (-e) 0
file size               (blocks, -f) 1000
pending signals                 (-i) 6985
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) 10000
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 6985
virtual memory          (kbytes, -v) 100000
file locks                      (-x) unlimited
$ ./run_program

но почему моя программа все еще использует больше оперативной памяти, чем заданный предел (да, я запускаю программу в той же оболочке bash)?

Я что-то не так понял насчет ulimit?

2 ответа2

4

Ваш пример должен работать так, как вы думаете (программа будет убита после использования слишком большого количества оперативной памяти). Я только что провел небольшой тест на моем сервере оболочки:

Сначала я ограничил свои лимиты ДЕЙСТВИТЕЛЬНО низким:

ulimit -m 10
ulimit -v 10

Это приводит к тому, что обо всем убивают. ls , date и другие маленькие команды будут сняты до того, как они начнутся.

Какой дистрибутив Linux вы используете? Ваша программа использует только один процесс или порождает тонны дочерних процессов? В последнем случае ulimit не всегда может быть эффективным.

1

Это работает только в одном сеансе bash, если вы не поместите его в свой .bash_profile, и не будет применяться к уже запущенным процессам.

Что я нахожу странным, так это то, что:

 max memory size         (kbytes, -m) unlimited

отсутствует в /etc/security/limits.conf, хотя это только ограничивает потребление памяти на процесс, но не в целом для 1 учетной записи пользователя. Вместо того, чтобы добавлять Cgroup, они должны просто изменить существующие команды Unix, чтобы приспособить эти новые функции.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .