有沒有辦法真正確定進程的優先順序或讓 Linux 尊重它們的優先順序?

有沒有辦法真正確定進程的優先順序或讓 Linux 尊重它們的優先順序?

我知道有像其他作業系統一樣的進程優先權,從 -20(最多 prio)到 19(較少 prio),但 Linux 似乎忽略它們。

現在我正在後台建立核心(儘管make進程的優先順序為 0),由於花了相當長的時間,所以我決定看一些東西。因此,我在VLC 中打開了一個要求相當高的H264 視訊(大約是Core2 2.6GHz CPU 時間的30%),卻發現存在撕裂、幀丟失、視覺偽影(我推測是由之前的視頻造成的),儘管音頻似乎是美好的。

所以我決定改變 VLC 使用的優先級renice,具體地看到 PulseAudio-11我決定將其放在同等位置,所以我這樣做了sudo renice -11 -p VLC_PROC_#

同樣的事情不斷發生,所以我繼續將其設置為 -20,但我仍然不斷看到視覺偽影。

所以我想知道,為什麼 Linux 實際上沒有將 -20 進程優先於某些 0 進程並為其提供所需的任何內容?有什麼方法可以真正確定 Linux 中進程的優先順序嗎?

以防萬一,我在這裡運行 64 位元 Arch,XFCE 作為桌面環境。

編輯:核心編譯是在/tmp我擁有tmpfs它的原始程式碼的情況下執行的,並且所有內容都已經在 RAM 中。 RAM 使用率甚至沒有達到 60%,並且沒有進行分頁操作。

上面詳細描述的場景只是一個測試用例,我更感興趣的是為什麼 Linux 會這樣執行,以及是否有任何方法可以獲得真正的優先順序。

答案1

renice確實會影響進程的優先權。但正如您所經歷的那樣,僅僅因為進程具有更高的優先順序並不意味著它將擁有所需的所有資源。更高的優先權只會讓進程有更大的機會來取得資源。

renice只影響CPU時間。因此,只有當兩個或多個進程競爭 CPU 時間時,它才會產生影響。如果限制因素不是CPU時間而是I/O頻寬,則nice值沒有影響。也許在您的情況下,編譯使用了大量磁碟頻寬,並且 vlc 無法足夠快地從磁碟讀取資料。嘗試ionice代替或補充nice

如果您經常這樣做,如果影片和編輯位於不同的磁碟上,您將獲得更好的結果。此外,如果將影片預先載入到磁碟快取中(cat /path/to/video.file >/dev/nulltail -c +456m | head -c 123m /path/to/video.file >/dev/null從偏移量 456MB 開始讀取 123MB),您可能會獲得更好的結果 - 但除非您有大量 RAM,否則編譯可能會收回快取空間。如果您想確保內存中有視頻,請製作一個虛擬磁碟並將視頻複製到其中。

答案2

當您嘗試調整時,進程優先順序並不是唯一發揮作用的因素使用者體驗。編譯核心是一件 I/O 繁重的事情 - 大量從小檔案中讀取/寫入,這可能會大大拉伸檔案系統(有時會出現這種情況是有原因的)單獨用作基準),特別是在多處理器機器上。如果您有足夠的RAM,我建議您嘗試在tmpfs 中編譯內核- 至少部分地:要么將源代碼樹放在那裡(這將有效地將其預取到緩存中),要么使用以下命令將輸出發送到那裡

make O=/dev/shm ...

或在您決定將tmpfs實例安裝得足夠大以容納內核物件檔案的任何地方 - 這很容易在千兆位元組範圍內)。

除此之外,您還可以檢查 VLC 是否具有快取功能(我猜測它具有,例如 MPlayer 有選項-cache),您可以使用該功能請求在內部快取資料。然後,它不需要在需要時獲取數據,而是在數據可用時獲取數據。

另一件事是顯示是透過 X 伺服器完成的 - 它的優先順序也必須提高(請參閱 Wumpus Q. Wumbley 在該問題下的評論)。

另外兩個選項是使用 cgroups 和/或 RT 調度程式(第一個選項請參見使用 cgroup 控制應用程式的優先權,對於後者,請參見例如Gentoo說明)。

最後一件事是,您可能想透過關閉不必要的服務來稍微優化您的系統。就我個人而言,我認為 PulseAudio 是首選。

然而,您所描述的聽起來更像是發生了一些高優先級 I/O - 我的猜測是,您經歷了一些繁重的交換 - 您確定您的 tmpfs 沒有被迫被換出嗎?那樣的話,恐怕至少iorenice不會有太大幫助。

答案3

正如其他人所說,系統的許多部分都會受到影響,包括記憶體頻寬,並且系統的這些其他部分也將有自己的調度和優先權。

您始終可以使用chrt -i 0給編譯真正的空閒優先順序。 http://linux.die.net/man/1/chrt

或使用 cgroup 限制編譯。 http://kennystechtalk.blogspot.co.uk/2015/04/throttle-cpu-usage-with-linux-cgroups.html

或把一切都丟給它:

eatmydata cgexec -g cpu:throttled chrt -i 0 ionice -c3 nice -n19 /path/to/compile-script >/dev/null

注意:使用nice -n19時不會有任何影響chrt -i 0,但也不會造成任何傷害。

我古老的 P4 可以做同樣的事情,而 VLC 不會感到不安。

相關內容