nicer

ysd@KLab > nicer

目次

前書き

nicerは、私が近山・田浦研究室で卒論を書いていたときに、卒論の成果として出来上がったものです。"nice"よりは良いものだと思い込んでいますが、決して"nicest"ではありませんのでその点はご注意ください。

概要

nicer は nice のように、動作させるプロセスの優先度を下げるツールです。(正確に言えば nice は優先度を上げられますが、nicer は下げることしか想定されていません。)しかし、一般に重いプロセスはどんなに優先度を下げても重いままで他のプロセスの邪魔をしてしまいます。そこで他のプロセスが動作している間や、誰かがログインしているときは指定プロセスを動作させず、CPUが空いている時だけ動作させるような処理をしたい時に有効なのがこの nicer です。

前準備

まず、ソースをダウンロードし、解凍します。そしてその中に Makefile があるので make し、出来上がったバイナリをパスの通っている所(例:~/bin/)に置けば準備完了です。
いろいろな証拠を集めていませんが、おそらく Linux なら動くと思います。動く・動かないの判断条件は psw コマンドのオプションと出力フォーマットです。この辺に依存しているところが nicest でない所以です。

ダウンロード

バージョン情報とダウンロード。
nicer-1.2.tar.gz (2006/6/26)
田浦研の斎藤さんが手を加えてバグを取ってくださいました。ありがとうございます。具体的なバグフィクスとしては
  • kernel(具体的にはLinuxの2.4と2.6)の違いでpsの出力が異なるため、同じバイナリを使っていると不具合が起こっていたのを修正。正確には、そのままのソースでLinuxのkernel2.4と2.6に同時対応するよう修正。
  • プログラム指定に絶対Path、相対Pathで指定する必要があった。つまり環境変数$PATHを介した参照をしてくれなかったのを修正。
かな。
nicer-1.1.tar.gz (2005/4/?)
最初のバージョン…からちょっと変更したの。バグあり。

使用方法

コマンド

nicerには元々パスが通っているものとします。
nicer --help
nicer [options] program [arguments ...]
のように使います例えば、普通は
./prime 1000000
とかやるプログラムがあって、それをnicerしたい場合は
nicer ./prime 1000000
のようにして下さい。オプションを使いたい場合には、オプションを指定し、最後にプログラムや引数を指定してください。
nicer ./prime 1000000 -i 10
nicer -i 10 ./prime 1000000

オプション

説明中にある「デフォルト」の値は、ソースプログラムを書き換えることで変更できます。
--help
ヘルプを表示します。分かりにくいとは思いますが、このウェブページを見れば何とか分かるかもしれません。
--kill
指定プロセスを一時停止するときに SIGTERM を送信し、プロセスを潰すことによってメモリ空間の開放を狙います。特に指定が無い場合は SIGSTOP が送られ、サスペンド状態になります。
-k n
一時停止するときに送信するシグナルを n にします。"SIGTERM" や "SIGKILL" という文字列ではなく、シグナル番号を指定して下さい。シグナルとの対応で主なものは表1に挙げますが、足りなければ kill -l で見て下さい。(Ver.1.1以降)
表1.シグナルと番号の対応
送信シグナル番号概要
SIGTERM15Ctrl+Cと同じ?止めようとはするが、シグナルハンドラがあれば捕まる。
SIGKILL9兎に角強制終了。シグナルハンドラにも捕まらない。
-i n
ユーザのアイドル時間が n 秒以下ならば、使用中と見做します。デフォルト値は30です。
-u user[,user,...]
他の条件判断に用いないユーザ名を指定します。複数ある場合は隙間を置かず、コンマで区切って列挙してください。また、ここで指定できるユーザ数はデフォルトでは19人が限界となっています。
-w user[,user,...]
様々な条件判断をせず、ここで指定されているユーザがログインしているだけで指定プログラムの動作を一時停止させます。システム管理の面から、root が必ず含まれます。-u と同様のフォーマットで、同じく19人がデフォルトの限界です。
-n n
他のプロセスについて、nice値が n 未満のものだけを(nice値は小さい方が高優先度)条件判断の材料とします。デフォルト値は 19 です。
-a n
指定プロセスに加える nice 値を n にします。もし nicer が nice 値 -20 で動作しているならn-20 が指定プロセスの nice 値となります。デフォルト値は 40 です。きっとこのオプションを使うことは殆ど無いでしょう。
-n
指定プロセスに加える nice 値を n にします。つまり、ハイフンの直後に数を入力することで -a オプションと同じ効果を得られますので、nice コマンドと同じオプションになります。
-c n
指定プロセスが一時停止中のときに、他プロセスやユーザに関する条件で OK が n 回連続で出れば再開されます。デフォルトは 5 です。
-s n
プロセスやユーザに関する条件のチェックを行う間隔の短い方を n 秒にします。デフォルトは 2 です。
-l n
プロセスやユーザに関する条件のチェックを行う間隔の長い方を n 秒にします。デフォルトは 20 です。

アルゴリズム

時間軸

条件判断

何が問題なのか?

 長いので下の方に置いてます。
 ウェブクローリングや学習、シミュレーションなど長時間かけることで価値が高まる(ようやく価値が出る)プログラムがあります。そんなプログラムを動作させるときの理想は「他のプログラムが動作する時、自分自身は動作しない」というものです。
 nicerはそれを実現させてくれるミドルウェアです。上記のような理想を本当に目指すならOS、もっと具体的にはスケジューラを改造する必要がありますが、su権限を持たないユーザが作り出すことはできませんし、改造を誤るとOS自体が暴走するかも知れません。そのような理由からミドルウェアという形態を取りました。
 ミドルウェアとすることで理想までは遠ざかりました。一体どれくらい遠ざかったのでしょう?ということで以下の2点で実験を行いました。
  1. できる限り長時間動きたい → 他の人の邪魔をしてないか? → 丸1ヶ月連続使用して一応文句の報告無し
  2. 他人のプログラムを邪魔したくない → 実行時間は短くならない? → 2週間の連続使用のうち動作していなかったのは2時間程度
とりあえず目標としていた程度にバランスは取れそうです。調整の方向として、1番は簡単にクリアできるので、その状態を保ったままどれだけ2番を達成できるのかというのが問題だからです。

他の手段は?

スケジューラ書き換え

恐らく理想に最も近い動作を期待できる手段です。kernel自体から様々な情報を得らますし、標準に無い設定を作り出すこともできます。
しかし、一歩間違うとOSの動作を止めることになってしまいます。また、調整をする度に起動し直すことが必要となります。微調整するとなると面倒極まりない。

nice

多分、全部のUNIX系OSにある標準コマンドなので広く垣根無く使えます。
欠点としてはプログラムの動作を止めることが無いため、ず~っと連続的に動作してしまいます。つまりCPU性能の一部を確保しちゃうことになって、他のプログラムから見たら動作速度が落ちてしまいます。

Linux job launcher

下記のSpecial thanksのMonico氏のサイトにあります。
メリットは他人の邪魔をほぼ完璧にしないということです。アイドル時間が1時間未満の人がいたら動きません。この止まりっぷりは「だるまさんがころんだ」をやってる時に「る」から止まってる感じです。
ただ、アイドル時間しか見ていないので、他のユーザのプロセスが1時間以上動作しているとそのまま邪魔してしまいます。あと、適用させるプログラムの指定も含めた、多少の設定をできるファイルを書く必要があります。何度も実行するプログラムがある場合は楽でありがたいのですが、大抵適用させる(つまり長時間走らせる)プログラムは1つ当たり1回ですから煩わしくなるでしょう、きっと。

Special thanks to ...

Chris Monico 助教授
ウェブサイトで公開されている Linux job launcher を元に nicer を作りました。説明によると Linux job launcher の Ver.2 として自由に改変して構わないそうですが、launcher だと名前と動作が合わない感じがして nicer (田浦先生の発案?) と名付け直させていただきました。

GNU GPL の表示

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

再配布・改変に関して

nicer の再配布・改変は自由に行ってもらって構いません。また、改変したものを配布する場合には私の著作権表示を残す義務はありません。ただし、ほぼ変わらない(例えばデフォルトの値を変更しただけ)場合は表示を残してください。また、GNU GPL の観点から強制はできないことですが、nicer は研究目的のために作られたソフトウェアですので、改変をしたものでも再配布する際にお金を取るようなことは避けていただけるとありがたいです。
最後になりましたが、誰かがこのプログラムを綺麗に作り直して "nicest" が出ることを期待しています。

To do (というかやりたいこと)

 卒論中、あまりまともに実験をできなかった(ユーザの出入りが理想通りなクラスタが流石に無いのと実験毎に時間がかかりすぎるのとで)ため、バグがあるはず。バグフィクスしたい。
 …と思ってプログラムを見直すと、他人のプログラムを改編した&時間が経ちすぎたということで、自分自身にとってもかなり読みづらいものになっていることが判明。読みやすく書き直したい。バグも取りやすいだろうし。
 オプションをもっと増やしたい、というより分かりやすいものにしたい。正直、今のままのオプションは分かりにくいと思う。アルゴリズムを知らなきゃ設定できないし。
 分かりやすいドキュメントを書きたい。これは上記のような「やればできる」の類ではなくて「できなけりゃ諦めろ」ってな事だと思うけど…。東大模試の現代文で漢字だけの4点を取ったことがある私でも可能でしょうか?