當前位置:
首頁 > 最新 > 如何在無響應的Linux系統中殺掉內存消耗最大的進程?

如何在無響應的Linux系統中殺掉內存消耗最大的進程?

【免費雲虛擬主機】0元/12個月主機套餐,小鳥雲虛擬主機,只為建站而生!基於自建的核心骨幹網路,具有高在線率、高安全性、高穩定性等多項優勢,並支持隨時無縫升級增配。

有時候,我在瀏覽器中開啟了非常多的標籤頁,導致操作系統會無響應好幾分鐘。我不能移動我的滑鼠,也不能殺掉一個進程或關閉任何開啟的標籤頁。在這種情況下,我別無選擇,只能強制重啟系統。當然我也用了 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。

示例:

$ cat /proc/10299/oom_score

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:

pacaur -S earlyoom

使用 Packer:

packer -S earlyoom

使用 Yaourt:

yaourt -S earlyoom

啟用並啟動 Early OOM 守護進程:

sudo systemctl enable earlyoom

sudo systemctl start earlyoom

在其它的 Linux 發行版中,可以按如下方法編譯安裝它:

git clone https://github.com/rfjakob/earlyoom.git

cd earlyoom

make

sudo make install

Early OOM - 殺掉無響應 Linux 系統中的最大的進程

運行如下命令啟動 Early OOM:

earlyoom

如果是通過編譯源代碼安裝的, 運行如下命令啟動 Early OOM:

./earlyoom

示例輸出:

earlyoom 0.12

mem total: 3863 MiB, min: 386 MiB (10 %)

swap total: 2047 MiB, min: 204 MiB (10 %)

mem avail: 1770 MiB (45 %), swap free: 2047 MiB (99 %)

mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)

mem avail: 1772 MiB (45 %), swap free: 2047 MiB (99 %)

mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)

mem avail: 1772 MiB (45 %), swap free: 2047 MiB (99 %)

mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)

mem avail: 1771 MiB (45 %), swap free: 2047 MiB (99 %)

mem avail: 1773 MiB (45 %), swap free: 2047 MiB (99 %)

mem avail: 1784 MiB (46 %), swap free: 2047 MiB (99 %)

[...]

就像你在上面的輸出中可以看到的,Early OOM 將會顯示你有多少內存和交換區,以及有多少可用的內存和交換區。記住它會一直保持運行,直到你按下 CTRL+C。

如果可用的內存和交換區大小都低於 10%,Early OOM 將會自動殺死最大的進程,直到系統有足夠的內存可以流暢的運行。你也可以根據你的需求配置最小百分比值。

設置最小的可用內存百分比,運行:

earlyoom -m

設置最小可用交換區百分比, 運行:

earlyoom -s

在幫助部分,可以看到更多詳細信息:

$ earlyoom -h

earlyoom 0.12

Usage: earlyoom [OPTION]...

-m PERCENT set available memory minimum to PERCENT of total (default 10 %)

-s PERCENT set free swap minimum to PERCENT of total (default 10 %)

-M SIZE set available memory minimum to SIZE KiB

-S SIZE set free swap minimum to SIZE KiB

-k use kernel oom killer instead of own user-space implementation

-i user-space oom killer should ignore positive oom_score_adj values

-d enable debugging messages

-v print version information and exit

-r INTERVAL memory report interval in seconds (default 1), set to 0 to

disable completely

-p set niceness of earlyoom to -20 and oom_score_adj to -1000

-h this help text

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

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 小鳥雲 的精彩文章:

Linux中DNS伺服器搭建

TAG:小鳥雲 |