2006-03-30
■ portsdb, renice

portsdb -Uu が重い
ports tree を cvsup したので、portsdb -Uu した。portsdb -Uu というものが実際に何をしているのかは知らないけれど、とにかく ports tree を更新した後は、それをやるべきである、ということになっているらしい。
ところが、私の PC ではこれがメチャ重い。portsdb -Uu の処理が CPU を使いまくってしまい、Firefox でのブラウジングとか、vi でのコーディング等も重く、遅く感じられるのだ。何をしているのか知らないが、裏でこっそりとやって欲しいものである。
「ああ、優先度を下げて実行すればよかったなぁ」と、後悔した。
優先度を下げて実行する、とは、実際にこういうコマンドを打つことである。*1
# nice +20 portsdb -Uu
これをやらなかったので後悔したのである。
renice
そこで、renice の登場である。
renice は、既に実行中のプロセスの優先度を変更することができる優れものコマンドだ。
まず、どのプロセスの優先度を下げたいのか、プロセス番号を知る必要がある。ところが、portsdb -Uu という処理は、たぶん、きっと、複数の子プロセスを次々と起動したりしているのだろうから、そういうものも含めて全部優先度を下げたい。なので、ここでは、プロセスグループ ID を指定することで、まとめて優先度を下げてやる。
ps コマンドを使って、親プロセス ID、プロセス ID、プロセスグループ ID、NICE 値、コマンド、の 5 つの情報を表示させてみる。
# ps o "ppid pid pgid nice command" PPID PID PGID NI COMMAND (略) 7574 7577 7577 0 /usr/local/bin/ruby18 /usr/local/sbin/portsdb -Uu 7577 7642 7577 0 sh -c cd /usr/ports && make INDEXFILE=INDEX.tmp index && mv INDEX.tmp /tm 7642 7643 7577 0 make INDEXFILE=INDEX.tmp index 7643 7661 7577 0 /bin/sh -ec cd /usr/ports && make /usr/ports/INDEX.tmp 7661 7662 7577 0 make /usr/ports/INDEX.tmp 7662 7668 7577 0 [sh] 7668 7670 7577 0 make -j2 INDEX_TMPDIR=/tmp/index.KM7PdnyS BUILDING_INDEX=1 ECHO_MSG=echo 7670 89788 7577 0 sh -ev 89788 89789 7577 0 make -B _x11-fonts.describe 89789 89795 7577 0 [sh] 89795 89796 7577 0 make -B describe DIRPRFX=x11-fonts/ 89796 89802 7577 0 [sh] 7670 89979 7577 0 sh -ev 89979 89980 7577 0 make -B _x11-servers.describe 89980 89986 7577 0 [sh] 89986 89987 7577 0 make -B describe DIRPRFX=x11-servers/ 89987 89993 7577 0 [sh] 89802 90198 7577 0 make -B describe 89993 90203 7577 0 make -B describe (略) 89420 90205 90205 0 ps o ppid pid pgid nice command
あまりにも長いので略したが、portsdb -Uu の「プロセス ID」は 7577 。そして、このプロセスがつくり出した子プロセスたちのプロセスグループ ID も 7577 だということがわかった。(たまたま同じなのか、そういうことになっているのかはよく知らん)。NI のところが 0 になってるので、ほかのプロセスと同じ、普通の優先度で実行されている事もわかる。
この、7577 という「プロセスグループ ID」を持つ、全てのプロセスの優先度を下げてやろう。優先度を下げるということはすなわち、nice 値を大きくしてやるということだ。
# renice 20 -g 7577
これで、とても重かった PC がとても軽くなった。