如何在無響應(yīng)的Linux系統(tǒng)中殺掉內(nèi)存消耗最大的進程?
作為一名博客作者,我收藏了很多博客、網(wǎng)站和論壇用來尋找 Linux 和 Unix 相關(guān)的內(nèi)容。有時候,我在瀏覽器中開啟了非常多的標(biāo)簽頁,導(dǎo)致操作系統(tǒng)會無響應(yīng)好幾分鐘。我不能移動我的鼠標(biāo),也不能殺掉一個進程或關(guān)閉任何開啟的標(biāo)簽頁。在這種情況下,我別無選擇,只能強制重啟系統(tǒng)。當(dāng)然我也用了 OneTab (LCTT 譯注:OneTab 是一個 Chrome 的 Extension,可以將標(biāo)簽頁轉(zhuǎn)化成一個列表保存。)和 Greate Suspender (LCTT 譯注:Great Suspender 是一個 Chrome 的 Extension, 可以自動凍結(jié)標(biāo)簽頁)這樣瀏覽器拓展,但它們在這里也起不到太大的作用。 我經(jīng)常耗盡我的內(nèi)存。而這就是 Early OOM 起作用的時候了。在情況嚴重時,它會殺掉一個未響應(yīng)系統(tǒng)中的內(nèi)存消耗***的進程。Early OOM 每秒會檢測可用內(nèi)存和空余交換區(qū) 10 次,一旦兩者都低于 10%,它就會把***的進程殺死。
為什么用 Early OOM?為什么不用系統(tǒng)內(nèi)置的 OOM killer?
在繼續(xù)討論下去之前,我想先簡短的介紹下 OOM killer,也就是 Out Of Memory killer。OOM killer 是一個由內(nèi)核在可用內(nèi)存非常低的時候使用的進程。它的主要任務(wù)是不斷的殺死進程,直到釋放出足夠的內(nèi)存,使內(nèi)核正在運行的其它進程能順利運行。OOM killer 會找到系統(tǒng)中最不重要并且能釋放出最多內(nèi)存的進程,然后殺掉他們。在 /proc
目錄下的 pid
目錄中,我們可以看到每個進程的 oom_score
。
示例:
$ cat /proc/10299/oom_score
1
一個進程的 oom_score
的值越高,這個進程越有可能在系統(tǒng)內(nèi)存耗盡的時候被 OOM killer 殺死。
Early OOM 的開發(fā)者表示,相對于內(nèi)置的 OOM killer,Early OOM 有一個很大的優(yōu)點。就像我之前說的那樣,OOM killer 會殺掉 oom_score
***的進程,而這也導(dǎo)致 Chrome 瀏覽器總是會成為***個被殺死的進程。為了避免這種情況發(fā)生,Early OOM 使用 /proc/*/status
而不是 echo f > /proc/sysrq-trigger
(LCTT 譯注:這條命令會調(diào)用 OOM killer 殺死進程)。開發(fā)者還表示,手動觸發(fā) OOM killer 在***版本的 Linux 內(nèi)核中很可能不會起作用。
安裝 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 發(fā)行版中,可以按如下方法編譯安裝它:
git clone https://github.com/rfjakob/earlyoom.git
cd earlyoom
make
sudo make install
Early OOM - 殺掉無響應(yīng) Linux 系統(tǒng)中的***的進程
運行如下命令啟動 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 將會顯示你有多少內(nèi)存和交換區(qū),以及有多少可用的內(nèi)存和交換區(qū)。記住它會一直保持運行,直到你按下 CTRL+C
。
如果可用的內(nèi)存和交換區(qū)大小都低于 10%,Early OOM 將會自動殺死***的進程,直到系統(tǒng)有足夠的內(nèi)存可以流暢的運行。你也可以根據(jù)你的需求配置最小百分比值。
設(shè)置最小的可用內(nèi)存百分比,運行:
earlyoom -m <PERCENT_HERE>
設(shè)置最小可用交換區(qū)百分比, 運行:
earlyoom -s <PERCENT_HERE>
在幫助部分,可以看到更多詳細信息:
$ 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
現(xiàn)在,你再也不用擔(dān)心內(nèi)存消耗***的進程了。希望這能給你幫助。更多的好內(nèi)容將會到來,敬請期待。