我们已经准备好了,你呢?

2023我们与您携手共赢,为您的企业形象保驾护航!


喜讯:国内、香港、海外云服务器租用特惠活动,2核/4G/10M仅需31元每月,点击抢购>>>

点击这里点击这里进入阿里云ECS官方页面,立即免费体验云服务器ECS>>>

实例宕机并产生日志“Out of memory and no killable processes”

  • 问题描述

    Linux操作系统的ECS实例在运行过程中宕机,产生了“Out of memory and no killable processes”日志,调用栈类似如下:

     

    [28663.625353] [ pid ]   uid  tgid total_vm      rss nr_ptes nr_pmds swapents oom_score_adj name
    [28663.625363] [ 1799]     0  1799    26512      245      56       3        0         -1000 sshd
    [28663.625367] [29219]     0 29219    10832      126      26       3        0         -1000 systemd-udevd
    [28663.625375] Kernel panic - not syncing: Out of memory and no killable processes...
    [28663.634374] CPU: 1 PID: 3578 Comm: kworker/u176:4 Tainted: G           OE   3.10.0-1062.9.1.el7.x86_64 #1
    [28663.676873] Call Trace:
    [28663.679312]  [<ffffffff8139f342>] dump_stack+0x63/0x81
    [28663.684421]  [<ffffffff811b2245>] panic+0xf8/0x244
    [28663.689184]  [<ffffffff811b98db>] out_of_memory+0x2eb/0x550
    [28663.694726]  [<ffffffff811be254>] __alloc_pages_may_oom+0x114/0x1c0
    [28663.700959]  [<ffffffff811bedb3>] __alloc_pages_slowpath+0x7d3/0xa40
    [28663.707279]  [<ffffffff811bf229>] __alloc_pages_nodemask+0x209/0x260
    [28663.713599]  [<ffffffff81216535>] alloc_pages_current+0x95/0x140
    [28663.719573]  [<ffffffff811ba5ee>] __get_free_pages+0xe/0x40
    [28663.725113]  [<ffffffff81075dae>] pgd_alloc+0x1e/0x160
    [28663.730225]  [<ffffffff810875e4>] mm_init+0x184/0x240
    [28663.735249]  [<ffffffff81088102>] mm_alloc+0x52/0x60
    [28663.740186]  [<ffffffff81257640>] do_execveat_common.isra.37+0x250/0x780
    [28663.759839]  [<ffffffff81257b9c>] do_execve+0x2c/0x30
    [28663.764864]  [<ffffffff810a231b>] call_usermodehelper_exec_async+0xfb/0x150
    [28663.777246]  [<ffffffff81741dd9>] ret_from_fork+0x39/0x50
  • 问题原因

    操作系统内核分配内存失败后,尝试通过kill进程来释放内存,但系统没有可被kill的进程,进而触发了系统的主动宕机。出现该问题的可能原因有:

    • 系统内核存在内存泄露,从而导致系统可用内存不足。

    • oom_score_adj-1000的进程占用过多内存,该类进程无法被终止从而导致系统可用内存不足。

      说明

      oom_score_adj是一个用于调整OOM(Out of Memory)终止进程的优先级的参数。内核根据每个进程的OOM分数(oom_score)来选择要终止的进程,较低的oom_score值表示进程更有可能被终止,而较高的值表示进程更不可能被终止。

  • 解决方案

    1. 执行以下命令,获取进程的PID。您可以使用命令如 pstop 或 pgrep 来查找进程的 PID。

       

      ps aux | grep <进程名称>

      您需要将 <进程名称> 替换为您要查找的进程的名称。

    2. 执行以下命令,检查 oom_score_adj 设置。

       

      cat /proc/<PID>/oom_score_adj

      您需要将 <PID> 替换为已获取的进程实际PID。

      根据您的环境和需求,可以根据oom_score_adj的值来评估进程的OOM行为是否合理。如果oom_score_adj的值为-1000,则表示该进程具有较高的优先级,更不可能被内核选择进行OOM终止,从而导致系统可用内存不足。

    3. 检查系统内核是否存在内存泄露。

      具体操作,请参见如何排查slab_unreclaimable内存占用高的原因?。

    4. 检查进程的oom_score_adj设置是否合理。



推荐:TOP云智能建站优惠活动,仅880元即可搭建一个后台管理五端合一的智能网站(PC网站、手机网站、百度智能小程序、微信小程序、支付宝小程序),独享百度搜索SEO优势资源,让你的网站不仅有颜值有排面,更有排名,可以实实在在为您带来效益,请点击进入TOP云智能建站>>>,或咨询在线客服了解详情。


我们已经准备好了,你呢?

2023我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

131-3501-0006

上班时间

周一到周五

公司电话

130-0743-9476

二维码
线