歡迎光臨
每天分享高質量文章

如何在無響應的 Linux 系統中殺掉記憶體消耗最大的行程 | Linux 中國

Early OOM 每秒會檢測可用記憶體和空餘交換區 10 次,一旦兩者都低於 10%,它就會把最大的行程殺死。
— Aditya Goturu


致謝
編譯自 | https://www.ostechnix.com/kill-largest-process-unresponsive-linux-system/
 作者 | Aditya Goturu
 譯者 | ShenYu Zheng (cizezsy) ? 共計翻譯:1 篇 貢獻時間:13 天

作為一名部落格作者,我收藏了很多部落格、網站和論壇用來尋找 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 OMemory 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]

  1. pacaur -S earlyoom

使用 Packer[2]

  1. packer -S earlyoom

使用 Yaourt[3]

  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

現在,你再也不用擔心記憶體消耗最高的行程了。希望這能給你幫助。更多的好內容將會到來,敬請期待。

謝謝!


via: https://www.ostechnix.com/kill-largest-process-unresponsive-linux-system/

作者:Aditya Goturu[5] 譯者:cizezsy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

贊(0)

分享創造快樂