
我有一堆同名的進程 - 它們佔用了我 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
。取值範圍是從-20到19。
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