或曰

-- 2004年4月中旬 --

Last-modified: Mon, 03 Jan 2005 00:15:01 JST
[dynamic,cache:on]
powered by tds-1.6.2

[著者管理] < = > [上旬] [中旬] [下旬] [一覧] [アクセス解析]
[最新版] [2003年12月以前] [2003年2月以前]


お名前 名前記録
一言
最近の一言
09/07 14:38読んだよ
09/07 14:38読んだよ
04/17 20:30ゆんGNU ld 遅い問題。うちの現在進行中のプロジェクトでも同じ問題に悩んでいたのですが、-Mapオプションを外したところ劇的に速度が改善されました。まさかこんな事だったとは。感謝。そして、ボトルネック調査の重要性を痛感した次第です。
03/01 22:40一生>はりあさん ありがとうございます。後でチェックしてみます。
02/28 13:10はりあ失礼します。BYACC / JAVA(http://troi.lincom-asg.com/~rjamison/byacc/) というのがあります。参考までに。

2004/4/11(Sun) [n]

%1

10:00 起床。

Dell のモニタを配送に来た人に起こされる。

%2 PVM GMake

スケジューラ書き。 要件としては

という程度。

@ 処理の流れ

PVM GMake の挙動としては、大雑把にはこんな感じ。 詳細は remote-pvm.c 参照。

  1. ローカルマシンで make プロセスを起動。
  2. makefile の行単位でジョブを作成する。
  3. 仮想マシンに対して make_pvm コマンドを実行するように要求。
  4. リモートマシン上で make_pvm コマンドが実際のコンパイルプロセスなどを起動。
  5. コンパイルプロセスなどが終了したら pvm を介して make コマンドに通知。

@ 要件 1, 2

仮想マシンに対して make_pvm の実行を要求するのは start_job() @ remote-pvm.c。 デフォルトだとジョブを実行するホストは「PVM のスケジューラにお任せ」となっているが、 ここに手を入れれば要件 1, 2 は解決する。

  1. 事前に pvm_config でホスト一覧を取得しておく。
  2. 現在の PVM では使われていない speed パラメタを参照し、これが 0 のホストにはジョブを割り振らないようにする。
  3. 実行時には PVM GMake が実行しているジョブ一覧を struct Job* jobs; から取得し、make_pvm コマンドを実行している数が最も少ないホストを決定。いくつかあるようなら、乱数で一つ選択。
  4. 選択したホストで make_pvm コマンドを実行するように pvm_spawn() の flag に PvmTaskHost, where にホスト名を渡す。

同時に実行するジョブ数は、 環境変数 MAKE_JOBS で渡すのが運用上楽かな。

@ 要件 3

ローカルマシンでジョブを起動後、 ジョブ状態を監視するメインループ部分は remote_status() @ remote-pvm.c。 pvm_recv() を呼び出してブロックしており、 この関数から戻ってくるまではシグナル配送が行われないのが応答性が悪い原因。

UNIX の流儀だと、 同期関数でブロックされているときにシグナル配送されると、 実行を中断し EINTR 返すのがふつーだと思うけど、 pvm_recv() はそうなってないのね。

まじめにシグナルドリブンに書き直す気はないので、 pvm_recv() 呼び出しを非同期版の pvm_nrecv() + 短時間の usleep() で置き換え。 同時に実行するユーザ数はせいぜい 10 人程度だろうし、 スリープ時間 0.1 秒ぐらいにしておけば、 レスポンスそこそかつ CPU にも大した負荷もかからんでしょ。

テストは会社に行かないとできないけど、 とりあえず動いてるかな。


2004/4/17(Sat) [n]

%1 GNU ld リンク遅い問題

ld をソースから -pg オプションをつけてコンパイルし直して、 実行時プロファイルを取得。 ボトルネックが明確に一カ所に絞れたのでそれに対処したら、 リンクに要する CPU 時間が 50 秒強から 3 秒に減った。

去年から引っ張ってきた問題に終止符。やれやれ。

@ 具体的には

ld 実行時に -Map オプションをつけることで、 実行イメージと同時にシンボル配置情報を記録したマップファイルを出力できるが、 ここで使っているアルゴリズムが極めて非効率的で、 特定の関数を200万回ほど呼び出していた。

短期的にはマップファイルを出力しないことで、 中長期的にはアルゴリズム見直して手を入れることで対処する予定。 もしかしたら最近の binutils では解決されてるかもしれないので、 そっちを調べるのが先か。

%2 分散コンパイル

分散コンパイルに利用している PVM 3.4.4 と PVM GMake, 安定性に難があるのと最近メンテナンスされていないようなので、 捨てようかと検討中。

分散コンパイルを実現する常套手段として、 Make の段階で分散させる以外に、 Make が起動するプロセスの段階で分散させる方法がある。 通常、Make は記述されたプログラムを /bin/sh -c "..." を使って実行するが、 これをリモートホストでプログラムを実行する代物に置き換えればいい。

ただし単純に rsh で置き換えるのでは、幾つか機能が不足する。

このあたりを解決したプログラムとして dish があるが、 どうも挙動が妙な部分があって、 そのまま使うのは難しいと判断。 dish のソースに手を入れて解決するのは構造的に難しそうなので、 アイデアだけもらって同等の実装を用意しようかね。

@ XML-RPC

/bin/sh を置き換える方針を採用すると、

の間で、プロセス間通信、あるいはネットワーク通信が必要になる。 socket() 使ってガリガリ書くのも手だが、 何か良い方法はないかなと探していたところで XML-RPC と、その Perl 用モジュール Frontier RPC, ならびに XMLPRC::Lite を含む SOAP::Lite を見つける。

依存するファイルが多いのでインストールはやや面倒 *1だが、プログラムを書くのは簡単。 これで行けるかな。


*1:FreeBSD とか使ってれば、システムが提供するパッケージシステムを利用してコマンド一発で終わるけど。

%3 マジスパ

ビーフ (虚空150)、まいたけトッピング。食後にココナッツアイス。


2004/4/18(Sun) [n]

%1 部活動

18:30 出発, 1km 泳いで帰宅。

ここのところ足を怪我したり、 週末も微妙に忙しかったりで、 泳ぐのは久しぶりだ。

%2 お買い物

最近二週間分、まとめて記録。

@ 書籍

「年金を問う」は日経新聞の同名の連載をまとめたもの。 読んだ結論として、連載を読んでたので改めて買う必要はなかった。

最後の「Programming Web Services With Perl」は、 昨日調べていた XML-RPC 関連ということで発注。 まだ手元には届かず。

@ 音楽

@ コミックス


2004/4/19(Mon) [n]

%1

10:00 会社着。

%2 お仕事

目の前に〆切がある状況でこの用事の集中具合はマズいので、 緊急でない話は先送りして、 優先度高いモノから手をつけられるように処置する。

月末までは、ずっとこんな調子かも。 ま、ゴールデンウィークはその分長めに休ませてもらう予定だけど。

@ 帰宅

22:00 離脱。


以上、4日分です。 (直前の日記

このページはTomsoft Diary System 1.6.2を用いて生成されています。
Copyright (C) 2004
Issei Suzuki <issei@issei.org>