« Writing a Fast and Secure HTTP Parser (in the case of HTTP::Parser::XS) | Main | Releasing Starlet 0.10, now runs faster than ever »

July 03, 2010

Parallel::Scoreboard でワーカープロセスをモニタリングする方法

 cho45 さんの Plack::Middleware::ServerStatus (Starman や Starlet で Apache の mod_status 相当の情報を得られるようにする - 冬通りに消え行く制服ガールは、夢物語にリアルを求めない。 - subtech) に続き、昨日 kazeburo さんが「StarmanやStarletでmod_statusっぽい情報を得る簡易版Plack::Middleware::ServerStatus - blog.nomadscafe.jp」というエントリを書かれていらっしゃいましたが、ウェブアプリケーションサーバに限らず、複数のワーカープロセスが動作するシステムにおいて、それらの状況をモニタリングするためのスコアボードがほしい、というケースはよくあることだと思います。

 また、プロセス名を使う方法は、他の監視ツールとの相性が悪い、プロセス名の取得方法にポータビリティがない、あまり長いステータスを保存できない、バッファオーバーフローの可能性がある、といった問題があります。

 なので昨日、特定のミドルウェアや特定の規格 (Plack) に依存しない、より汎用的で確実な実装があるといいよね、という話をしていたのですが、気が向いたので書いてみました。新幹線ハック!

 使い方は簡単。なんでも保存できちゃうので JSON で構造化された情報を保存したり、あるいは HTTP の全リクエストを書いておいてモニタリングに活用する、といったことも可能です。

use Parallel::Scoreboard;

# 初期化
my $scoreboard = new Parallel::Scoreboard(
    base_dir => '/tmp/my_scoreboard',
);

# ワーカープロセス側からステータスを保存
$scoreboard->update('this is my current status');

# 全ワーカープロセスのステータスを読み込み
my $stats = $scoreboard->read_all();
for my $pid (sort { $a <=> $b } keys %$stats) {
    print "status for pid:$pid is: ", $stats->{$pid}, "\n";
}

 内部的な仕組みとしては、プロセス毎にステータスファイルを作り、flock を使って死活監視を行うようになっています。

 コードは github/kazuho/p5-Parallel-Scoreboard にあります。また CPAN にもあげておいたので、もうじき seach.cpan.org/dist/Parallel-Scoreboard からダウンロードできるようになると思います。それでは have fun!

注: 「革命の日々! setproctitle(3)のカーネルサポートが-mmに入りました」等を参照

TrackBack

TrackBack URL for this entry:
http://bb.lekumo.jp/t/trackback/404050/24615603

Listed below are links to weblogs that reference Parallel::Scoreboard でワーカープロセスをモニタリングする方法:

Comments

Post a comment