配置 systemd 以占用内存:
$ grep Memory /etc/systemd/system.conf
DefaultMemoryAccounting=yes
编写一个分配 100M 空间的小可执行文件:
$ cat test.c
#include <stdlib.h>
#include <stdio.h>
int main() {
void *ptr = malloc(100 * 1024 * 1024); // Allocating 100M
if (ptr == NULL) {
printf("ptr NULL\n");
} else {
printf("ptr allocated\n");
free(ptr);
}
}
但以 10M 限制运行似乎没问题:
$ systemd-run --scope -p MemoryMax=10M -p MemorySwapMax=10M -p MemoryLimit=10M --user ./test
Running scope as unit: run-r9e69896461b94a5f8ab68df8e34bee73.scope
ptr allocated
这是预期的行为吗?或者也许我错过了配置中的某些内容。
答案1
内存限制适用于实际内存使用,而不仅仅是分配。尝试
#include <stdlib.h>
#include <stdio.h>
int main() {
char * ptr = malloc(100 * 1024 * 1024); // Allocating 100M
if (ptr == NULL) {
printf("ptr NULL\n");
} else {
printf("ptr allocated\n");
for (int i = 0; i < 100 * 1024 * 1024; i++) ptr[i] = ' ';
free(ptr);
}
}
你会看到程序被杀死。