Last-modified: Mon, 03 Jan 2005 00:15:01 JST
[dynamic,cache:on]
powered by tds-1.6.2
10:00 起床。
Dell のモニタを配送に来た人に起こされる。
スケジューラ書き。 要件としては
という程度。
PVM GMake の挙動としては、大雑把にはこんな感じ。 詳細は remote-pvm.c 参照。
仮想マシンに対して make_pvm の実行を要求するのは start_job() @ remote-pvm.c。 デフォルトだとジョブを実行するホストは「PVM のスケジューラにお任せ」となっているが、 ここに手を入れれば要件 1, 2 は解決する。
同時に実行するジョブ数は、 環境変数 MAKE_JOBS で渡すのが運用上楽かな。
ローカルマシンでジョブを起動後、 ジョブ状態を監視するメインループ部分は remote_status() @ remote-pvm.c。 pvm_recv() を呼び出してブロックしており、 この関数から戻ってくるまではシグナル配送が行われないのが応答性が悪い原因。
UNIX の流儀だと、 同期関数でブロックされているときにシグナル配送されると、 実行を中断し EINTR 返すのがふつーだと思うけど、 pvm_recv() はそうなってないのね。
まじめにシグナルドリブンに書き直す気はないので、 pvm_recv() 呼び出しを非同期版の pvm_nrecv() + 短時間の usleep() で置き換え。 同時に実行するユーザ数はせいぜい 10 人程度だろうし、 スリープ時間 0.1 秒ぐらいにしておけば、 レスポンスそこそかつ CPU にも大した負荷もかからんでしょ。
テストは会社に行かないとできないけど、 とりあえず動いてるかな。
ld をソースから -pg オプションをつけてコンパイルし直して、 実行時プロファイルを取得。 ボトルネックが明確に一カ所に絞れたのでそれに対処したら、 リンクに要する CPU 時間が 50 秒強から 3 秒に減った。
去年から引っ張ってきた問題に終止符。やれやれ。
ld 実行時に -Map オプションをつけることで、 実行イメージと同時にシンボル配置情報を記録したマップファイルを出力できるが、 ここで使っているアルゴリズムが極めて非効率的で、 特定の関数を200万回ほど呼び出していた。
短期的にはマップファイルを出力しないことで、 中長期的にはアルゴリズム見直して手を入れることで対処する予定。 もしかしたら最近の binutils では解決されてるかもしれないので、 そっちを調べるのが先か。
分散コンパイルに利用している PVM 3.4.4 と PVM GMake, 安定性に難があるのと最近メンテナンスされていないようなので、 捨てようかと検討中。
分散コンパイルを実現する常套手段として、 Make の段階で分散させる以外に、 Make が起動するプロセスの段階で分散させる方法がある。 通常、Make は記述されたプログラムを /bin/sh -c "..." を使って実行するが、 これをリモートホストでプログラムを実行する代物に置き換えればいい。
ただし単純に rsh で置き換えるのでは、幾つか機能が不足する。
このあたりを解決したプログラムとして dish があるが、 どうも挙動が妙な部分があって、 そのまま使うのは難しいと判断。 dish のソースに手を入れて解決するのは構造的に難しそうなので、 アイデアだけもらって同等の実装を用意しようかね。
/bin/sh を置き換える方針を採用すると、
の間で、プロセス間通信、あるいはネットワーク通信が必要になる。 socket() 使ってガリガリ書くのも手だが、 何か良い方法はないかなと探していたところで XML-RPC と、その Perl 用モジュール Frontier RPC, ならびに XMLPRC::Lite を含む SOAP::Lite を見つける。
依存するファイルが多いのでインストールはやや面倒 *1だが、プログラムを書くのは簡単。 これで行けるかな。
ビーフ (虚空150)、まいたけトッピング。食後にココナッツアイス。
18:30 出発, 1km 泳いで帰宅。
ここのところ足を怪我したり、 週末も微妙に忙しかったりで、 泳ぐのは久しぶりだ。
最近二週間分、まとめて記録。
「年金を問う」は日経新聞の同名の連載をまとめたもの。 読んだ結論として、連載を読んでたので改めて買う必要はなかった。
最後の「Programming Web Services With Perl」は、 昨日調べていた XML-RPC 関連ということで発注。 まだ手元には届かず。
10:00 会社着。
目の前に〆切がある状況でこの用事の集中具合はマズいので、 緊急でない話は先送りして、 優先度高いモノから手をつけられるように処置する。
月末までは、ずっとこんな調子かも。 ま、ゴールデンウィークはその分長めに休ませてもらう予定だけど。
22:00 離脱。