當我有消耗大量記憶體的進程或有許多 CPU 密集型進程正在運行時,甚至登入系統通常都會變得困難。我想防止這種情況發生並始終保持系統響應。有什麼辦法可以做到這一點嗎?
澄清編輯:
我正在談論我遇到相同症狀的兩種不同情況:
記憶體負載非常高。單一進程消耗接近或超過可用的 64GB RAM。當系統接近 100% 使用率時,程式將變得無回應。
CPU 負載非常高,調度問題。擁有 10k 個可運行進程會導致相同的問題。請注意,這不是 100% CPU 負載的問題。當我殺死 -STOP 除 200 個進程之外的所有進程時,所有 32 個 CPU 都保持在 100% 負載,但係統的可用性要高得多。
關於我所認為的「制度」的問題。我知道 shell 進程和我的其他使用者進程之間沒有概念上的區別,但這只是使它們不同的問題。有一些選項可以做到這一點,例如“niceness”。但如同上面提到的,友善並沒有解決問題,至少在情況(2.)中沒有。
我可以完全控制這些系統,並且在所有情況下都能夠使用kill -STOP 或僅抄送來停止作業。我想要解決的是,這變得非常困難,並且在使用 GUI 時有時是不可能的,因為輸入處理速度非常慢(如果有的話)。 我想一般性地解決這個問題,而不是對某些特定的工作進行更改。
我嘗試過的事情:
對於我現在正在運行的許多進程,我剛剛將所有正在運行的進程重新調整為+5,但這似乎沒有幫助。也沒有將它們設定為niceness 19。
正如其中一個答案所建議的。我嘗試使用
sudo schedtool -D $(pgrep -u myuser progname -d " ")
和 with將調度程序策略更改為 IDLEsudo sh -c 'for pid in $(pgrep -u myuser progname); do chrt -i -p 0 $pid; done;'
這似乎使情況有所改善。
答案1
問題是您的記憶體已飽和,因此作業系統必須釋放磁碟快取並交換程式及其資料以進行交換。
交換是一種在達到實體記憶體限制時保持系統正常運作的方法。在負載較輕的系統上,這可能意味著系統繼續工作,並且在發生擠壓時將內容調出,然後在需要時返回,僅產生很小的影響。
大多數作業系統都會根據「最近最少使用」的方式刷新程式和程式碼以進行交換。很難對記憶體的「優先順序」做出任何假設,因為記憶體負載會發生變化,而「優先順序」是對更重要的主觀判斷的滑坡。對於一個系統來說更重要的事情對於另一個系統來說就沒那麼重要了。命令列程序只是其他程序,無法將它們與用戶運行的其他程序區分開來。
由於您的系統負載很重,其中有許多進程使用大量內存,因此您會遇到爭用問題。當作業系統嘗試將某些內容分頁到磁碟以釋放一些記憶體時,另一個進程已經要求了一些需要返回的其他頁面。
在 10,000 個進程中,任何系統如何確定什麼應該優先於看起來像任何其他程式請求的「系統」命令列程式請求?
另一個問題是硬碟尋道時間。對於老式 HDD,移動驅動器磁頭並開始讀取或寫入的時間約為 9.5 毫秒。由於不同區域同時發生大量請求,因此尋求時間可以壓倒一切,並將實際可用時間和頻寬減少到令人驚訝的小數字。 SSD 可以提供幫助,但如果您的記憶體有限,那麼它的幫助就有限了。
類似的瓶頸可能發生在整個系統中,並呈現出不同的症狀。作業系統可以管理大量並發程序,但它仍然“只是”一個程序本身,並且需要時間。交換文件的使用只是最極端的瓶頸之一。
以這種方式淹沒系統並僅僅期望它“處理它”並不是一個好主意。
如果您始終使用比現有內存更多的內存,那麼答案就是購買更多內存。如果您有數千個進程爭奪硬碟時間來讀取或寫入數據,那麼您需要將負載分散到更多機器或驅動器。
對於您的另一種情況,對於 10,000 個活動進程,您的問題既是爭用又是不切實際的期望。
一個問題是,「友善」不一定總是處於較低的優先事項。這取決於作業系統調度程序,並且添加越來越多的進程實際上可能不利於擁有一個公平且有用的系統,因為您最終會減少分配給任何給定進程的時間量。
從我們的 Unix 姊妹網站查看這個問題工作怎麼樣?它描述了完全公平的調度程序:
CFS 對於調度持續時間有一個目標延遲。較小的目標延遲會產生更好的互動性,但隨著目標延遲的減少,切換開銷會增加,從而降低整體吞吐量。
…
現在考慮兩個進程,一個進程的niceness為0(預設值),另一個進程的niceness為5。 15毫秒的時間片而較低優先權進程接收 5 毫秒的時間片。
在這個調度程序下,美好意味著你的 10,000 個進程應該獲得的時間更少,但由於它們的數量龐大,您可能會達到「公平」調度的時間片值的下限,這意味著沒有人獲得足夠大的時間片。您甚至可能會遇到極限,將任務拉入或拉出 CPU 的時間占主導地位。
這實際上與硬碟爭用相同。您迫使系統花費更多的時間在進程之間交換,而不是花費任何有用的時間在任何給定的進程上。
您可以在以下位置找到有關調度程序的更多信息http://man7.org/linux/man-pages/man7/sched.7.html
使用更合理的進程數量(100 到 200)可以在作業系統任務和進程之間分配合理的時間。
與其立即啟動 10,000 個任務,不如在舊任務完成後啟動新任務。