- ベストアンサー
IISがフリーズ
漠然としていて申し訳ありませんが、 Windows Server 2000 + IIS5.0 + ASPで イントラネット用のサイトを構築していますが、 一日に一度くらいの割合で、サイトが反応しなくなり、 IISを再起動が必要になってしまいます。 システムのイベント IISのログ 等に不正だった痕跡は残っていません。 現在、分離プロセスで動かしています。 また、たまに DLLHISTがCPU100%の状態が続くことがあり、 ワームの感染について調べましたが、 その可能性はないようです。 どなたか、このような状況についてご存知の方がいらっしゃったら、アドバイスをお願いいたします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#3、#5、#6です。 > その様な場合、タスクマネージャの"DLLHOST"のメモリ使用量は、600人の時は人数に応じて増加し、 > 終了後は、完全に元に戻るのでしょうか? 完全な統計をとったわけではないのですが、600→100人にアクセス数が落ちるとメモリ使用量は減少していました。 Cで作成したDLLの不具合の件です。 どこにメモリリークするか、と聞かれての推測ですが おそらくDLLHOSTかと。 DLLの開発はしたことがないので以下、推測になります。 断言はできないですが、メモリリークというかIISがフリーズした原因はおそらくコレでしょう。 DLLでのミスはOSに致命的なダメージを与えます。 ご存知かと思いますが、C言語は非常に融通の効く言語です。 ASPと違って幅広く開発できる一面、バグがあるとシステムを不安定にさせる要因にもなります。 WinSockはおそらくAPIを使っていますよね? APIはシステムに密接に関連するところですし、メモリまわりで不具合が出て、 OSやIISの動作にも影響が出たと推測するのが妥当、かと。
その他の回答 (7)
- LemonT
- ベストアンサー率49% (39/79)
慣例に従い、#2、#4です。(汗) >また、少し話がそれそうですが、最後にもう一つ、 >実は、ソケット関連の処理にミスがあり、 >クライアント側で recv 前に ソケットを再定義してしまい、 >recv で Winsock の WSAENOTSOCK"10038" のエラーが発生しました。 >当然その後の close も出来ず、 WSACleanup も出来ませんでした。 Cで作成したDLLをCOMコンポーネントとして登録しているんですよね。これに不具合があれば致命的なんでしょうね。 以下、IIS 5.0 Documentation からです。 パフォーマンスとアプリケーションの保護レベルは、両方を十分に満たすことのできないトレードオフの関係にあります。Web サービスのプロセス (inetinfo.exe) でアプリケーションを実行するとパフォーマンスは向上しますが、アプリケーションが誤動作した場合に Web サービスが利用できなくなるリスクが増大します。inetinfo.exe、また必須のアプリケーションは、そのもののインプロセスで、その他のアプリケーションは共有のプール インプロセスで実行することをお勧めします。 また、 > APで用意した改ページボタン、ブラウザの戻るボタン、ガンガン押された場合、 にサーバに負荷がかかる件ですが、 改頁ボタンの対策は、#3、#5、#6さんのおっしゃる手法が定石かと。。。戻るボタンを無効(左右されないようにする)にする方法もいろいろあるかと。。。
お礼
いろいろありがとうございました。 >Cで作成したDLLをCOMコンポーネントとして登録しているんですよね。これに不具合があれば致命的なんでしょうね。 やはりそうですか。 これを修正し様子を見ることにします。
- blood_kazuaki
- ベストアンサー率40% (39/96)
#3、#5です。 > やはり負荷の問題と思われますが・・・。 どれぐらいの負荷がかかるのでしょうか? 私の環境では、一時間に600人がガリガリ動かしても 全く問題なかったですよ(^^ (メモリ使用量はそれなりに増加しましたが、全然余裕でした。) その時はサーバ処理能力うんぬんより、ネットワークがかなり遅くなりました。SSL通信しているので、さらに遅くなります。。。 > APで用意した改ページボタン、ブラウザの戻るボタン、ガンガン押された場合、 > (以下略) 参照のみであれば、整合性うんぬんはないと思います。ただし、2回ボタンをクリックすれば、処理は2回走るはずです。(推測) 参考までに。 こちらのシステムではJavaScriptで、ボタンを1回しか押せないよう制御をかけています。 外部公開向けシステムなので、クライアント側でJavaScriptが無効になっていると意味がないですが。。。
お礼
何度も申し訳ありません。 >私の環境では、一時間に600人がガリガリ動かしても >全く問題なかったですよ(^^ その様な場合、タスクマネージャの"DLLHOST"のメモリ使用量は、600人の時は人数に応じて増加し、 終了後は、完全に元に戻るのでしょうか? また、少し話がそれそうですが、最後にもう一つ、 実は、ソケット関連の処理にミスがあり、 クライアント側で recv 前に ソケットを再定義してしまい、 recv で Winsock の WSAENOTSOCK"10038" のエラーが発生しました。 当然その後の close も出来ず、 WSACleanup も出来ませんでした。 この、ポートがクローズ出来ていない事や、 ソケット(パケット?)が中に浮いてしまった事での メモリリークの可能性は大きいでしょうか? また、もしリークするとしたら、 タスクマネージャのどのプロセスに現れるのでしょうか? すっかり甘えていますが、この辺りもお詳しい様でしたらお願い致します。
- blood_kazuaki
- ベストアンサー率40% (39/96)
> また、1Gのメモリを実装していて、28M程度の使用メモリで落ちているようなのですが、 > 実際、使いすぎでしょうか? いえ、問題ないと思います。 ソース側で問題ないとしたら、、、 #2さんがおっしゃる「プールプロセスで安定」を試すのがいいと思います。 ちなみに、私の環境もメモリ1Gで、プールプロセスで動いています。 参考までにお尋ねしたいのですが、IISがフリーズするタイミングは特定の条件なのでしょうか? このasp実行時にフリーズするとか、更新画面で停止するとか。。。 原因の切り分けができるといいのですが。。。
お礼
度々ありがとうございます。 タイミングですが、 イントラネットという事で切り分けは難しいのですが、 私のテスト環境では全く起きませんので、 やはり負荷の問題と思われますが・・・。 ちなみに、ASPでは、 例えば、せっかちなユーザさんがいて、 APで用意した改ページボタン ブラウザの戻るボタン、 ガンガン押された場合、 処理の整合性を保つためにアプリ側での 必須の処理等はあるのでしょうか? (処理的には、ブラウザからの要求で、Cで作ったソケット関連のDLLを介し、サーバのDBに参照のみ行う感じです。)
- LemonT
- ベストアンサー率49% (39/79)
#2です。 「プールプロセス」にすれば安定することはあり得ます。 一説によると、IIS 4.0の「分離プロセス」では、bugとかで安定しないことがあるようです。 IIS 5.0については定かではありませんが。。。 IISで不可思議な挙動=プログラムの仕業ではなかったことって結構ありました。(これは私だけ?かも。。。)
お礼
度々ありがとうございます。 >IISで不可思議な挙動=プログラムの仕業ではなかったことって結構ありました。 やはりそうですか・・・ ソケット解放を対応したAP+プールプロセスで安定してくれればいいのですが・・・。 とりあえず様子見ですね。
- blood_kazuaki
- ベストアンサー率40% (39/96)
> あるクライアントで無限ループに陥った場合、 > それは、全てについて影響し、IISのリセットにつながるのでしょうか? メモリリークしてIIS、というかサーバ(OS)自体が停止することがあります。 無限ループに限らず、プログラム内でのオブジェクトの解放し忘れがあっても、 小さいことが積み重なってメモリリークが大量に発生して サーバが停止することがあります。 大量アクセスのWin系サーバでは一日に一回、夜間で再起動を行うのが一番堅いです。 (私のてがけるシステムでは、そのようにしています。) DLLHOSTがCPU100%になる、というのは通常はあまりありえませんね。 プログラムに何か問題があるかもしれません。 どのプログラム(ソース)に問題があるのか、原因を突き止める必要があるかもしれませんね。 少しずつ画面を動かして、DLLHOSTが100%になるタイミングを手作業で調べてみてはいかがでしょうか。
補足
ありがとうございます。 ソースを見たところ、 ソケットを解放していない場合がありこれを解消しテスト環境で動かした所、 プロセスが使うメモリが少なくなった感じはありません。 タスクマネージャのプロセスで"DLLHOST"の使用メモリが増えていく=メモリリークと考えて間違えないでしょうか? また、1Gのメモリを実装していて、28M程度の使用メモリで落ちているようなのですが、 実際、使いすぎでしょうか? 以上、申し訳ありませんが宜しくお願いいたします。
- LemonT
- ベストアンサー率49% (39/79)
はじめまして。 >この分離プロセスでは、 > クライアントがサイトを開く毎に"DLLHOST"のプロセスがサーバで立ち上がるのでしょうか? そのご解釈でよろしいかと思います。 > そしてもし、これらも含めてリソース不足等の問題が発生しIISの動作に影響した場合、I > ISのログやサーバイベントになんらかの痕跡が残っているものなのでしょうか? IIS自体に影響する問題が発生した場合、正しい痕跡が残される可能性はあまり高くないと思われます。 「プールプロセス」ではマズイ事情がおありなんでしょうか?
補足
ありがとうございます。 >IIS自体に影響する問題が発生した場合、正しい痕跡が残される可能性はあまり高くないと思われます。 やはりそうなのですね。 >「プールプロセス」ではマズイ事情がおありなんでしょうか? 問題ないはずです。こちらの方が安定しますか?
- stepping3
- ベストアンサー率0% (0/8)
ソースに無限ループになる可能性のある記述って無いですか? レアなケースで起こりえるとかも考えられますので、チェックしてみてはどうでしょうか? ソースが無ければこれくらいの事しかいえませんが…。
補足
早速有難うございます。 IISやASPについて不勉強なもので初歩的な質問ですが、 あるクライアントで無限ループに陥った場合、 それは、全てについて影響し、IISのリセットにつながるのでしょうか? また、質問が少し変わりますが、 分離プロセスで動かすと、 サーバのリソースを多く消費するとMSのサポート等にあります。 この分離プロセスでは、 クライアントがサイトを開く毎に"DLLHOST"のプロセスがサーバで立ち上がるのでしょうか? そしてもし、これらも含めてリソース不足等の問題が発生しIISの動作に影響した場合、I ISのログやサーバイベントになんらかの痕跡が残っているものなのでしょうか? 申し訳ありませんが、宜しくお願い致します。
お礼
いろいろありがとうございました。 DLLは本当に怪しいのですが、 メモリリーク等の具体的な現象も把握できない状況では なかなか修正の許可が下りない(フリーズの対処として) ので困っていましたが、 やはり一度DLLを直し様子を見ようと思います。 (できればプールプロセスも)