
有時我會處理大量數據,我想將其保留在記憶體中進行處理。有時,我錯誤地計算了程式將產生的記憶體量,或者調試器將記憶體使用量乘以超出我的可用記憶體的係數。
每當我啟動一個需要大量內存的進程時,這就是我對正常操作系統的期望:嘗試吃掉所有可用內存,然後很好地要求其他一些非必要進程放棄一些它們不需要的內存,然後寫入交換。
Ubuntu 為我做的就是:吃掉所有空閒內存,然後要求作業系統交換所有基本服務(gnome 會話、終端、鍵盤),然後凍結並等待我拔掉電源插頭。
兩個問題:
- 作業系統怎麼能假設,任何事情都可能如此重要,以至於可以停止監聽使用者輸入?
- 我怎麼能告訴 Ubuntu 永遠不要交換基本服務並始終對使用者輸入做出反應,即使某些愚蠢的進程試圖消耗比系統提供的資源更多的資源。
答案1
我仍然沒有解決該問題的方法,但我可以提供兩種其他人可能感興趣的解決方法:
1)早晨
這是一項監視記憶體使用情況並在達到特定閾值時終止消耗最多記憶體的進程的服務(另請參閱這和這關於linux核心中OOM殺手的問題)
我已經用一個演示進程對其進行了測試,該進程無限期地請求小塊內存。這是我的第一印象:當我啟動流氓進程時,它很快就會耗盡我所有的 RAM。然後交換開始,系統變成無回應。幾秒鐘後,系統重新上線。 Earlyoom的日誌顯示,它在記憶體和交換空間使用率都達到90%後殺死了記憶體消耗進程。
當交換開始時和進程被終止後,仍然存在令人煩惱的延遲,其他進程的某些部分通常會保留在交換中,直到被請求為止,但這只是一個開始。
2)只需停用交換
我知道這是一個有爭議的話題,但對於桌面系統,尤其是開發機器來說,進程可能會時不時地試圖耗盡所有內存,這是有道理的:沒有交換,OOM 殺手就會按預期工作。當記憶體不足時,它會找到最好殺死的進程並擺脫它。沒有滯後,沒有延遲。
sudo swapoff -a
您可以使用或停用目前會話的交換使改變永久化。
這個問題的正確解決方案當然是當主內存耗盡時系統保持響應,並開始交換內存,就像沒有明天一樣,但這似乎不會很快發生。
答案2
從+22.04 LTS
有一個名為 systemd-oomd 的服務,它會自動監視記憶體使用情況,並在記憶體不足時嘗試終止進程,並且預設它會作為 systemd 的一部分安裝。若要查看目前狀態,請鍵入oomctl
.輸出範例:
Dry Run: no
Swap Used Limit: 90.00%
Default Memory Pressure Limit: 60.00%
Default Memory Pressure Duration: 20s
System Context:
Memory: Used: 4.1G Total: 15.5G
Swap: Used: 1.0G Total: 3.9G
Swap Monitored CGroups:
Path: /
Swap Usage: (see System Context)
Memory Pressure Monitored CGroups:
Path: /user.slice/user-1000.slice/[email protected]
Memory Pressure Limit: 50.00%
Pressure: Avg10: 0.00 Avg60: 0.02 Avg300: 0.00 Total: 9s
Current Memory Usage: 3.9G
Memory Min: 0B
Memory Low: 0B
Pgscan: 23663084
Last Pgscan: 23663084
預設情況下,記憶體和交換空間使用率達到 90% 時開始回收。它使用使用者切片控制群組的記憶體壓力(即[電子郵件受保護])這是大多數應用程式產生的地方,但不是 system.slice 控制群組,它會產生系統最關鍵的元件,例如 NetworkManager 和 Gnome Display Manager。簡而言之,oomd 將在系統進程之前釋放使用者進程。若要查看 systemd-oomd 的目前配置,請鍵入:
systemd-analyze cat-config systemd/oomd.conf
參考這一頁以供參考他們所做的事情。若要編輯特定 systemd 單元的 OOM 參數,請新增或編輯指定的變數這裡在單元文件中。
答案3
試試以下兩件事之一:
1) 將 swappiness 設定從預設設定 60 改為 10,即:新增虛擬機交換性 = 10到/etc/sysctl.conf(在終端機中,鍵入sudo gedit /etc/sysctl.conf
),然後重新啟動系統。在此處搜尋 swappiness 以獲取有關它的更多資訊。
2) 如果交換沒有幫助...即使您可能不想...將交換文件的大小增加到 1.5x16G 並看看是否有幫助。
請隨時通知我。乾杯,艾爾