• 用cgroup限制内存以防止Linux因内存用尽卡死


    Linux在内存用尽的情况下,整个界面,包括tty和ctrl-alt-F1都会卡住难以响应。虽然Linux内核有OOM Killer机制杀掉吃内存的进程,但经常内存用尽时连OOM Killer都无法动作。

    本篇讲述如何用cgroup限制内存防止整个Linux因内存用尽卡死。

    因内存用尽卡住时怎么办

    1. 如果鼠标还能动一点,可以尝试在top中杀掉吃内存的进程。但这时想进入topkill -9都很难。ctrl-alt-F1都会卡。
    2. 如果鼠标完全不能动,可以等待15分钟左右,OOM Killer可能会动作杀掉吃内存的进程,然后就可以恢复。如果15分钟还无反应,那是真卡死了。
    3. 魔法键强制安全重启。

    用cgroup限制用户内存留空间给内核动作

    cgroup是内核的一个资源限制功能。这里限制日常用户的内存,留500MB左右给root和内核。

    我的Linux是否支持cgroup

    cat /proc/self/cgroup
    

    这里可以列出某进程所处的资源限制组。有则表示内核支持cgroup

    安装cgroup相关工具

    我们要用到cgconfigparsercgrulesengd这两个工具。安装libcgroup-tools(可能因发行版而异)这个包。

    配置cgroup规则

    /etc/cgconfig.conf中写

    group users_mem_limit {
        memory {
            memory.limit_in_bytes = 3500000000;
        }
    }
    

    这里限制共使用3.5G内存(假设共有4G内存)。用cat /proc/meminfo查看准确的总内存大小以决定数值。

    /etc/cgrules.conf中写

    @users	memory	users_mem_limit/
    日常用户名	memory	users_mem_limit/
    

    这是将规则应用给users组和日常用户。

    接下来运行

    # cgconfigparser -l /etc/cgconfig.conf
    # cgrulesengd
    

    等待两分钟,日常用户的所有进程就会被放入资源限制规则组中,新打开的进程也会自动加入。cat /proc/<PID>/cgroup可以看某进程是否已加入组。

    如果成功,将上面两条命令设置成为开机自动以root运行就行。具体步骤略。

    吃内存测试

    如果想要测试这个方法的效果,可以用这个工具来吃内存(自己make一下)。

    $ ./memhog 100 9999999
    

    它会一次吃掉100MB内存,逐渐把内存用尽(这并不能完全模拟所有程序运行时的内存使用方式,这只是个简单的测试)

    其他方法

    Linux有内存用尽卡死的问题,是Linux内核的OOM机制不够好。这或许是它不如Windows的一个地方。

    另外许多人推荐一个叫Early OOM的程序,用它来替代Linux自身的OOM。

    如果本文帮到你,请点一下”推荐“,谢谢!
    版权所有 本博客文章皆属原创(除特别标明外)
    未联系作者获得同意前,不可转载
    转载必须附上源地址,并连我博客上的宣传内容一并转载

    打赏作者

    写作不易,感谢支持!
    打赏链接
    

  • 相关阅读:
    用tensorflow构建神经网络学习简单函数
    Entity Framework 6.0 Tutorials(1):Introduction
    Entity Framework Tutorial Basics(43):Download Sample Project
    Entity Framework Tutorial Basics(42):Colored Entity
    Entity Framework Tutorial Basics(41):Multiple Diagrams
    Entity Framework Tutorial Basics(40):Validate Entity
    Entity Framework Tutorial Basics(39):Raw SQL Query
    Entity Framework Tutorial Basics(38):Explicit Loading
    Entity Framework Tutorial Basics(37):Lazy Loading
    Entity Framework Tutorial Basics(36):Eager Loading
  • 原文地址:https://www.cnblogs.com/garyw/p/12769420.html
Copyright © 2020-2023  润新知