使用 cpulimit 來釋放你的 CPU
在 Linux 系統(tǒng)上管理系統(tǒng)資源的推薦工具是 cgroups。雖然在可以調(diào)整的限制方面(CPU、內(nèi)存、磁盤 I/O、網(wǎng)絡(luò)等)非常強(qiáng)大,但配置 cgroups 并不簡(jiǎn)單。nice 命令從 1973 年起就可以使用了。但它只是調(diào)整在一個(gè)處理器上競(jìng)爭(zhēng)時(shí)間的進(jìn)程之間的調(diào)度優(yōu)先級(jí)。nice
命令不會(huì)限制一個(gè)進(jìn)程在單位時(shí)間內(nèi)所能消耗的 CPU 周期的百分比。cpulimit 命令提供了兩個(gè)世界的最佳方案。它限制了一個(gè)進(jìn)程在每單位時(shí)間內(nèi)可以分配的 CPU 周期的百分比,而且相對(duì)容易調(diào)用。
cpulimit
命令主要對(duì)長(zhǎng)期運(yùn)行的和 CPU 密集型的進(jìn)程有用。編譯軟件和轉(zhuǎn)換視頻是長(zhǎng)期運(yùn)行的進(jìn)程的常見例子,它們可以使計(jì)算機(jī)的 CPU 使用率達(dá)到最大。限制這類進(jìn)程的 CPU 使用率將釋放出處理器時(shí)間,供計(jì)算機(jī)上可能運(yùn)行的其他任務(wù)使用。限制 CPU 密集型進(jìn)程也將減少功耗及熱輸出,并可能減少系統(tǒng)的風(fēng)扇噪音。限制一個(gè)進(jìn)程的 CPU 使用率的代價(jià)是,它需要更多的時(shí)間來完成運(yùn)行。
安裝 cpulimit
cpulimit
命令在默認(rèn)的 Fedora Linux 倉庫中可用。運(yùn)行下面的命令,在 Fedora Linux 系統(tǒng)上安裝 cpulimit
:
$ sudo dnf install cpulimit
查看 cpulimit 的文檔
cpulimit
軟件包并沒有附帶的手冊(cè)頁。使用下面的命令來查看 cpulimit
的內(nèi)置文檔。輸出結(jié)果在下面提供。但你可能需要在你自己的系統(tǒng)上運(yùn)行該命令,以防止自本文編寫以來選項(xiàng)發(fā)生變化。
$ cpulimit --help
Usage: cpulimit [OPTIONS…] TARGET
OPTIONS
-l, --limit=N percentage of cpu allowed from 0 to 800 (required)
-v, --verbose show control statistics
-z, --lazy exit if there is no target process, or if it dies
-i, --include-children limit also the children processes
-h, --help display this help and exit
TARGET must be exactly one of these:
-p, --pid=N pid of the process (implies -z)
-e, --exe=FILE name of the executable program file or path name
COMMAND [ARGS] run this command and limit it (implies -z)
演示
為了演示 cpulimit
命令的使用方式,下面提供了一個(gè)精心設(shè)計(jì)的、計(jì)算量很大的 Python 腳本。該腳本首先在沒有限制的情況下運(yùn)行,然后在限制為 50% 的情況下運(yùn)行。它計(jì)算的是第 42 個(gè) 斐波那契數(shù) 的值。該腳本在這兩種情況下都作為 time
命令的子進(jìn)程運(yùn)行,以顯示計(jì)算答案所需的總時(shí)間。
$ /bin/time -f '(computed in %e seconds)' /bin/python -c 'f = lambda n: n if n<2 else f(n-1)+f(n-2); print(f(42), end=" ")'
267914296 (computed in 51.80 seconds)
$ /bin/cpulimit -i -l 50 /bin/time -f '(computed in %e seconds)' /bin/python -c 'f = lambda n: n if n<2 else f(n-1)+f(n-2); print(f(42), end=" ")'
267914296 (computed in 127.38 seconds)
當(dāng)運(yùn)行第一個(gè)版本的命令時(shí),你可能會(huì)聽到電腦上的 CPU 風(fēng)扇轉(zhuǎn)動(dòng)起來。但在運(yùn)行第二個(gè)版本時(shí),你應(yīng)該不會(huì)。第一個(gè)版本的命令不受 CPU 的限制,但它不應(yīng)該導(dǎo)致你的電腦陷入癱瘓。它是以這樣一種方式編寫的:它最多只能使用一個(gè) CPU 核心。大多數(shù)現(xiàn)代 PC 都有多個(gè) CPU 核心,當(dāng)其中一個(gè) CPU 100% 繁忙時(shí),可以毫無困難地同時(shí)運(yùn)行其他任務(wù)。為了驗(yàn)證第一條命令是否使你的一個(gè)處理器達(dá)到最大,在一個(gè)單獨(dú)的終端窗口中運(yùn)行 top
命令并按下 1
鍵。要退出 top
命令可以按 Q
鍵。
設(shè)置高于 100% 的限制只對(duì)能夠進(jìn)行 任務(wù)并行化 的程序有意義。對(duì)于這樣的程序,高于 100% 的增量代表一個(gè) CPU 的全部利用率(200%=2 個(gè)CPU,300%=3 個(gè)CPU,等等)。
注意,在上面的例子中,-i
選項(xiàng)已經(jīng)傳遞給 cpulimit
命令。這是必要的,因?yàn)橐拗频拿畈皇?nbsp;cpulimit
命令的直接子進(jìn)程。相反,它是 time
命令的一個(gè)子進(jìn)程,而后者又是 cpulimit
命令的一個(gè)子進(jìn)程。如果沒有 -i
選項(xiàng),cpulimit
將只限制 time
命令。
最后說明
如果你想限制一個(gè)從桌面圖標(biāo)啟動(dòng)的圖形程序,請(qǐng)將該程序的 .desktop
文件(通常位于 /usr/share/applications
目錄下)復(fù)制到你的 ~/.local/share/applications
目錄下,并相應(yīng)修改 Exec
行。然后運(yùn)行下面的命令來應(yīng)用這些變化:
$ update-desktop-database ~/.local/share/applications