如何在無響應的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
。
示例:
$ 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 <PERCENT_HERE>
設定最小可用交換區百分比, 執行:
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
現在,你再也不用擔心記憶體消耗最高的程式了。希望這能給你幫助。更多的好內容將會到來,敬請期待。
原文釋出時間為:2018-05-31
本文作者:Aditya Goturu
本文來自雲棲社群合作伙伴“Linux中國開源社群”,瞭解相關資訊可以關注“Linux中國開源社群”。
相關文章
- 如何在 Linux 中找出記憶體消耗最大的程序Linux記憶體
- 如何在 Linux 系統中判斷安裝、使用了多少記憶體Linux記憶體
- Redis記憶體——記憶體消耗(記憶體都去哪了?)Redis記憶體
- Java應用程式中的記憶體洩漏及記憶體管理Java記憶體
- OpenResty 和 Nginx 的共享記憶體區是如何消耗實體記憶體的RESTNginx記憶體
- Linux系統程式設計—共享記憶體之mmapLinux程式設計記憶體
- Linux記憶體子系統——Locking Pages(記憶體鎖定)Linux記憶體
- 32bit的linux系統記憶體分佈Linux記憶體
- GreatSQL記憶體消耗異常排查攻略:從系統到應用層面的深入分析SQL記憶體
- PHP 獲取程式碼執行時間和消耗的記憶體PHP記憶體
- [20210803]對比transparent hugepage的記憶體消耗.txt記憶體
- Spark效能優化:診斷記憶體的消耗Spark優化記憶體
- ABAP Memory Inspector 裡對動態記憶體物件的記憶體消耗度量方式記憶體物件
- 如何檢視linux系統中空閒記憶體/實體記憶體使用/剩餘記憶體Linux記憶體
- Linux上執行記憶體中的指令碼和程式Linux記憶體指令碼
- 在Linux中,如何檢查系統的CPU和記憶體使用情況?Linux記憶體
- Linux系統程式設計之命名管道與共享記憶體Linux程式設計記憶體
- Linux作業系統記憶體淺析Linux作業系統記憶體
- Netweaver工作程式的記憶體限制 VS CloudFoundry應用的記憶體限制記憶體Cloud
- 「Python實用祕技06」逐行監聽Python程式的記憶體消耗Python記憶體
- 利用 Shell 指令碼來監控 Linux 系統的記憶體指令碼Linux記憶體
- 虛擬記憶體系統——瞭解記憶體的工作原理記憶體
- 一個導致JVM實體記憶體消耗大的BugJVM記憶體
- 如何在 Linux 系統中結束程式或是中止程式Linux
- 如何修復“您的系統已耗盡應用程式記憶體”錯誤記憶體
- 剖析記憶體中的程式之祕記憶體
- 如何在 Linux 下檢測記憶體洩漏Linux記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- mysql最大表記憶體MySql記憶體
- 如何讓手遊記憶體佔用更小?從記憶體消耗iOS實時統計開始記憶體iOS
- macOS Monterey新問題:“記憶體洩漏”,應用後臺執行消耗上百 GB 記憶體Mac記憶體
- 查詢windows記憶體卡槽及卡槽支援的最大記憶體Windows記憶體
- Linux共享記憶體的管理Linux記憶體
- Linux系統手動釋放記憶體快取Linux記憶體快取
- JS中的棧記憶體、堆記憶體JS記憶體
- 應用程式無響應?如何在Mac上強制退出應用Mac
- win10系統檢視哪個軟體佔用記憶體最大的圖文教程Win10記憶體
- Linux系統下分析記憶體使用情況的管理工具Linux記憶體