我正在为嵌入式 Linux 开发 SW,我正遭受系统挂起,因为 OOM Killer 不时出现。在超越之前,我想解决一些关于 Linux 内核如何分配动态内存的令人困惑的问题,假设 /proc/sys/vm/overcommit_memory 有 0 并且 /proc/sys/vm/min_free_kbytes 有 712,并且没有交换。
如果我编写这段代码,假设嵌入式 Linux 当前可用的物理内存为 5MB(5MB 可用内存并且没有可用的缓存或缓冲内存):
.....
#define MEGABYTE 1024*1024
.....
.....
void *ptr = NULL;
ptr = (void *) malloc(6*MEGABYTE); //Preserving 6MB
if (!prt)
exit(1);
memset(ptr, 1, MEGABYTE);
.....
我想知道当提交 memset 调用时,内核是否会尝试在物理内存空间中分配 ~6MB 或 ~1MB(或 min_free_kbytes 倍数)。
现在我的嵌入式设备中大约有 9MB,它有 32MB RAM。我通过做检查它
# echo 3 > /proc/sys/vm/drop_caches
# free
total used free shared buffers
Mem: 23732 14184 9548 0 220
Swap: 0 0 0
Total: 23732 14184 9548
忘记最后一段C代码,我想知道当可用内存大约> 6MB时是否可能出现oom杀手。我想知道出现oom时系统是否内存不足,所以我想我有两个选择:
查看可疑进程的 /proc/pid/status 中的 VmRSS 条目。
设置 /proc/sys/vm/overcommit_memory = 2 和 /proc/sys/vm/overcommit_memory = 75 并查看是否有任何进程需要更多可用的物理内存。