- - PR -
Webアプリケーションが突然動かなってしまう
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-06-27 19:52
繰り返しますが、
だいたい、なぜ、コネクション回数が多いことと、ワーカプロセスが停止することが関係していると考えたのでしょう?例えば、Oracleの監視ツール(OEMなど)でOracleへの接続待ちが発生しているとか、パフォーマンスが極端に低下しているなど、原因と呼べるだけの現象をつかんでいるのでしょうか? しかし、それが原因でないことは、『現象は改善されていません』というところに出ていると思います。 それで、申し訳ないですが、そのプロジェクトのリーダ、または課長クラスの上司とのやりとりで、どの様な報告をし、どの様な返答があったのか、お教え頂けないでしょうか? というのも、先にも書いたように、私は、『原因がつかめていないのに、遠隔地&文字だけのコミュニケーション&即時性がないところで解決を図ろうとするのは、間違っている』と、思うのです。今回の私の指摘、
というのは、私が上司なら、[投稿日時: 2005-06-23 20:33]の内容を報告として受けた時点で尋ねると思うのです。正しくは、「私の上司はそのように尋ねてきた」、ですけど。 また、上司である人も、それなりに経験をしてきているでしょうから、自分の経験から「こうした?ああした?」と聞いてくると思うのです。それらは行ったのでしょうか? つまり、「あなたは本当に上司に報告を行いましたか?」ということを尋ねています。 もし「報告は行った」ということならば、大変失礼なことですが、「あなたの上司は常識的なアドバイスができますか?」ということを尋ねています。 もし、「上司は、確かにそのように質問してきた」ということであれば、あなたが行った返答を教えてください。あなたが行った返答と同じことをアドバイスとして与えられても、困りますよね? 今回のご質問に関する私の意見をまとめます。
_________________ | ||||||||
|
投稿日時: 2005-06-27 21:42
Jittaさんがおっしゃっている内容と同じ事を上司にも言われました。
最初に掲示板に書き込みをした時は、上に報告するのと同時にその内容と同じ事を書き込みさせていただきました。 >なぜコネクション回数が多いことと、ワーカプロセスの停止が関係していると考えたのか? なぜコネクションに目をつけたのかといいますと、今のプログラムになる前はセッションを多数使用していました。 しかし、サーバーのメモリがパンクすることを恐れ、それを改善するためにセッション情報のほとんどをオラクルに保存するようにプログラムを変更しました。 すると次は、アプリケーションが立ち上がるときにクラスでコネクションを発行していたのですが、「Shared」を使用していたため、複数ユーザーが同じコネクションを使用してしまう現象が発覚してしまいました。 そして次に「Shared」を外し、プロシージャ内でコネクションの接続、切断を行うようにしたのですが、キー情報を取得するための関数で毎回接続、切断を行うようになってしまいました。 そして今回のような現象が出てしまったので、コネクションが原因かと思ってしまいました。 冷静に捉えれば最初の段階から既に出ていた現象かも知れないのに、目の前しか見えてなく変更したコネクションが原因だと思い込んでしまいました。 >上司とのやりとりは、(可能な範囲で)提供してください >行ったこと、その結果は、(可能な範囲で)提供してください 私が報告した内容です。 ・アプリケーションが停止状態時に、タスクマネージャーの「aspnet_wp.exe」を終了させれば現象が改善されるため、「デッドロック」が発生している事が原因と思われる。 そこで「コネクション」が怪しいと思うので、それを利用しているプログラムの改修を行っている。 それに対し上司に言われた事は、「デッドロック」が起こる原因自体を調べることが先だと言われました。 「デッドロック」が発生する理由が理解できれば、その内容を元にプログラムを追い、発生の原因となるソースが見つかるのではないのかということでした。 今回の私の一番いけなかったところは、そもそも「デッドロック」がどのようにして発生してしまうのか、その理由自体を理解していないところだと思います。 情けない話なのですが、いろいろホームページ等で調べたのですがこれといってはっきりと理解することが出来ませんでした。 「待ち合い状態」になるということが原因だとわかったのですが、そもそも「待ち合い状態」というのがどのような状態なのか理解できませんでした。 もうひとつ、「スレッドプール」がいっぱいになると同じような現象が起きるとの記述もありました。 そこでいまさらなのですが、どのような事象により「デッドロック」が発生してしまうのか、「待ち合い状態」「スレッドプール」とはいったいどのようなものなのか、ご教授していただけないでしょうか。 大変わがままを言ってしまい申し訳ないのですが、どうかよろしくお願いいたします。 | ||||||||
|
投稿日時: 2005-06-28 22:26
当然の返答だと思います。失礼な疑念を持ちましたことをお詫びします。 セッション変数にしまうものをデータベースに放り込めたということは、セッション変数にしまっているものはシリアル化できるものだと思います。そうであれば、セッション管理をアウトプロセスで行うという方法もありました。 また、これはできるかどうか疑わしいですが、MSDEでセッション管理をさせることもできたのではないでしょうか。もっとも、データ管理用のOracleと、セッション管理用のSQL Server Desktop Editionが起動することになるので、あまりいい環境ではないと思いますけど。 これらは検討されなかったのでしょうか? 改修方法ですが、どの様な改修を行っていますか?まず、ConnectionがCloseされているか、確認しましたか?開いたConnectionを必ず閉じていれば、一時に大量のアクセスがない限り、大丈夫だと思うのですが。 また、セッション変数にしまうものは、クラスや構造体にしてしまっていますか?そうすれば、Loadイベントでインスタンス変数に取り出して、SetViewStateやPreRenderあたりで書き出すというように、2回のアクセスですむようになります。
どのようにして、というか、ワーカプロセスがデッドロックをおこしているのか、オラクルのデッドロックがワーカプロセスに影響を与えているのか、と言うところでしょう。オラクルって、接続数がいっぱいになると、次の接続はどうなるんだっけ??? デッドロックは、最近の@IT Insider.NETの記事で、スレッドを対象にしたものがありました。あの記事は読んでみましたか? 少々の誤解はありますが、「車のキーの綴じ込み」と同じようなものです。鍵は車の中にあるのに、ドアはロックされている。ドアを開けようと思ったら鍵がないといけない。これもデッドロックのひとつです。 同じようなことが、いろいろな状況で起こり得ます。AのタスクとBのタスクがあって、AはBが終了しないと実行できない。BはAが終了していないと実行できない。両方起動してしまっていたら、どうなる? Aというタスクがあって、この中でBというデータにアクセスするため、Bに変更禁止のロックをかけた。ところが、処理を続行するためにはBを変更しなければならず、変更禁止のロックが説けるのを待ってしまった。このタスクはいつ終わる? _________________ |