设为首页 收藏本站
查看: 920|回复: 1

[经验分享] Linux内核OOM机制的详细分析

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2013-8-9 08:41:59 | 显示全部楼层 |阅读模式

Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。典型的情况是:某天机器突然登不上了,能ping通,但是ssh死活连不了。原因是sshd进程被OOM killer杀掉了(多次遇到这样的假死状况)。重启机器后查看系统日志会发现Out of Memory: Killed process ×××的错误提示。


防止关键进程被系统因内紧张(OOM)被杀死:设置参数/proc/pid/oom_adj为-17,可禁止被系统内核杀掉。内核会通过特定的算法给每个进程计算一个分数来决定杀哪个进程,每个进程的oom分数可以/proc/pid/oos_score中找到。我们运维过程中保护的一般是sshd和一些管理agent。


保护某个进程不被内核杀掉可以这样操作:

[backcolor=white !important]
[Shell] 纯文本查看 复制代码
1
echo -17 > /proc/$PID/oom_adj
如何防止sshd被杀,可以这样操作:
pgrep -f"/usr/sbin/sshd"|while read PID; do echo-17 > /proc/$PID/oom_adj;done
可以在计划任务里加入这样一条定时任务,就更安全了:
#/etc/cron.d/oom_disable
*/1**** root pgrep -f"/usr/sbin/sshd"|while read PID;do echo -17> /proc/$PID/oom_adj;done




至于为什么用-17而不用其他数值(默认值为0,即默认使用OOM机制),这个不是我定义的,而是linux内核定义的,以下是代码可知:

文件是以linux-3.3.6版本的kernel源码为例,路径为linux-3.6.6/include/linux/oom.h

235227687.jpg

有些朋友可能没遇到过,到底真的存不存在OOM机制呢?不妨测试给大家看看吧。

首先看看我系统现有内存大小,没错96G多,物理上还要多一些,不要羡慕,呵呵

001323397.jpg


再看看目前进程最大的有哪些,top查看,我目前只跑了两个java程序的进程,分别4.6G,再往后redis进程吃了21m,iscsi服务占了32m,gdm占了25m,其它的进程都是几M而已了。

000408383.jpg

现在我自己用C写一个叫bigmem程序,我指定该程序分配内存85G,呵呵,效果明显,然后执行后再用top查看,排在第一位的是我的bigmem,RES是物理内存,已经吃满了85G。

001401735.jpg

继续观察,当bigmem稳定保持在85G一会后,内核会自动将其进程kill掉,增长的过程中没有被杀,如果不希望被杀可以执行

[backcolor=white !important]
[backcolor=white !important][size=1em]1

[size=1em][backcolor=white !important][size=1em]pgrep -f "bigmem" | while read PID; do echo -17 > /proc/$PID/oom_adj;done



执行以上命令前后,明显会对比出效果,就可以体会到内核OOM机制的实际作用了。


PS:kernel-2.6.26之前版本的oomkiller算法不够精确,RHEL 6.x版本的2.6.32可以解决这个问题。

祝大家玩的开心,晚安!



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-8262-1-1.html 上篇帖子: linux redhat配置yum源为网易(163)源的方法 下篇帖子: grep使用简明及正则表达式 Linux

尚未签到

发表于 2013-11-29 00:57:19 | 显示全部楼层
你都好意思和我分手,我有什么不好意思在你背后给你一刀呢

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表