如何使用標準 GNU/Linux 工具限制進程組的 CPU 消耗?

如何使用標準 GNU/Linux 工具限制進程組的 CPU 消耗?

我有一堆同名的進程 - 它們佔用了我 100% 的 CPU 時間,我希望這個不超過 50%。

如何在不安裝任何額外軟體的情況下做到這一點?

答案1

對於這種情況的核心級機制,您需要閱讀 Linux 上的內容對照組。這是一個仍在積極開發中的領域,因此您需要確保您閱讀的內容與您擁有(或願意安裝)的核心一致。

儘管您說過不要安裝任何額外的東西,但您可能會考慮安裝cgred以自動移動名稱與您的 CPU cgroup 相符的進程。在 Debian 上,它位於cgroup-bin軟體包中。

答案2

您可以透過使用 STOP 和 CONT 訊號的 bash shell、sleep、pgrep 和 pkill 命令來執行此操作。

下面的一行程式碼將使進程最多使用總可用 CPU 時間的 50%。它將每運行 100 毫秒,然後再停止 100 毫秒。

while [ True ]; do pkill -STOP processname; sleep 0.1s; pkill -CONT processname; sleep 0.1s; done

為了方便閱讀,將相同的程式碼分成多行:

while [ True ]
     do pkill -STOP processname
     sleep 0.1s
     pkill -CONT processname
     sleep 0.1s
done

無論有多少進程存在匹配進程名模式,它們都不能超過 50% 的 CPU 使用率,因為它們都是同時停止和繼續的 - 這意味著它們需要在它們之間共享可用的 CPU 時間。這可確保滿足限制。

有一個名為 cpulimit 的程式可以做大致相同的事情。

答案3

無需安裝任何額外的軟體nice。取值範圍是從-2019

nice -20 some_command

some_command給出最高優先權, 和

nice 19 some_command

some_command給出最低優先權

答案4

如上所述,可以用作腳本來協助 OOM-killer 或阻止其使用

假設 cpu 總體達到 75% 並持續 x 分鐘時執行 pkill.sh

 ../scripts/boottime/OOMkiller.sh

while [ true] ; 
    do  inxi -tcm5 > ~/cpu.log 
    sleep 0.5s 
    inxi -tcm5 >> ~/cpu/log | diff -m > ~/offender.log
done

for i in offender.log ;
    do ./scripts/pkill.sh
done

 ../scripts/pkill.sh
while [true] 
    do pgrep $(i) -STOP $PID
    pkill -STOP $PID
    sleep 0.5s 
    pkill -CONT $PID
done

相關內容