cgroup&&oom使用

背景:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值