在Linux系统中,OOM(Out Of Memory)Killer是一种机制,当系统内存不足时,它会自动选择并终止某些进程以释放内存。虽然通常情况下,我们不希望手动触发OOM Killer,但在测试或调试场景下,可能需要模拟这种状态来验证系统的健壮性或特定配置的有效性。
OOM Killer根据一系列指标来决定终止哪个进程,这些指标包括但不限于:
首先,可以通过调整内核参数vm.overcommit_memory
和vm.overcommit_ratio
来改变内存分配策略,使得系统更容易进入内存不足的状态。
vm.overcommit_memory
有三种模式:
要设置为模式1,可以执行以下命令:
echo 1 > /proc/sys/vm/overcommit_memory
此外,可以通过修改vm.overcommit_ratio
来进一步控制内存过量使用的比例。例如,将该值设置为50表示只能过量使用50%的可用内存:
echo 50 > /proc/sys/vm/overcommit_ratio
接下来,编写一个简单的C程序来快速消耗大量内存,从而触发OOM Killer。
#include <stdio.h>
#include <stdlib.h>
int main() {
int i = 0;
while (1) {
void *p = malloc(1024 * 1024); // 每次分配1MB内存
if (p == NULL) {
printf("Memory allocation failed at iteration %d\n", i);
break;
}
memset(p, 0, 1024 * 1024); // 防止内存页面未真正分配
printf("Allocated %d MB\n", ++i);
}
return 0;
}
编译并运行此程序:
gcc -o consume_memory consume_memory.c
./consume_memory
随着程序不断分配内存,系统最终会变得内存不足,此时OOM Killer会被触发,可能会终止这个内存消耗程序或者系统中其他占用内存较多的进程。
OOM Killer的动作会被记录到系统日志中,可以通过查看dmesg
输出来了解哪些进程被终止了:
dmesg | grep -i "killed process"