Как ограничить использование памяти приложения?

10

Я потратил 2 часа на чтение вопросов по этому вопросу, и все же есть некоторые недоразумения.

У меня есть этот процесс:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND    
root 1452 0.4 1.8 1397012 19308 ? Sl 04:23 3:48 ./transaction_server

Это показывает, что он использует 19.3Mbсистемную резидентную память (у меня нет файла подкачки), вокруг 1.8%всей 1GBсистемной памяти. Виртуальный размер есть 1.39GB?!?. Я читал, что ulimit -mэто не работает. Люди используют, ulimit -vнапример, настройку виртуальной памяти для процесса. Является ли эта виртуальная память той, в которой находится VSZ ps? Какое значение я должен установить, если я хочу ограничить этот процесс, чтобы 100MBмаксимально использовать системную память. Я прочитал документацию для, setrlimitи это кажется законным:

RLIMIT_AS
        This  is  the maximum size of a process' total available memory, 
        in bytes. If this limit is exceeded, the malloc() and mmap() 
        functions shall fail with errno set to [ENOMEM]. In addition, 
        the automatic stack growth fails with the effects outlined above.

Но в других версиях документации этот RLIMIT_ASпараметр устанавливает размер виртуальной памяти. Что правда?

Драгомир Иванов
источник
Пожалуйста, обратите внимание на форматирование постов.
rozcietrzewiacz

Ответы:

6

Да, VSZ - это виртуальная память. Что касается RLIMIT_AS, где вы нашли приведенный выше абзац? Поскольку setrlimit (2) является системным вызовом Linux, я не понимаю, как он мог бы контролировать malloc (3), библиотечную функцию. Вместо этого он может работать только с brk (2), sbrk (2) и mmap (2) - это также то, что предлагает его man-страница (проверенная Scientific Scientific). Однако общий объем памяти, запрашиваемый этими функциями, составляет виртуальную память, поэтому RLIMIT_AS действительно ограничивает виртуальную память. (Это опять же в соответствии с man-страницей setrlimit (2).)

К сожалению, вы не можете ограничить RSS под Linux (это будет ulimit -m). Вы можете попробовать ulimit -d(RLIMIT_DATA), но это будет игнорировать mmap (2), обычно используемый для больших выделений. Другой возможностью было бы ограничение виртуальной памяти, но с такой большой разницей между RSS и VSZ это может быть сложно.

Ансгар Эстерманн
источник
Спасибо за ваш ответ. Этот абзац взят со setrlimitстраницы руководства. IEEE/The Open Group 2003 GETRLIMIT(3P)Почему я psмогу показать RSS, но ядро ​​не может установить для него ограничение?
Драгомир Иванов
6
По словам Алана Кокса, на это есть исторические причины: вычисление RSS раньше было дорогостоящим, поэтому соблюдение этого ограничения привело бы к большой нагрузке на ядро; источник: linux.derkeiler.com/Mailing-Lists/Kernel/2006-01/msg03306.html . См. Также stackoverflow.com/questions/3043709/…
Ansgar Esztermann
Понимаю. Я думаю, я бы пошел с ulimit -dтогда. Приложение написано мной, а я не пользовался mmap().
Драгомир Иванов
2
Нет, вы обычно этого не делаете (ни sbrk ()), но malloc () может.
Ансгар Эстерманн
Понимаю. Это очень неудачно. Таким образом, решение этого вопроса - cgroups или опрос использования памяти с использованием некоторого языка сценариев.
Драгомир Иванов
3

Многие процессы разделяют часть своей памяти с другими процессами, например, libc используется почти каждым процессом, но отображается в памяти только один раз, но это учитывает использование виртуальной памяти каждым процессом. Ограничение использования памяти, которая используется только определенным процессом (главным образом RSS), может быть сделано с помощью cgroups. См. Ответы на Как ограничить общие ресурсы (память) процесса и его потомков, как это сделать. Это ограничит общую память процесса и его дочерних элементов.

JanKanis
источник