Ограничить доступную память для программы - PullRequest
1 голос
/ 31 марта 2020

Я выполняю анализ производительности многопоточной программы, которая использует всю память, доступную в системе. Моя ОС - Ubuntu 18.04. Я пытаюсь ограничить доступную память, например, до 32 ГБ, даже если на моем сервере доступно 128 ГБ памяти. Не удалось найти надежного решения. Похоже, ulimit не совсем то, что я ищу. Я также могу засорить память другим процессом (например, контролируемым процессом, который будет использовать 64 ГБ ОЗУ). Но даже для этой цели я не уверен, как надежно засорить память.

Буду признателен за ваши мысли.

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

cgroups - это особенность или современные ядра linux, которые позволяют ограничивать ресурсы, такие как память, для группы процессов (или для одного процесса с потоками). Подробнее о cgroups: https://en.wikipedia.org/wiki/Cgroups https://man7.org/linux/man-pages/man7/cgroups.7.html

Функция cgroups должна быть уже включена в ваших ядрах Ubuntu 18.04. Существует несколько описаний использования cgroups для ограничения памяти:

# Create a group for memory named “limited_group_1”
cgcreate -g "memory:limited_group_1" -t USERNAME:GROUPNAME

# Specify memory limit to 1G for this group
cgset -r memory.limit_in_bytes=1G "limited_group_1"

# Launch the application in this group
cgexec -g "memory:limited_group_1" ./YOUR_APPLICATION

# If needed, we can remove the group
cgdelete "memory:limited_group_1"

https://unix.stackexchange.com/questions/44985/limit-memory-usage-for-a-single-linux-process/279175#279175 также упоминалось в https://dev.to/vga/how-to-see-and-limit-memory-consumption-of-an-application-5bfl

PS: Распределители памяти по умолчанию в более старых версиях glib c ( malloc, new) имеет ужасное поведение для освобожденных областей: они не возвращаются обратно без периодических c malloc_trim() библиотечных вызовов. Вы должны попытаться связать ваше приложение с libjemallo c или libtcmallo c, который заменит mallo c реализацию glib c некоторым кодом, лучше возвращаемым в память.

0 голосов
/ 31 марта 2020

ulimit ограничит память процесса, а не системную память.

Добавьте mem = 32G в командную строку ядра при загрузке, если вы хотите точно симулировать меньшую машину.

...