2004年07月15日

「アクセスログ改良その後」MT導入と改造

アクセスログフィルターを改造していくうちに、 「SSI風ページビューログ表示&アクセスランキング表示割り込ませ機能付きアクセスログフィルター」になってきてしまっている。ちょっと詰め込みすぎかな?

あるとき表示がハングってしまいperl.exeがデッドロック状態でプロセスリストを食いつぶしてしまうようになってしまった。 ページを開くと応答がなくなってしまい、ホストマシンではプロセスに休止中のperlがたまっていくという状況だ。 これはSSIとext_filterを同時使用したときのトラブルに非常によく似ている。 ただし、小さなファイルでは問題なく、大きなHTMLファイルだとそうなるようだ。

で、いろいろとやってみたところ、どうやら原因が分かった。 入出ストリーム間のデッドロックが原因のようだ。 スクリプト自体はperlで書いたのだが、フィルターとして機能している部分の核心は、次のようなコードになっていた。

binmode(STDIN);
binmode(STDOUT);
while (<STDIN>) {
    # $_ を加工
    print $_;
}
binmode()を呼んでいるのは、画像などのバイナリーデータもこの処理を通過するからである。

いろいろと試行錯誤して、 ハングする箇所はSTDINを読み込んでいるところであることが分かった。 入力が止まっているので、出力も止まる。 なぜそこで入力が止まるのかは分からないが、とにかく入力ストリームを読み込んでいる 途中で止まっており、その結果出力も止まってしまっている。

これに対処するため、あまり好みではないが、最初にいっぺんにすべての入力 ストリームを読みだし、それから加工して出力するようにした。

my @lines = <STDIN>;
for my $l (@lines) {
    # $l を加工
    print $l;
}

他にも、gifやjpegなどバイナリーデータの場合と、htmlなどテキストの場合とで 処理を分けるようにもした。

これで今のところは応答がなくなってしまうトラブルはでなくなった。

perlやapacheを最新のものにアップデートするなど、いろいろとやってみたのだが、結局はプログラム上の問題であったようだ。だが、なぜフィルターに入力するデータがもうなくなっているはずなのに、入力がストップするのかは依然として謎だ。

この記事のトラックバック用 Ping URL: http://www.mediaware.jp/blog/mt-tb.cgi/35
「アクセスログ改良その後」へのコメント  コメントを書く
「アクセスログ改良その後」へのトラックバック
コメントを書き込む









メールアドレスを記憶する?


この記事の評価
悪い あんまり 普通 まあまあ 良い





@@@@