Тестирую код, жрущий много памяти. Память жрётся по 2м направлениям: анонимные аллокации и shared через mmap 17GB файла с MADV_WILLNEED.
Хочу протестировать скорость, как если бы памяти на хосте было 10GB. На машине реально 32GB + 11GB swap.
Беру systemd-run, пробую:
$ systemd-run --user --scope -p MemoryMax=1G -p MemoryHigh=1G -p MemorySwapMax=0 ./memory_hungry_app
...
Killed
Ок, значит какое-то ограничение отрабатывает. Пробую 10G:
$ systemd-run --user --scope -p MemoryMax=10G -p MemoryHigh=10G -p MemorySwapMax=0 env time -v ./memory_hungry_app
...
Maximum resident set size (kbytes): 18529480 (18GB)
Может prlimit?
$ prlimit -m=1073741824 prlimit
...
RSS max resident set size SOFT:1073741824 HARD:1073741824 bytes
$ prlimit -m=1073741824 env time -v ./memory_hungry_app
...
Maximum resident set size (kbytes): 20522316
Т.е. эти утилиты не учитывают SHR в своих ограничениях. А хочется, чтобы системный кеш шаренных страниц этого процесса освобождался до пределов в 10GB.
Прочитанные мануалы:
man 5 systemd.resource-control
– вроде нет других Memory;man 2 getrlimit
– RLIMIT_RSS: This limit has effect only in Linux 2.4.x, x < 30, and there affects only calls to madvise(2) specifying MADV_WILLNEED";
Какую ещё тулзу к cgroups попробовать? Хочется, чтобы без редактирования конфигов и контейнеров.