Fedora 20 memory.limit_in_bytes не работает

Fedora 29 (ядро 3.15.10-201.fc20.x86_64) Это работало в F19.

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

У меня это в файле /etc/cgconfig.conf :

 group memtest { memory { memory.limit_in_bytes = "209715200"; memory.soft_limit_in_bytes = "104857600"; } } 

и это в /etc/cgrules.conf :

 *:memtest memory memtest/ 

Файл memtest.c просто malloc 1GiB, спит в течение 30 секунд, а затем освобождает буфер и завершает работу.

Когда программа memtest запущена, ее PID правильно указан в /sys/fs/cgroup/memory/memtest/tasks , показывая, что он классифицируется правильно. Однако использование памяти не ограничено.

Использование ulimit поведение как и ожидалось:

 $ (ulimit -S -v 200000 ; ./memtest ) malloc failed: Cannot allocate memory 

Вот источник memtest.c :

 #include <errno.h> #include <stdlib.h> #include <stdio.h> #include <unistd.h> main() { char *buf; size_t bytes = (1 * 1<<30); errno = 0; buf = malloc(bytes); if (errno != 0) { int errno_copy = errno; perror("malloc failed"); return errno_copy; } printf("%d bytes allocated (requested %d)\n", malloc_usable_size(buf), bytes); sleep(30); printf("Freeing..\n"); free(buf); return 0; } 

Почему задача становится правильно классифицированной, но не ограничиваясь ею в использовании памяти? Что изменилось между F19 и F20? (На прошлой неделе я обновил только до F20).

Благодаря!

На первый взгляд, единственное, о чем я могу думать, это то, что где-то вдоль обработки строки (по системе) cgconfig.conf стало более жестким. Вместо определения пределов в качестве строки с кавычками, что произойдет, если вы удалите кавычки. Итак, что-то вроде:

 group memtest { memory { memory.limit_in_bytes = 209715200; memory.soft_limit_in_bytes = 104857600; } } 

После созерцания я думаю, что memory.limit_in_bytes ограничивает только физическую память пользователя, но позволяет использовать swap. Возможно ли, что все, что вам нужно сделать, – установить memory.memsw.limit_in_bytes на то же значение, что и memory.limit_in_bytes что-то вроде:

 group memtest { memory { memory.limit_in_bytes = 209715200; memory.memsw.limit_in_bytes = 209715200; memory.soft_limit_in_bytes = 104857600; } } 

memory.memsw.limit_in_bytes включает в себя память пользователя и своп. Итак, если вы хотите 0 swap-пространства, тогда нужно установить memory.memsw.limit_in_bytes равным memory.limit_in_bytes

Когда вы делаете ulimit -S -v 200000 который ограничивает виртуальную память (swap, shared data, AND physical ram) до определенной суммы, поэтому вашему приложению не будет достаточно места. Однако обычные системные настройки, которые у вас были, не ограничивали пространство подкачки, поэтому у него, вероятно, было достаточно места для использования максимальной пользовательской памяти + плюс неиспользуемое пространство подкачки.

Если бы вы перевернули swap (и не использовали ulimit) перед выполнением тестов, я бы ожидал, что ваша программа не сможет выделить запрошенную память.