背景:
execve中循环调用malloc,会出现以下三种情况:
1、execve失败
2、触发oom,进程被杀死
3、触发panic,单板重启
结论:
1、execve失败是由于malloc的空间大小过大,导致直接分配错误
2、/proc/sys/vm/panic_on_oom设置为0,会触发oom,killer杀死bad process
3、/proc/sys/vm/panic_on_oom设置为1,会直接触发panic
知识点:
1、malloc分配了就一定可用吗? 不是
以下是malloc的官方文档介绍。
默认情况下,linux会遵循一种乐观的内存分配策略。**当malloc返回非NULL时并不能保证内存是可用的。**为了防止内存不足,OOM killer会杀死进程。
By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available. In case it turns out that the system is out of memory, one or more processes will be killed by the OOM killer.
overcommit原理:overcommit表示允许程序申请比系统可用内存更多的内存。不是所有程序申请完内存就立即使用,当使用的时候系统已经回收了一些资源。但是,当用到overcommit给的内存时,系统还是没有空闲内存资源时就会触发oom机制。
例子:当malloc分配MemFree+CommitLimit大小的空间时会直接返回NULL,表示没有内存进行分配
2、panic_on_oom参数
https://sysctl-explorer.net/vm/panic_on_oom/
(1)设置为0(default):调用oom_killer,杀死进程,系统恢复;
(2)设置为1:oom发生后触发panic;但是如果进程通过mempolicy/cpusets限制使用节点,并且这些节点变成内存耗尽状态,那么进程会被oom_killer杀死。在这种情况下不会触发panic。
(3)设置为2:即使发生在cgroup下也会触发panic
3、使用cgroup限制内存
1、centos安装libcgroup和libcgroup-tools,其他os见此链接
https://command-not-found.com/cgexec
2、指定cgroup运行程序cgexec -g memory:xxx ./a.out
具体操作参考此链接
https://blog.csdn.net/u012375924/article/details/78180722?utm_source=app&app_version=4.11.0