AN HTTPD ゲストブック/コメント集(2003年10月5日02:10)


坂本 admin@tumitobatu.com 2003/10/07 17:24

>中田さん
そうでしたか。いろいろとありがとうございました。
一応、報告しますと、
・重いCGIで、かつ、別のCGIを require で呼んでいるスクリプトでエラーが出た
・しかし、そのスクリプトを同じ条件・同じ方法で何回実行してもエラーが一度も出ない場合もあった
・require で呼び出す先のスクリプトは、固定値とランダム値を返すだけの、数行程度の簡単なもの
(ちゃんと最後の行は 1; としてます)
・エラーが出たあと、2・3秒後に再読み込みなどで実行すると、大抵正常に動作した
・読み込み中に中止したり違うスクリプトを読み込んだり等は、一切していなくても出た
(私自身、何度もエラーを再現させました)
・同じ時間に同じスクリプトを、数人で実行したりしていた
・CPU使用率は、100%には一度もならなかった
・AN HTTPD 再起動直後などでも、エラーは出た

以上が私の環境・現象です。
残念ながら、別のWebサーバを使う、という回避策を採ろうと思います。
他の点で全く不満は無く、使いやすさなどは最高でしたので、もし上記が起きないようになったら、
再度 AN HTTPD を使わせていただきます。
これからも頑張ってください。ありがとうございました。


中田昭雄 nakata@st.rim.or.jp 2003/10/06 20:47

坂本さん、
AN HTTPD を使わないという回避策をとることをおすすめします。
というのは今のところ原因がわかりませんし、したがって回避策は不明ですから。

一応説明しますと、
「一度出始めると全部のCGIスクリプトで出ます」というのはちょっと不親切でした。
これは、同じスレッド番号のCGIスクリプトではCGIスクリプトにかかわらず出ます、という意味です。
スレッド番号というのは errors.log に出てくるのですが、同時アクセスがあるとスレッド番号は 0,1,2.. と増えていきます。Thread 2 で「リネームできない」エラーが出たとすると、以後 Thread 2 では必ずそのエラーが出ると思います。(場合によってはしばらくすると出なくなります。)

このエラーは、今わかっている範囲では、CGIの中で別のCGIやメール送信などの外部プログラムを呼び出している場合に出ます。重い処理をするCGIの場合は、外部プログラムを呼び出した後でクライアントが途中で中止ボタンを押したり別のページをロードしたりすることがよくあるので、その時に外部プログラムが実行中だと「リネームできない」エラーになります。
これは AN HTTPD のバグなので、それを回避するには外部プログラムを呼び出さないようにするなどCGIを改造するか、上のようなことがおきたら外部プログラムがすぐに終了するようにする必要があります。

いずれにしろ、原因をつきとめて回避策をとるのはちょっと面倒だと思われます。
したがって、AN HTTPD ではなく、Apache や IIS など他の HTTPサーバソフトを使うことをおすすめせざるを得ません。


坂本 admin@tumitobatu.com 2003/10/05 23:07

>中田さん
えっと、そのエラーが出た後も普通にCGIが動作したりするんですけど・・?
全く同じスクリプトを全く同じデータで全く同じように実行しても、
エラーが出る時と出ない時があり、また連続するわけではありません。
エラー出た後、そのまま再読み込みしても、出る時と出ない時があります。
また、CPU使用率をチェックしてますが、100%にはなってません。
スクリプトは、正常終了時もエラー時も必ず「EXIT」はしています。
原因、及び回避策など、何かありますでしょうか?
かなり真剣に困ってます。よろしくお願いいたします。


中田昭雄 nakata@st.rim.or.jp 2003/10/05 06:46

坂本さん、
そのエラーは一度出始めれば全部のCGIスクリプトで出ます。
まず、最初に出るスクリプトを特定してみてください。


坂本 admin@tumitobatu.com 2003/10/05 02:10

初めまして。
Win2000 Pro で AnHttpd 1.42k で CGI ゲームサイトを運営しております。

かなり負荷の高いゲームのせいか、たまに
Can't create file for stdin in spawnProcess
というエラーログと共に 500 エラーが出ます。
CGI出力を検査にチェックを入れると、エラー画面には
「標準出力一時ファイル 1.x を stdout.x にリネームできません。」
と出ます。stdout も stdin も出ます。
全スクリプトで出ていて、かつ再現性が数%程度のエラーです。
過去ログに似た件はありましたが、再現性は数%ですし、再起動等をしても
変化がありませんので原因は違うと思われます。
原因、及び対処(回避)方法など、分かりましたら教えていただけると大変嬉しいです。
以上、長くなってしまいましたが、ご回答のほどを何卒よろしくお願いいたします。