題 如何防止特定程序交換?


是否有可能阻止特定程序(即,rhythmbox及其依賴項)從交換到磁盤?

我問,因為當一個音樂播放器在Chromium佔用太多內存時打嗝時我遇到了問題。有辦法解決這個問題嗎?這不再是Windows中的問題所以可能有一種方法。


18
2018-02-09 01:44


起源


假小子 有同樣的問題。這是一些人轉向的原因之一 Gnote的。 - Cristian Ciupitu
我認為打嗝問題不一定是交換造成的。如果程序正在播放某些內容,Linux應注意這一點而不是交換它。沒有做太多的程序是第一個被交換的程序。你跑了嗎? ps 要么 top 通過查看是否真的交換了rhytmbox RSS/RES 領域?我認為你的問題主要是由於調度不當引起的。你應該嘗試 renice rhytmbox進程或更改其某些設置,例如音頻緩衝區的大小。 - Cristian Ciupitu
謝謝!有沒有辦法設置程序的初始好值? / etc / nicetab還是什麼? :) - Alexei Averchenko
有關: stackoverflow.com/questions/2360116/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


我認為打嗝問題不一定是交換造成的。如果程序正在播放某些內容,Linux應該注意到這一點,而不是交換它。沒有做太多的程序是第一個被交換的程序。您可以通過查看該程序來檢查程序是否真的被交換 RSS/RES 來自的領域 PS 要么 最佳RSS 是駐留集大小,即任務正在使用的非交換物理內存(以千字節為單位)。

我認為你的問題很可能是由不正確的CPU和I / O調度以及Rhythmbox的一些低效率引起的,這使得它對高系統負載很敏感。可以使用命令更改CPU優先級 不錯 和 renice只能。可以使用更改I / O優先級 ionice 命令。只有超級用戶才能使用高優先級。您還應該知道Linux內核人員正在嘗試使用各種低延遲補丁來提高桌面系統的響應能力,因此您可以考慮使用它們。其中一個是 由Mike Galbraith寫的~200行補丁 甚至Linus也給人留下了深刻的印象。這個補丁的替代品是 Lennart Poettering的cgroups技巧 我認為這將是Fedora 15中的默認值。

無論如何,沒有這些補丁有兩種選擇:以高優先級啟動程序或之後更改它。對於第一個選項,您可以在Rhythmbox周圍使用包裝器腳本:

#!/bin/sh
# Run Rhytmbox with high CPU and I/O priorities
nice -n -10 ionice -c 1 -n 1 su -l -c rhythmbox alexei

您需要以root身份運行它。如果您不想以root身份登錄只是為了啟動它,您可以使用其中任何一個 su 要么 sudo

至於之後更改優先級,如果你懶得以root身份登錄來更改它,你可以嘗試使用每5分鐘運行一次的cron作業並設置優先級。 rhythmbox 過程,但我不建議這樣做:

#!/bin/sh
renice -n -10 -p `pidof rhythmbox`
ionice -c 1 -n 1 -p `pidof rhythmbox`

9
2018-02-09 13:57





簡短的回答:你不能,也不應該。

很久以前,可執行文件兌現了粘性位 +t 這將告訴內核不要交換,但今天它被忽略了。

如果內核決定它必須交換,它肯定有正當理由。 Linux在內存使用方面非常積極,因為空閒的RAM是一種浪費的資源。

如果你真的不想交換,可以獲得更多內存,或者只是 # swapoff -a (不推薦,如果您已經遇到問題,可能會使您的系統無法使用)。

Shouldn't 當你開發一些應用程序並且根本不想讓它交換時。看一眼 這篇文章在stackoverflow上


4
2018-02-09 02:17



我不認為保留大約100 MiB會殺死我的系統。也許有另一種方法來解決我的特定問題(參見編輯過的問題)? - Alexei Averchenko
如果你打算讓一個進程保持高水平的響應能力而不是其他進程,答案很好(你必須是root用戶才能這樣做)。如果你不想弄髒你的內容(如果你不想弄髒你的話(觸摸代碼,重新編譯,甚至LD_PRELOADing一個自定義庫來欺騙這個過程並調整用於分配內存的函數 - 再次,不推薦),那麼亂用內存分頁並不容易。建議?重新設置進程,獲取更多RAM或停止打開選項卡;) - Torian
“如果內核決定它必須交換,那肯定有正當理由”這不是真的。今天我有1,3G的免費記憶。 Linux內核將我的httpd進程放入交換(370M)。 - bluszcz
@bluszcz(好吧,其他人在閱讀這個評論的年齡):這可能是因為它決定了httpd服務的文件的磁盤緩存比httpd本身很少使用的部分更重要 - 請參閱其他答案提到“swappiness”。 - Jan Schejbal
@JanSchejbal,因為Linux,至少沒有人告訴它,不知道什麼過程是重要的。在服務器環境中,您應該能夠告訴系統哪些進程很重要,哪些進程不重要。 “我不關心其他事情,但這些過程對於此服務器的操作最重要” - Rahly


這似乎已在這裡得到解答:

https://stackoverflow.com/questions/578137/can-i-tell-linux-not-to-swap-out-a-particular-processes-memory

雖然大家一致認為你可能不應該:


2
2018-02-09 02:13





有幾種方法可以做到這一點。 您可以嘗試嘗試“說”到Linux 交換工作少 (通常):

echo 10 > /proc/sys/vm/swappiness

來自: https://www.kernel.org/doc/Documentation/sysctl/vm.txt

swappiness

此控件用於定義內核交換的積極程度   記憶頁面。較高的值會增加攻擊性,降低值   減少掉期金額。

默認值為60。

其他選項是使用cgroups內核管理器,這是每個進程特定的,但你將有一些“工作”要做: 這裡回答: https://unix.stackexchange.com/questions/10214/per-process-swapiness-for-linux#10227


2
2018-04-14 22:36



這會影響全局的swappiness,而不會影響特定於流程。 - Lorenzo Von Matterhorn
是的,你可以注意到“(通常)”我寫道。每個進程的選項是使用cgroups鏈接到其他答案。 - ceinmart
然後那沒有用,是嗎? - Ken Sharp
Ken Sharp:這個答案是唯一一個直接鏈接到(至少乍看之下)問題的答案,就像問題的最佳解決方案一樣。所以......與你所說的完全相反。 - phils
@phils你不知道這是如何工作的。 - Ken Sharp


您可以使用 mlockall() 系統調用。 mlockall()強制內存進程駐留(=無交換,不過度使用等)。 AFAIK,沒有shell命令來做,但很容易創建一個。它看起來像:

if (mlockall(MCL_FUTURE | MCL_CURRENT))
     perror("mlockall");
execvp(argv[0], argv);

注意,你需要root才能調用 mlockall()

但是,正如其他答案所說,我認為這不是你想要的。


0
2017-10-26 16:16