我使用的是 Debian Bullseye(因此是cgroups
v2,据我所知),我正在尝试使用它systemd-run
来限制进程的内存使用。我需要在内存不足时杀死该进程(我正在设置一些基准)。
这是测试程序:
#include <stdio.h>
#include <stdlib.h>
int main() {
const size_t size = 1024 * 1024 * 1024;
int *buffer = (int*)malloc(size * sizeof(int));
int v = 0;
for(size_t i = 0; i < size; ++i) {
buffer[i] = v++;
}
printf("Hello\n");
while(1);
return 0;
}
它分配 4Gb 内存并进行无限循环。为了确保页面确实被分配(我不知道这是否重要),程序在分配后在内存上写入。
我尝试按systemd-run
如下方式运行它:
$ systemd-run --quiet --user --scope -p MemoryMax=500M ./test
然而,该程序打印Hello
并没有被杀死。
我究竟做错了什么?
答案1
我需要添加参数MemorySwapMax
来为交换使用提供零限制,否则程序将使用交换空间来克服该MemoryMax
参数。
正确的命令行如下:
$ systemd-run --quiet --user --scope -p MemoryMax=500M -p MemorySwapMax=0 ./test