范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

为什么我的进程被kill掉了

  先来看段代码:
  这段代码非常简单,就是先用mmap的方式,为该进程分配10GiB的虚拟内存,然后再用page写的方式,让操作系统为这10GiB虚拟内存,分配对应的物理内存,最后sleep,等待我们测试。
  运行下:
  没啥问题,和我们预期的一样,正常执行。
  打开另一个终端,执行以下命令,看下它的内存占用:
  上图中的VSZ指的是虚拟内存,RSS指的是物理内存,单位都是KiB,所以该进程虚拟内存和物理内存的使用,都约等于10GiB,没问题。
  我们再开个终端,再执行下这个程序:
  第二次执行这个程序也没问题,但奇怪的是,此时第一次执行的那个程序却被kill掉了:
  这是为什么呢?
  上面我们说到,该程序的逻辑是分配10GiB的物理内存,所以运行两次,也就是要分配20GiB的物理内存。
  但在我们的测试机器上,物理内存一共才16GiB,所以,运行两个这样的进程肯定是不行的。
  在第二次执行该程序,且向操作系统申请物理内存时,操作系统会发现,物理内存已经没有了。
  此时,为了防止整个系统crash掉,linux内核会触发 OOM/Out of Memory killing 机制,即按照一定的规则选择一个进程,将其kill掉,以便回收物理内存,以此来保证机器整体的稳定运行。
  同时,该kill事件,也会被记录到内核日志中,且可通过dmesg命令等方式查看。
  比如上面第一个进程被kill掉的事件记录如下:
  看上面红色字体行,该行是说,进程14134因为out of memory被linux内核kill掉了,该进程正是上面我们第一次执行的那个程序。
  linux内核的oom killing机制,其实是一种弃车保帅的做法,因为如果我们不kill掉某进程,来释放物理内存的话,那很有可能会导致后续系统级别的crash,两害相权取其轻,操作系统只能这样处理,归根结底,是我们对进程使用物理内存的规划不足,才导致了这种情况。
  那为什么不在第二次执行该程序时,在调用mmap分配虚拟内存时就直接报错,返回无法分配内存呢?
  这是因为,经过多年观察,linux内核的开发人员发现,绝大部分程序在分配了很大的虚拟内存之后,在大部分时间里,并不会一直使用这么多的物理内存。
  所以,为了更合理更高效的利用物理内存资源,linux内核允许虚拟内存的overcommit,即,例如在上面执行mmap分配虚拟内存时,linux内核并不会严格检查,所有运行中的进程分配的虚拟内存加起来,是否超过了整个物理内存大小。
  这也就解释了为什么上面第二次运行该程序时,mmap是没有报错的。
  但是,虽然mmap的虚拟内存分配成功了,但当真正使用该内存时,比如上面的写内存,此时要分配物理内存,则是有可能失败的,因为虚拟内存的overcommit,很可能导致后续的物理内存不足。
  如果真的发生了这种情况,就会触发linux内核的oom killing机制,即linux内核中的oom killer会按一定的规则,选一个进程,将其kill掉,这个上面我们已经演示过了。
  那为什么不kill掉第二个进程,而是kill掉第一个呢?
  这个和linux内核中oom killer的选择策略有关,我们直接看源码:
  当进程请求操作系统为其分配物理内存时,如果此时物理内存已经没有了,则会触发上图中的out_of_memory函数。
  该函数中,会使用select_bad_process选择要被kill掉的进程,然后使用oom_kill_process将其kill掉,来释放物理内存。
  在看select_bad_process之前,我们先看下oom_kill_process:
  该函数调用了__oom_kill_process:
  在上面的函数中,通过向victim进程发送SIGKILL这个signal(我们平时使用的kill -9命令,就是用的这个signal),将其kill掉,然后该kill事件,会被记录到内核日志中。
  注意,这里记录的日志格式,正好和我们上面用dmesg输出的,14134进程被kill掉事件日志格式完全一样。
  kill掉进程的过程就是这样,我们再来看下select_bad_process函数是如何选择要被kill掉进程的:
  在该函数中,会遍历系统中的所有进程,然后使用oom_evaluate_task这个函数,对各个进程进行评估:
  oom_evaluate_task函数中,会使用oom_badness,计算某进程badness的点数,点数越高,越容易被kill掉。
  如果badness的点数是LONG_MIN这个特殊值,则直接跳过该进程,即该进程不会成为被kill掉的对象,如果badness点数小于之前选择进程的badness点数,同样也跳过该进程,即被kill掉的进程badness点数要是最大的。
  遍历中选择的进程,及其badness的点数,会被赋值到oc->chosen和oc->chosen_points里,oc->chosen最终指向的进程,就是上面oom_kill_process里kill掉的进程。
  我们再来看下badness点数是如何计算的:
  该函数主体逻辑分成两部分,一部分是,在某些情况下,该进程的badness点数直接返回LONG_MIN,即不会被kill掉。
  这些情况包括,oom_score_adj的值为OOM_SCORE_ADJ_MIN,即-1000,或者该进程已经在被kill的过程中了,或者该进程在vfork过程中。
  该函数逻辑的另外一部分就是计算进程的badness点数,其大致计算规则为:
  points = 该进程占用的物理内存总数 + 总物理内存 * oom_score_adj值的千分比。
  oom_score_adj的值,是进程独有的,是可以通过写 /proc/[pid]/oom_score_adj 的方式调整的,取值范围为 -1000 到 1000。
  该值越大,进程总的badness点数就会越大,进程也就越容易被kill掉。
  该值越小,进程总的badness点数就会越小,该进程也就越不容易被kill掉。
  上面我们还提到oom_score_adj有一个特殊值为OOM_SCORE_ADJ_MIN,即-1000,表示该进程不能被kill掉。
  各进程的oom_score_adj的值默认为0。
  综上可知,linux内核中oom killer选择被kill进程的方式,就是看各进程badness点数的大小。
  默认情况下,因为各进程的oom_score_adj的值都为0,所以进程占用的物理内存越大,其badness点数也就越大,其也就越容易被kill掉。
  这也就解释了,为什么上面在第二次执行那个程序时,被kill掉的是第一次执行的那个进程,而不是第二次执行的进程,因为第一次执行的那个进程,占用的物理内存更大。
  其实,调整linux内核中oom killer行为的方式有很多,不止修改oom_score_adj值这一种方法。
  比如,通过修改 /proc/sys/vm/panic_on_oom 的值,可以让整个系统在物理内存不够时,直接panic,而不是选择性的kill掉某个进程。
  比如,通过修改 /proc/sys/vm/overcommit_memory 的值,可以使上面第二次执行的测试程序,在使用mmap分配虚拟内存时,就直接报错,说内存不够。
  比如,通过修改 /proc/[pid]/oom_adj 值的方式,同样可以达到修改 /proc/[pid]/oom_score_adj 的目的,不过这个在内核2.6.36版本之后已经不推荐使用。
  oom killer行为调整的相关参数,其具体详解可以看proc的man文档:
  https://man.archlinux.org/man/proc.5
  聊了这么多,那理解linux内核的oom killer机制,对于我们实际应用有哪些帮助呢?
  我们假设以下场景:
  假如,我们有一台机器,上面跑着一个非常重要的服务,比如数据库,或者某个应用进程等。
  它非常耗内存,但是正常情况下,它使用的物理内存肯定不会高于实际总物理内存大小。
  有一天我们需要在这台机器上执行一项任务,如果这个任务也比较耗内存,那很可能在执行这项任务时,整台机器的物理内存就完全不够用了,此时,就会触发linux内核的oom killing机制。
  又因为在不调整oom_score_adj值的情况下,linux内核中的oom killer默认kill掉的,就是占用物理内存最多的那个进程,一般来说,就是我们数据库进程,或其他应用进程,假设这个进程又是线上的一个重要服务,那它被kill掉了,你想一下这会是多么严重的一个事故。
  那怎么避免呢?
  此时,我们就可以使用上面提到的,用于调整进程badness点数的,oom_score_adj 这个参数。
  比如,我们可以通过 echo -1000 > /proc/[pid]/oom_score_adj 命令,将oom_score_adj的值设置为-1000,即该进程不能被kill掉。
  又比如,还是通过上面的echo命令,将oom_score_adj的值修改为一个较小的值,来降低它被kill掉的概率。
  但是,这些方法其实都不是完美的解决方式。
  虽然该机器上的这个重要服务不被kill掉了,但操作系统为了保证整个系统不crash,还是会kill掉其他各种进程。
  如果那些进程不重要还好,万一重要的话,还是会相当严重的。
  甚至,如果操作系统找不到可以kill掉的进程,那整个系统就会crash,这个就更严重了。
  所以,最好的方式,还是人为去避免物理内存不足的情况,在机器上跑各种程序时,要提前对整个物理内存的使用,有个规划和预判,最好是能预留出一些内存,以防各种误操作。
  好了,该篇文章就讲这些内容,如果以后你发现你的进程,莫名奇妙就没有了,可以通过dmesg等方式看下内核日志,确定下你的进程是否被oom kill掉了。

月牙湾,吃海鲜,漫步,避暑的好去处月牙湾因海湾形似一弯新月而得名,海滩延绵1000余米,是天然的海水浴场。月牙海滩为全国罕见的砾石滩。海滩球石是由于地壳运动,石块置身于弧形的海滩,经过海浪无休止的冲刷磨砺而逐渐变圆威海国际海水浴场,是您娱乐度假的胜地海水清澈,最难得的是可以在海中捞小海鱼。在这里可以很容易让人重新拾起儿时的很多美好回忆。这里沙质柔细,滩坡平缓,可同时容纳4至5万名游客,点缀于海岸边的花草石雕五色彩棚,更显风光绮怎么让宝宝爱上吃饭2535父母抱怨宝宝存在喂养问题,如宝宝厌恶进食拒食咀嚼吞咽困难进食时玩耍或哭闹挑食偏食食欲低下等。多数为轻度,约15存在严重进食问题。喂养困难会造成发育迟缓和矮小。发现51。4的婴儿会思考吗看到听到触摸味嗅觉蹦跳感觉空间,都是我们感知这个世界的方式,婴儿还有个感知世界的重要方式,就是口腔感知。1看到新生儿视觉可短暂注视物体,只能看清1520cm内的事物。1个月可凝视光齐国故城遗址博物馆,你来过吗齐国故城遗址博物馆位于齐国故城宫城遗址东部,是以齐国故城大城与小城相互衔接的特殊形制作外形,青砖砌垒,形似古代城堡。总建筑面积2600平方米,顶高15米,四周有宫殿建筑遗址桓公台齐5种很伤身体的做菜坏习惯,很多家庭都在犯,你踩雷了几个?说到吃,我们中国人一直都很有讲究,煎炒煮炸焗蒸焖炖这中国八大煮法,一直被发扬光大着,各家各户各地的人群,还有着不同的做菜独门诀窍,所以同一道菜式,南北方选用的诀窍不同,制作出的美食初秋干燥,分享7道降燥汤给你,家人多喝润燥营养,身体强健处暑节气刚过,小鹿这边就迎来了处暑后的第一场雨,只不过维持时间很短,也就早上下了一点点,让到了中午太阳高挂的时候,路面空气中的水分一下就被高温给晒得消散蒸发了,这时的秋燥感和闷热感看着孩子身上的白癜风,就算是百万家产,也换不来一个好身体看着孩子身上的白癜风,就算是家产百万,也换不来一个好身体!我女儿今年8岁,我跟我老公是独生子女,所以家里六个人管着一个孩子,在教育问题每次都有分歧,特别是孩子的吃饭问题,孩子挑食,如何通过便便看宝宝身体状况宝宝出生后,我们总会时刻关注着宝宝的吃喝拉撒。出生那几天,宝宝的便便颜色是暗绿色,黑黑的,也比较难清理,这是正常现象哦,新手爸妈不要担心,大概持续23天哦后面随着身体情况,饮食情况珠山秀谷,这里花如海,只等你来在大珠山东麓,有一条山谷,人称珠山秀谷。这条山谷有5里之长,谷内溪水奔流,汇入山下的人工湖。碧水和青山相依相拥,青峰倒映在碧水中。游人绕湖边行,缘溪水入山谷,犹如走进画境。珠山秀谷婴儿哭闹不休需要去看医生吗?怎么办?半夜因为哭吵不休的宝宝来就诊的并不在少数,多数除了哭吵不安,并没有其他不舒服,如发热呕吐腹泻食欲差精神差等,家长经过喂奶反复安抚或更换环境并不能好转,怎么回事呢?(闹人的婴幼儿一般
1个老师两个学生,贵州山里的三人小学,升国旗和开学第一课都有丹寨县,隶属贵州黔东南苗族侗族自治州,境内多民族聚居,有包括苗族水族布依族等在内的21个少数民族,全县面积近940平方公里。丹寨县境内地势东北高,西南低,属亚热带季风湿润气候区,山四川一萌娃调皮闹出了笑话,掉进泥潭瞬间成泥人,爸爸的反应亮了世上只有妈妈好,有妈的孩子像块宝。投进妈妈的怀抱,幸福享不了。没有妈妈最苦恼,没妈的孩子像根草,离开妈妈的怀抱,幸福哪里找。世上只有妈妈好,有妈的孩子不知道,要是他知道,梦里也会笑贵州一熊孩子翻箱倒柜找宝贝,结果把自己锁住了,消防员出手解救手铐,原本是国家专政机关使用的一种戒具,当人犯罪时为防止其逃跑,警方就为为其戴上手铐或者脚镣。人是一个有着非常强好奇心的群体,凡事都想尝试一下,手铐也不例外。有需求就有制造,于是各不要玩火!熊孩子点燃卫生纸引燃沙发,瞬间火光骤起浓烟滚滚火,是我们日常生活中不可或缺的东西。用好了,火可以为我们的生活带来方便,例如做饭取暖等用不好,火又会为我们带来严重的损失,如森林火灾家中失火水火无情,说的就是一旦水火发生灾难,后果湖北的一小女孩火了,坐着二哈狗力车回家,成为了全校最靓的崽随着秋季开学的到来,在家里折腾了一个暑假的神兽们,终于重新回笼了。很多家长又开启了送孩子上班接孩子的生活模式。现在的人们越来越富裕了,很多家庭都买了车,孩子上学放学都是车子接送。有血压飙升!妈妈有事让爸爸带娃,一天后进门那刻崩溃还是家吗?爸爸妈妈孩子,共同组成了一个家。三者缺一不可,缺少了任何一方,家就不完整了。丁克家庭单亲爸爸家庭单亲妈妈家庭的故事在网上都可以看到,最终的结果也带给了我们非常多的深思。近日,辽宁大吉林一小孩狂赶暑假作业,答案被撕手机被收,急得直挠头每年的9月1日,是我国下半年所有学校开学的日子。经历了整个暑假疯狂地自由玩耍,学生们也开始逐渐收心,为开学做准备了。寒假和暑假除了玩,还有老师布置的作业。从放假的第一天开始,几乎每穿尿不湿的萌娃赖床,爸爸一招让她自己爬起来,妈妈笑出了眼泪广场舞是舞蹈艺术中最庞大的一种,参与者多聚集于广场等宽阔的地方跳,因此得名。广场舞起源于社会生活,是人民大众创造的舞蹈,也是专属于人民大众的舞蹈。广场舞一般是群众自发组织的,以健身海南一小孩的雪糕自由,却一边吃一边抽泣,真相想让哭笑不得雪糕是一种常见的大众冷冻食品,以砂糖奶粉鸡蛋香精淀粉麦芽粉明胶等为主要原料制成。在性质上,雪糕介于冰淇淋和冰棍之间。炎热的夏天里,吃上一个雪糕,会让身体顿感凉意,因此,雪糕一直受到朝鲜农村孩子的童年,和我国的80年代相似,没有攀比满满的幸福童年,是人生中最美好的时光。尤其是那些在农村里长大的孩子,每每回忆起自己的童年,总会感慨万千,纵然当时生活艰苦,物质匮乏。那时候,爸爸妈妈要干活,不上学的时候,大孩子带小孩子,割草四川仨小孩在稻田里玩耍,生生把自己弄成了泥塑,妈妈崩溃了宜宾,隶属于四川省,被誉为万里长江第一城中国竹都。宜宾地处云贵川三省的结合部,金沙江岷江长江三江在这里交汇,属中亚热带季风湿润气候,整体地形西南高东北低,气候温和雨量充沛光照适宜四