非常に時間のかかるコマンドなんかを実行した時、「今はちょっとブラウザ見たいから、お前ちょっと黙っててくれない。」なんて気持ちになる時がある。
ちょっと調べたら、その名の通り、cpulimitなるコマンドがあった。ubuntuならパッケージで簡単インストール
使い方は、
* プロセスID指定(50%)
1 |
$ cpulimit -p 12345 -l 50 |
* 実行ファイル名指定(50%)
1 |
$ cpulimit -e dd -l 50 |
* PATH指定(50%)
1 |
$ cpulimit -P /bin/dd -l 50 |
とこんな感じ
ちょっと試したところ
1 2 3 4 5 6 7 8 9 10 11 |
$ dd if=/dev/urandom of=/dev/null & $ top -b -n 1 |egrep " dd|PID" PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2752 foo 20 0 12432 680 560 R 103.6 0.0 1:37.03 dd $ cpulimit -e dd -l 30 & $ top -b -n 1 |egrep " dd|PID" PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2752 foo 20 0 12432 680 560 T 32.3 0.0 2:20.74 dd |
とこんな感じ。上はいい感じの部分をとってるが、パーセンテージは結構ばらついていた。
仕組みを解説されているかたがいたのですが、
SIGSTOP
SIGCONT
を繰り返しているだけの模様。実際straceで見てもそんな感じだった。
シグナル送るだけなら、whileループで回せば、sleep時間調整すれば同じようなこと出来るんじゃないかと思ってやってみた。
1 |
while /bin/true ; do kill -SIGSTOP 2752; sleep 0.0001; kill -SIGCONT 2752; done |
これで40%近くで安定した。sleep値はモロ環境に依存すると思う。