AN HTTPD ゲストブック/コメント集(2004年11月16日03:39)


eternally 2005/02/02 23:24

いぜんperlが終了しないということをいっていましたがあれから分かったことがありますので報告します。
あれから5.6で使用していたのですがバーチャルホスト機能で新たにサイトを開設したところ、また終了しないということが起こり始めました。
アクセス解析をしていたので見てみたところ2つのサイトを開設しているせいもあって以前の数倍のアクセス数になっていました。
思うにやはりサーバの処理能力が追いつかなくなり、perlの起動に失敗しているようです。


eternally 2004/12/04 01:50

中田さん

その時に実行した掲示板は
http://www.kent-web.com/bbs/yybbs.html
その次に実行したカウンタは
http://www.cgi-club.com/imCTHTM/

以上の二つです。


中田昭雄 nakata@st.rim.or.jp 2004/12/03 21:04

eternally さん、
とりあえず私がやってみたところでは再現しません。
掲示板は WebForum ですよね?


eternally 2004/11/30 22:08

掲示板を表示させようと実行したときにゾンビプロセスとなり残ります。
当然、掲示板の表示はできません。エラーは500エラーです。
1回目のカウンタではゾンビプロセスは残りません。


中田昭雄 nakata@st.rim.or.jp 2004/11/30 21:08

eternally さん、
なかなか面白い現象ですね。再現させてみようと思います。
「2回目に発生」というのは、2回目の掲示板でCGI実行後も perl.exe のプロセスが残るという意味でしょうか? それとも、2回目の掲示板で500エラーが出るという意味ですか?


eternally 2004/11/30 16:59

以前いっていたperlの件実験できましたのでご報告いたします。
ActivePerl-5.6.1.638→ActivePerl-5.8.4.810
CGIの実行2回目にしてゾンビプロセス発生。
あまりにも早かったので継続するであろうと判断し、以前のバージョンに戻しました。
10回ぐらいでなるだろうと思っていたのですが2回でなってしまうとは思いませんでした。
実行したCGIは1回目がカウンタ、2回目が掲示板です。
以前はカウンタの実行時の方が多く発生していたと思います。
他にも必要な情報等ありましたら何なりと言ってください。
公開できる情報でしたら公開します。


鷹の巣 webmaster@sakaguch.com 2004/11/28 14:38

いと gfh05223@nifty.com 2004/11/27 21:31 さんへ。

> Perlのゾンビプロセスの削除で、常駐プロセスがある場合がちょっと分かり難いように思えるので、思いつきで変則的ですが、

ご指摘ありがとうございます。
常駐perlプロセスとCGIとして起動されたperlプロセスの識別が簡単に出来、素晴らしい方法だと感心しました。
AN HTTPDの設定の解説頁ですから、ご指摘の様にAN HTTPDに特化した方法の方が簡単で、解りやすいです。
# CGIの先頭行のperlへのパスを変更すれば、一般化しますね。
教えて頂いた方法に将来(正月休み?)、変更致します。

余談)
AN HTTPDが落ちる現象を把握する為、中田さんからtrace.logを採取するように指示を受け、trace.logを採取したことがありました。
AN HTTPDが落ちた場合、trace.logのファイルハンドル内のバッファに溜まっている内容をWindowsがtrace.logに追記しないのではないかと疑ったことがあります。
従って、
1. perl.exeのファィル名をperlORG.exeに変更。
2. perl.exeのWrapperを作り、perl.exeの標準入出力をtrace.logに記録し、実際の処理は全てperlORG.exeに行わせる。
という考えがすぐに思いついたのですが、実施するには至りませんでした。
今回のいとさんの提示された方法には、まさに「一本取られた」と思いました。


いと gfh05223@nifty.com 2004/11/27 21:31

鷹の巣さん

Perlのゾンビプロセスの削除で、常駐プロセスがある場合が
ちょっと分かり難いように思えるので、思いつきで変則的ですが、
以下のような方法でも可能ではないかということで。

1. perl.exe をコピーして anperl.exe ファイルを作成
2. AN HTTPDで .pl,.cgiの実行プログラムを anperl.exe に変更
3. 一定時間を経過した不良プロセス anperl を監視し、削除

常駐の Perlプロセスは perl.exeで実行すれば監視スクリプトは
常駐プロセスを気にしなくてよくなると思います。


中田昭雄 nakata@st.rim.or.jp 2004/11/27 07:38

eternallyさん、
Perlのバージョンというのは考えにくいとは思っているのですが、関数のどれかの問題でしょうか。。。
ぜひ Perlのバージョンをあげてみてください。


eternally 2004/11/26 02:32

以前いっていたperlの件ですが、
あれから1週間ほど連続稼働させていましたがperlが残ることもなく正常に動作しています。
やはり、perlのバージョンのせいだったようです。
週末にでもperlのバージョンをあげてみたいと思いますがサイト観覧者の方に迷惑をかけるわけにはいかないので以前と同じ現象が起きるようなことがあれば即戻したいと思います。


鷹の巣 webmaster@sakaguch.com 2004/11/21 23:33

中田昭雄 nakata@st.rim.or.jp 2004/11/20 07:10 様

いつもお世話になっております。

「AN HTTPD 自動再起動プログラム anhttpd_restart」
http://homepage1.nifty.com/yito/anhttpd/anhttpd_restart.html
のWebページを参考(基底)にして、「Windows用不良Perlプロセス削除スクリプト」
http://sakaguch.com/DownLoad/perl_kill.pl.txt
を公開致しましたので、報告させて頂きます。

「おまけ2(perlスクリプトのゾンビプロセスを監視して強制排除)」
http://sakaguch.com/SetAnhttpdSec.html#zombie
にこれまでの経過と解説を追記しました。

# 皆様、間違い等ありましたら、ご指摘して頂くと嬉しいです。

> Error 500 の話、GetSearchWord で alarm を使用しない場合はどうなるでしょうか?

上記の削除スクリプトのログファイルから、ゾンビプロセスを発生させる原因の追求が容易になるのではないかと期待しております。
その内にSSIを全て復帰させて、Webサーバに負荷をかけます。それから、GetSearchWordで、alarmを使用しない場合にどうなるのかを調べてみたいと思います。
その後にまた、報告にあがりますので、宜しくお願い致します。


eternally 2004/11/20 13:34

中田さん
1週間後に時間があれば試してみたいと思います。


中田昭雄 nakata@st.rim.or.jp 2004/11/20 07:11

eternally さん、
eternally さんのところでは、昔から時々 Error 500 が出ていた時がありました。
前の、
http://homepage1.nifty.com/yito/namazu/gbook/20031228.0406.html
の時も、しばらくしたらなぜか起こらなくなっていますよね。
もし、Perlのバージョンで落ち着くようなら、再度バージョンをあげて起きるかどうか確かめてみてください。


中田昭雄 nakata@st.rim.or.jp 2004/11/20 07:10

鷹の巣さん、
Error 500 の話、GetSearchWord で alarm を使用しない場合はどうなるでしょうか?


eternally 2004/11/20 05:33

いとさん、ありがとうございます。

perl問題か確認するため1週間ほどVer5.6.1で様子を見てみたいと思っています。
1日経過しましたがperlが残ることも今のところありません。
もしかしたらperlの処理が追いつかなかったのかもしれません。
CPUが333MHzというかなり低速なので・・・。

あと、今更ですが54KBではなく56KBでした。
お詫びして訂正します。


鷹の巣 webmaster@sakaguch.com 2004/11/19 22:37

いとさん、有用なツール、ありがとうございました。

PsToolsのpslist.exeをWindows2000 Professionalで実行すると、
Process performance object not found on ログ中のユーザ名
と言うエラー表示が出ました。私と同じ様な環境の方のために、「いとの掲示板」
http://hpmboard1.nifty.com/cgi-bin/thread.cgi?user_id=GFH05223
に報告させて頂きました。


いと gfh05223@nifty.com 2004/11/19 00:14

eternallyさん

原因究明には役立たないかもしれませんが、サーバ運用上は役立つと思うので、
よければ以下のプログラムを試してみてください。

ひとつは先日公開した、AN HTTPDの応答をチェックして再起動をかける
以下のプログラムです。
http://homepage1.nifty.com/yito/anhttpd/anhttpd_restart.html

Error 500が出続けているかどうかをチェックするには、$fnameを設定します。
Win2000では他にも変更個所があるので readmeで確認してください。

もし perl.exe を kill する必要があるなら、
kill -f perl.exe
を実行します。もし cygwinをインストールしていると cygwinの killが
実行されないように kill.exeをフルパスで書く必要があります。

perl.exeのkillだけでなく、サーバが落ちたときにも対応できるので
AN HTTPDを再起動させるのがいいかと思います。

もし、AN HTTPDをサービスとしてではなくアプリケーションとして
動かしているなら、掲示板の 5.を参考にしてください。

もうひとつは、ある意味 eternallyさん専用仕様のプログラムですが、
メモリ使用量が 54KB、あるいは 起動後 10分以上経過しているperl.exeがあれば
killするバッチプログラムです(多少手抜きしている個所があります)。
10分という経過時間でkillするのは perl.exeが 54KB以外であったときの保険のためです。

短いので以下に書きます。ファイル名を kill_perl.batとでもして実行してください。

----この次から 
set SLEEP=60
:top
pslist -m|find "perl"|find " 54 "
if errorlevel == 1 goto next
echo ($sec,$min,$hour,$mday,$mon,$year)=localtime(time);printf ("%%4d/%%02d/%%02d %%02d:%%02d:%%02d perl.exe\(54KB\) killed.\n",$year+1900,$mon+1,$mday,$hour,$min,$sec);|perl >>log.txt
pslist -x perl>>log.txt
pskill perl.exe

:next
pslist -x|find "perl"|find " 0:1"
if errorlevel == 1 goto end
echo ($sec,$min,$hour,$mday,$mon,$year)=localtime(time);printf ("%%4d/%%02d/%%02d %%02d:%%02d:%%02d perl.exe\(10min\) killed.\n",$year+1900,$mon+1,$mday,$hour,$min,$sec);|perl >>log.txt
pslist -x perl>>log.txt
pskill perl.exe

:end
echo sleep %SLEEP%;|perl
goto top
----この上まで
10分というのは例えばなので、5分でkillしたいなら " 0:1" の箇所を
" 0:05" と変更し、SLEEPは 60ではなく 50(秒)くらいに少し小さくした方がいいかと
思います。経過時間をチェックした時刻が 0:04:59 の次は 0:06:01 だったとなると
見逃してしまうので、多少マージンを見るためです。

pslistと pskill は以下から Pstools.zip をダウンロードして解凍してください。
http://www.sysinternals.com/ntw2k/freeware/pstools.shtml

どちらのプログラムを使っても log.txtにログが作成されるので、発生頻度や
発生時刻からどの CGIかを特定する手がかりが得られるかと思います。

ちなみに私は Error 500が連続するというトラブルは経験したことはないです。


eternally 2004/11/18 20:30

鷹の巣さん、別にかまいませんよ。

中田さん、
書き忘れましたが前バージョンに戻してみましたが状況は変わりませんでした。


鷹の巣 webmaster@sakaguch.com 2004/11/18 18:17

eternallyさんへ
今晩は。
2004/11/18 12:28の投稿で、eternallyさんの敬称を省略してしまいまして、失礼しました。

中田さんから、「CGIの中での外部プログラムの呼び出しの問題」とご指摘を受けていますので、私はCGIと外部プログラムが同じプロセス番号がになる様にCGIを変更して経過観察して見ようと思います。


eternally 2004/11/18 16:26

以前にはperlが残るということはありませんでした。
原因にperlのバージョンが関係しているような気がします。
本日中にもperlのバージョンを以前のものに戻してしばらく様子を見てみようと思います。
また何かありましたらご報告します。


鷹の巣 webmaster@sakaguch.com 2004/11/18 12:28

中田さん、いつもお世話になっております。

私もeternallyの現象と関係があるかも知れませんが、1.42hと1.42kと1.42mを試しまして、Error 500が発生し、結局「他人のクッキーデータが表示される」
http://sakaguch.com/PastBBS/0034/B0017024.html
という事態に陥りました。そこで、1.42mで、SSIを全てWebページから撤去すると、今のところError 500は発生しなくなりました。
# 現在は1.42nです。

2004年10月は、主として
ホームページのhttp://sakaguch.com/が、69745ページビュー
ツリー式掲示板のhttp://sakaguch.com/cgi/bbs/が44059ページビュー
でした。
SSIの撤去前は、ホームページに
<input type="text" name="query" size="30" value='<!--#exec cgi="/cgi/GetSearchWord.cgi" -->' />が1個
<input type="text" name="ipd" size="50" value='<!--#echo var="REMOTE_ADDR"-->' />が2個
ありました。
GetSearchWord.cgiは、以下の様なperlのスクリプトです。
http://sakaguch.com/utf1.html#SearchWord
http://sakaguch.com/DownLoad/GetSearchWord.cgi.txt

今後CGIだけで、Error 500が発生しましたら、再度報告致します。


中田昭雄 nakata@st.rim.or.jp 2004/11/17 20:52

eternally さん、
でしたらCGIの中での外部プログラムを呼び出しの問題でしょう。
つまりCGIの問題ではないかと思います。


eternally 2004/11/17 03:25

http://homepage1.nifty.com/yito/namazu/gbook/20040719.0941.html
上のページにあるような状態です。
Error 500がでてその後は一切CGIの処理ができない状態になります。
perlを手動でプロセスの終了をすればまた処理ができるようになります。
OSの新規インストールはすでに試してあるのでperl側かANHTTPD側にあるのでは、と思った次第です。


中田昭雄 nakata@st.rim.or.jp 2004/11/16 21:06

eternally さん、
とりあえず、「CGIの実行に失敗」というのはどういうエラーになるのですか?


eternally 2004/11/16 03:39

おひさしぶりです。

以前も投稿しましたがperlが正常に起動しないという状態が起きています。
正常に起動しないというのはperlが必ず54KBしかメモリ使用状態にならず、
CGIの実行に失敗し、perlも終了しない状態です。
システム情報より実行中のタスクを調べてみたところperlの実行パスが不明になっていました。
perl自体は正常に動作し、CGIの実行もできます。
この現象が起きるCGIは一定ではなく、特定の周期等はありません。
perl、ANHTTPDのバージョンアップをしてから起こり始めたような気がします。
先日初期化を行いましたが一向に改善されませんでした。むしろ状況は悪化しました。
一度ANHTTPDのバージョンを1.41gに下げて様子を見てみることにします。
中田さんの方でも調査できるようでしたらお願いします。
各バージョン等は
OS:Windows2000SP4
ANHTTPD:1.42n
perl:5.8.4 built for MSWin32-x86-multi-thread
他にも必要な情報等ありましたら言ってください。
早急に用意いたします。お忙しいとは思いますが調査のほどよろしくお願いいたします。