如何在无响应的 Linux 系统中杀掉内存消耗最大的进程

简介:

作为一名博客作者,我收藏了很多博客、网站和论坛用来寻找 Linux 和 Unix 相关的内容。有时候,我在浏览器中开启了非常多的标签页,导致操作系统会无响应好几分钟。我不能移动我的鼠标,也不能杀掉一个进程或关闭任何开启的标签页。在这种情况下,我别无选择,只能强制重启系统。当然我也用了 OneTab (LCTT 译注:OneTab 是一个 Chrome 的 Extension,可以将标签页转化成一个列表保存。)和 Greate Suspender (LCTT 译注:Great Suspender 是一个 Chrome 的 Extension, 可以自动冻结标签页)这样浏览器拓展,但它们在这里也起不到太大的作用。 我经常耗尽我的内存。而这就是 Early OOM 起作用的时候了。在情况严重时,它会杀掉一个未响应系统中的内存消耗最大的进程。Early OOM 每秒会检测可用内存和空余交换区 10 次,一旦两者都低于 10%,它就会把最大的进程杀死。

为什么用 Early OOM?为什么不用系统内置的 OOM killer?

在继续讨论下去之前,我想先简短的介绍下 OOM killer,也就是 Out Of Memory killer。OOM killer 是一个由内核在可用内存非常低的时候使用的进程。它的主要任务是不断的杀死进程,直到释放出足够的内存,使内核正在运行的其它进程能顺利运行。OOM killer 会找到系统中最不重要并且能释放出最多内存的进程,然后杀掉他们。在 /proc 目录下的 pid 目录中,我们可以看到每个进程的 oom_score

示例:

 
  1. $ cat /proc/10299/oom_score
  2. 1

一个进程的 oom_score 的值越高,这个进程越有可能在系统内存耗尽的时候被 OOM killer 杀死。

Early OOM 的开发者表示,相对于内置的 OOM killer,Early OOM 有一个很大的优点。就像我之前说的那样,OOM killer 会杀掉 oom_score 最高的进程,而这也导致 Chrome 浏览器总是会成为第一个被杀死的进程。为了避免这种情况发生,Early OOM 使用 /proc/*/status 而不是 echo f > /proc/sysrq-trigger(LCTT 译注:这条命令会调用 OOM killer 杀死进程)。开发者还表示,手动触发 OOM killer 在最新版本的 Linux 内核中很可能不会起作用。

安装 Early OOM

Early OOM 在 AUR(Arch User Repository)中可以找到,所以你可以在 Arch 和它的衍生版本中使用任何 AUR 工具安装它。

使用 Pacaur

 
  1. pacaur -S earlyoom

使用 Packer

 
  1. packer -S earlyoom

使用 Yaourt

 
  1. yaourt -S earlyoom

启用并启动 Early OOM 守护进程:

 
  1. sudo systemctl enable earlyoom
  2. sudo systemctl start earlyoom

在其它的 Linux 发行版中,可以按如下方法编译安装它:

 
  1. git clone https://github.com/rfjakob/earlyoom.git
  2. cd earlyoom
  3. make
  4. sudo make install

Early OOM - 杀掉无响应 Linux 系统中的最大的进程

运行如下命令启动 Early OOM:

 
  1. earlyoom

如果是通过编译源代码安装的, 运行如下命令启动 Early OOM:

 
  1. ./earlyoom

示例输出:

 
  1. earlyoom 0.12
  2. mem total: 3863 MiB, min: 386 MiB (10 %)
  3. swap total: 2047 MiB, min: 204 MiB (10 %)
  4. mem avail: 1770 MiB (45 %), swap free: 2047 MiB (99 %)
  5. mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)
  6. mem avail: 1772 MiB (45 %), swap free: 2047 MiB (99 %)
  7. mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)
  8. mem avail: 1772 MiB (45 %), swap free: 2047 MiB (99 %)
  9. mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)
  10. mem avail: 1771 MiB (45 %), swap free: 2047 MiB (99 %)
  11. mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)
  12. mem avail: 1784 MiB (46 %), swap free: 2047 MiB (99 %)
  13. [...]

就像你在上面的输出中可以看到的,Early OOM 将会显示你有多少内存和交换区,以及有多少可用的内存和交换区。记住它会一直保持运行,直到你按下 CTRL+C

如果可用的内存和交换区大小都低于 10%,Early OOM 将会自动杀死最大的进程,直到系统有足够的内存可以流畅的运行。你也可以根据你的需求配置最小百分比值。

设置最小的可用内存百分比,运行:

 
  1. earlyoom -m <PERCENT_HERE>

设置最小可用交换区百分比, 运行:

 
  1. earlyoom -s <PERCENT_HERE>

在帮助部分,可以看到更多详细信息:

 
  1. $ earlyoom -h
  2. earlyoom 0.12
  3. Usage: earlyoom [OPTION]...
  4. -m PERCENT set available memory minimum to PERCENT of total (default 10 %)
  5. -s PERCENT set free swap minimum to PERCENT of total (default 10 %)
  6. -M SIZE set available memory minimum to SIZE KiB
  7. -S SIZE set free swap minimum to SIZE KiB
  8. -k use kernel oom killer instead of own user-space implementation
  9. -i user-space oom killer should ignore positive oom_score_adj values
  10. -d enable debugging messages
  11. -v print version information and exit
  12. -r INTERVAL memory report interval in seconds (default 1), set to 0 to
  13. disable completely
  14. -p set niceness of earlyoom to -20 and oom_score_adj to -1000
  15. -h this help text

现在,你再也不用担心内存消耗最高的进程了。希望这能给你帮助。更多的好内容将会到来,敬请期待。


原文发布时间为:2018-05-31

本文作者:Aditya Goturu

本文来自云栖社区合作伙伴“Linux中国开源社区”,了解相关信息可以关注“Linux中国开源社区”。

相关文章
|
27天前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
115 48
|
10天前
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
26 3
|
13天前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
14天前
|
机器学习/深度学习 人工智能 算法
【AI系统】内存分配算法
本文探讨了AI编译器前端优化中的内存分配问题,涵盖模型与硬件内存的发展、内存划分及其优化算法。文章首先分析了神经网络模型对NPU内存需求的增长趋势,随后详细介绍了静态与动态内存的概念及其实现方式,最后重点讨论了几种节省内存的算法,如空间换内存、计算换内存、模型压缩和内存复用等,旨在提高内存使用效率,减少碎片化,提升模型训练和推理的性能。
32 1
|
27天前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
62 16
|
27天前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
57 1
|
27天前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
7月前
|
Linux Shell 调度
【Linux】7. 进程概念
【Linux】7. 进程概念
69 3
|
7月前
|
存储 缓存 Linux
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
【Linux】进程概念(冯诺依曼体系结构、操作系统、进程)-- 详解
|
4月前
|
Linux Shell 调度
【在Linux世界中追寻伟大的One Piece】Linux进程概念
【在Linux世界中追寻伟大的One Piece】Linux进程概念
42 1