【先着1,000名様!】1,000円分をプレゼント!

ASP.NETを用いたWebサイトをIIS上で運用した際、開発したアプリケーションが少しでも動いた後にアプリケーションを停止せずサイトを停止すると、ワーカープロセスが原因でCPUが100%となります。
CPUが100%の状態のまま放置してもCPUの負荷が無くなりません。(アプリケーションプールを停止させることによってCPUの負荷が無くなります。)

この事象に関してネットで原因を調査した結果、明確な解決方法が見当たらずこちらに質問させていただく次第でございます。IISの設定に関して詳しい方がおられましたら、この事象の原因と考えられる要素などをご教授下さい。

動作環境
Windows2008 R2
IIS7.5
.NET FrameWork4.5

開発環境
VisualStudio2012
ASP.NET(.NET FrameWork4.0) FORMSで開発
Oracle ODP

このQ&Aに関連する最新のQ&A

A 回答 (2件)

「アプリケーションを停止せずサイトを停止」というのが具体的にどのような手順なのかわからないのですが、手元のシステム(IIS7.5/Win2008R2server)で、World Wide Web Serviceを強制停止してみても、メモリプールやCPU占有は発生しません。



世の中に、IIS7.5+ASP.NET4 Web Formms+ODP.NETで構築されたシステムは大量に存在し、しかも業務用途でクリティカルな要件で動作しているものも数多いはずなので、根本的なバグである事は考えられません。事象の切り分けが必要かと思います。

・ODP.NETなしのアプリケーションでも同じ事象が発生するか?
・DAOによる変化はあるか?(DataReader、TableAdapter、EntityFrameworkなど)
・「アプリケーションが少しでも動いた後’というのはODP.NETと無関係か?
・(プログラム中)usingによるリソースやトランザクションの開放は確実に行っているか?

など、突っ込みどころは多いです。

この回答への補足

ありがとうございます。
おっしゃるとおり、切り分けのために時間を割いて、機能的な差異を作り、境界点を調査するのが筋とは思うのですが、あまりにも単純に出るので、ひょっとすると、結構メジャーな障害なのかもとも思い、経験のある方がおられればと思い質問させていただきました。

状況を加筆すると、
ODP.NETは、OnInitでコネクションを接続し、
OnUnloadでコネクションを解放しています。

Global.asaxのApplication_Startでlog4jの初期化をかけて、Application_endでlog4jのシャットダウンをかけているのが特徴です。

ちょっとでも動かしたとは、
iis起動後、login画面を表示しただけですが、
上記のlog4jの初期化、odpのコネクション接続、切断は走行しています。dbアクセスは一切ありません。

そのあとiisのサイト停止を行ったところで、
ワーカープロセスが100%になってしまった、
というところです。

現在本システムは本番にはいっていますが、
運用中のワーカープロセスが100%になる事象が
出ていないのが救いです。

ワーカープロセスが100%になる現象の原因はなんとしても
突き止めるつもりですが、残念ながら今回は、時間切れで見切り発車しています。

以上

補足日時:2013/10/28 09:40
    • good
    • 1
この回答へのお礼

貴重な時間を割いていただきありがとうございます。

お礼日時:2013/10/28 09:42

単純に、親、子プロセスの関係に、なっている、なっていないで解決策があるのでは? うちではサービスにして、子プロセス可しているけどね。

    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDirコマンドでフォルダ内ファイルの合計サイズをだすには?(コマンドプロンプトにて)

いろいろ調べましたが不明な点があり、質問します。

WindowsのDOSプロンプトでdirコマンドを打つとフォルダ・ファイルの一覧が表示されますが、その中にファイルサイズが表示されています。
このサイズを合計できるコマンドはありませんか?
DIRコマンドのオプションを調べましたがそれらしいものが見当たりません。
具体的には
C:\xxx\配下に50個程度のファイルがあります。
その50個の合計サイズを知りたいです。
xxxフォルダの親フォルダにはアクセス不可です。

ずーっと悩んでいます。よろしくお願いします。

なお、OSはWindowsNTか2000で使用予定です。

Aベストアンサー

カレントドライブ、カレントフォルダを
C:\xxx\
にした状態で、

dir /s /a-d

/sパラメータででサブディレクトリすべてを検索
/a-dパラメータでディレクトリ以外のファイル(つまり属性に関係なくすべてのファイル

これを実行すると最後にファイルの個数とファイルサイズの合計を表示します。

もし、隠し属性のファイルは合計しないのであれば、

dir /s

だけで良いと思われます。

Qメモリリーク対策

トップページを開くたびに、SQLサーバへデータベースを参照し、内容を表示させる、というASPページを作成しましたが、メモリリークが度々起こります。プログラムを調査しましたが、解放していないロジックは見当たりませんでした。とりあえずの対応として、サーバ再起動を1/週で実施するようバッチを作成しました。

しかし、トップページには、
<META http-equiv="refresh" content="1800">
が記述してあり、
もしかしてこのrefreshが問題なのかと思って調べているのですがイマイチはっきりした回答がありません。

恐れいりますが、
refresh指定すると、メモリリークは必ず発生してしまうものなのでしょうか?

どなたか教えていただけましたら幸いです。

その際、回避方法なども教えていただけましたら助かります。

以上、宜しくお願い致します。

Aベストアンサー

ひとまず、「DBを使ったWebアプリケーション開発の全面経験者」
という広範囲での経験者です。

質問者さんのシステムで当てはまるかどうかは判りませんが、
質問文の範囲から聞き取れる「システムの悲鳴」から
原因を診察してみます。

[症状]
refreshにより繰り返されるストレスの蓄積による慢性疲労。
現在は週1回のサーバ再起動によるストレス発散にて
擬似新入社員状態(?)となり勤務継続しているが、
一週間の連続勤務によって(再起動までの)約336回の
ストレスに耐えるのがやっとのようである。
サーバの稼動状態にもよりますが、
週一回の再起動を基準に考えると、
現状のままでは、サーバの起動開始からプログラムがこけるまで
稼動状況が変わらなければ450回付近といった、
ほぼ似通った回数で毎回発生するものと思われます。

[原因と対策]
まずは当該ASPスクリプトが常駐する、
もしくはそれに伴う「スクリプトの環境」が
常駐するような設定になっている事が前提となりますが、
メモリリークの原因は「DBコネクションの開放漏れ」
が考えられます。

想定される場所と内容
・ASPの最初にDBと接続を行っている処理
 (最後に対応するディスコネクトの処理が無い)
この場合、refreshがかかるたびにコネクトするだけして
ディスコネしていないので、結果コネクトするクチが
足りなくなってこける。

・select句発行に伴うコネクト処理と開放。
 (一度にオープンしたままにしようとするクエリが
  多過ぎると発生。)
この場合はこけるまでのrefresh回数が不定である場合に可能性大です。
抽出したデータを持つだけ持って突合処理をするだけやって、
最後のメモリ開放などの掃除の処理の際に
いくつのクエリを保持していたのか管理している変数の値が
処理中におかしくなったなどの理由で
正しく掃除されていないために、掃除し忘れのクエリが残ったままとなります。
それが蓄積された結果、上記のDBコネクトと同様
クエリを発行するためのクチが足りなくなってこけることになります。


質問文で述べられている
 ・ロジック自体におかしな部分は見当たらない。
 ・しかし、しっかりコケルという症状は出る。
 ・サーバの再起動で一応対処可能。
という3点から
 ・システム環境(DB、ASP、ブラウザ(?))の
  約束事の設定に忘れていることがある。
点で推測してみました。

時間と手間に余裕があるのならば、
発生条件(回数や件数や同時アクセス数や経過時間)を出来る限り特定して
その条件がそろったときに、ロジックのどのような処理の部分が
悲鳴を上げているのか、「ロジックを一旦全部コメントにして」
順番にロジックを甦らせて条件と要因を特定するのが
Web系統の開発の1つの手法だったりもします。

それでも「とことん突き詰めていった結果」、
実は「ソフトのバグだった」というオチもあります。
大規模なシステムであるほど「この点でおかしくなる」というのと
「そこで何が発生しうるか」をどれだけ思いつくのかが
意外と大切な開発現場だったりします。

ひとまず、「DBを使ったWebアプリケーション開発の全面経験者」
という広範囲での経験者です。

質問者さんのシステムで当てはまるかどうかは判りませんが、
質問文の範囲から聞き取れる「システムの悲鳴」から
原因を診察してみます。

[症状]
refreshにより繰り返されるストレスの蓄積による慢性疲労。
現在は週1回のサーバ再起動によるストレス発散にて
擬似新入社員状態(?)となり勤務継続しているが、
一週間の連続勤務によって(再起動までの)約336回の
ストレスに耐えるのがやっ...続きを読む

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

QIISがフリーズ

漠然としていて申し訳ありませんが、
Windows Server 2000 + IIS5.0 + ASPで
イントラネット用のサイトを構築していますが、

一日に一度くらいの割合で、サイトが反応しなくなり、
IISを再起動が必要になってしまいます。
システムのイベント
IISのログ
等に不正だった痕跡は残っていません。

現在、分離プロセスで動かしています。
また、たまに DLLHISTがCPU100%の状態が続くことがあり、
ワームの感染について調べましたが、
その可能性はないようです。

どなたか、このような状況についてご存知の方がいらっしゃったら、アドバイスをお願いいたします。

Aベストアンサー

#3、#5、#6です。


> その様な場合、タスクマネージャの"DLLHOST"のメモリ使用量は、600人の時は人数に応じて増加し、
> 終了後は、完全に元に戻るのでしょうか?

完全な統計をとったわけではないのですが、600→100人にアクセス数が落ちるとメモリ使用量は減少していました。


Cで作成したDLLの不具合の件です。
どこにメモリリークするか、と聞かれての推測ですが
おそらくDLLHOSTかと。

DLLの開発はしたことがないので以下、推測になります。
断言はできないですが、メモリリークというかIISがフリーズした原因はおそらくコレでしょう。
DLLでのミスはOSに致命的なダメージを与えます。
ご存知かと思いますが、C言語は非常に融通の効く言語です。
ASPと違って幅広く開発できる一面、バグがあるとシステムを不安定にさせる要因にもなります。

WinSockはおそらくAPIを使っていますよね?
APIはシステムに密接に関連するところですし、メモリまわりで不具合が出て、
OSやIISの動作にも影響が出たと推測するのが妥当、かと。

#3、#5、#6です。


> その様な場合、タスクマネージャの"DLLHOST"のメモリ使用量は、600人の時は人数に応じて増加し、
> 終了後は、完全に元に戻るのでしょうか?

完全な統計をとったわけではないのですが、600→100人にアクセス数が落ちるとメモリ使用量は減少していました。


Cで作成したDLLの不具合の件です。
どこにメモリリークするか、と聞かれての推測ですが
おそらくDLLHOSTかと。

DLLの開発はしたことがないので以下、推測になります。
断言はできないですが、メモリリークというかIIS...続きを読む

Qポートの80と443

こちらのサービス(https://secure.logmein.com/)を利用すると、インターネットを見られるサーバーのポートの80と443が空いていればルータやファイアウォールに特段の設定なく外部からサーバーを操作できるそうですが、逆にサーバーのポートの80や443を空けることには何か危険性があるのでしょうか。

Aベストアンサー

ポート80は一般的なHTTP、ポート443はHTTPSです。
この2つのポートがあいていなければインターネット接続(WEBブラウジング)は出来ません。
ですから、ほとんどのファイアウォールでこのポートは開いています。(インターネット接続を制限している社内LANでは当然閉じていますが)

ちなみに、よく使うポートとしてはFTPで20、21、SMTP(送信メール)で25、受信メールPOP3で110あたりです。セキュリティポリシー上、この辺は制限される事も多いですが、HTTP 80、HTTPS(暗号化用)443は通常閉じません。


危険性?
WEBプロトコルを使ってFTP的なファイル転送(WebDAV)やVPN等も出来るようになっています。当然そこにはある種の危険はつきものですが、WEBブラウジングに伴う危険と大きく変わりません。ウィルス等に感染していればこの2つのポートだけでも相当危険でしょうね。

参考まで。

Q社内でwebページが表示されるのが遅い。でもネットワーク自体は重くない

お初に質問させていただきます。

インターネットの表示が遅いです。昔は早かったのですが、いつごろから遅くなっていたのかはわかりません。
社内でインターネットを見ると、ページが表示されるまでに10秒程度かかります。どの社内PCから見ても表示は遅く、どのサイトでも多少の違いはありますが、やはり遅い状況です。
社外のサイトだけでなく、社内サーバのwebページにアクセスした場合もやはり重いです。プロキシサーバは使用していますが、インターネットオプションで、「ローカルアドレスにはプロキシサーバを使用しない」に設定しているため、表示が遅いのはプロキシのせいというわけではなさそうです。その社内のサーバにpingをしても何の負荷もなく、返ってきます。
それと、社内のファイルサーバへのアクセスは何のストレスも無く、サクサクとコピーなども行えます。

いったい何が原因なのでしょうか?なにかアドバイス等ありましたら、よろしくお願いします。

Aベストアンサー

確かにDNSサーバ側のAレコードは、ドメイン名からIPアドレスを解決するためのものです。プロキシやWebサーバがドメインに参加されていないのなら、DNSでの解決ができずに、WINSなど別の手段で見つけようとしているのかもしれません。手動でプロキシやWebサーバのAレコードを登録してみてください。

今後のために、動的更新が有効になっているかも確認しておきましょう。
http://www.atmarkit.co.jp/fwin2k/win2ktips/531dnsupdate/dnsupdate.html
http://www.atmarkit.co.jp/fwin2k/win2ktips/358disableupdate/disableupdate.html
http://itpro.nikkeibp.co.jp/article/COLUMN/20060224/230602/

Qコマンドプロンプトを使ってipアドレスからコンピュータ名を知る方法

ipアドレスは分かっていますがコンピュータ名が分かりません。リモート接続ソフトなどは使えないので、それでコンピュータ名を調べることはできません。
コマンドプロンプトを使ってipアドレスからコンピュータ名を知る方法を教えてください!

Aベストアンサー

なんか回答がバラバラなので整理しましょう。
調査している自分自身が使用している端末は、Windows XPのPCであると仮定します。
また、調べるのは基本的に外部から名前解決可能な名前(No.2さんの言う"2"に相当する名前)とします。

パターン1:
対象のIPアドレスがWindows端末機で、自分が使用している端末と同じネットワークに属しているか同一のWINSサーバを参照しているとき……No.4さんの答えで検索できます。

nbtstat -A <IP Address>

パターン2:
ネットワーク管理者がDNSをきちんと管理しており、対象IPについても管理者の管理下にある場合……以下2つのいずれかの方法で検索できます。

  nslookup <IP address>

または

  nslookup -q=ptr <reverse ip>.in-addr.arpa.
  ex) 192.168.12.1 のIPを調べたい場合、以下のように入力する
  nslookup -q=ptr 1.12.168.192.in-addr.arpa.

  (DNSサーバで逆引きが設定されていないと、正しく検索できない場合があります)

パターン3:
上記以外の場合

外部から名前解決できないので、調べようがありません。または、調べてもそれが正しいホスト名である保証がありません。
そのIPの端末自体に設定されているホスト名を直接調べるしかありませんが、それには実際にそのIPの端末を操作して調べるしかありません。
つまり、No.2さんの回答となるのですが、
IPを使用しているのがWindows PCやUnixサーバなどである保証はないので、確認するコマンドはその端末の種類(OS)によって異なります。

なお、tracert (traceroute)を使用する、という回答がありますが、これはパターン1またはパターン2のいずれかまたは両方を満たしていないと表示されませんので、厳密には正しい答えとはいえません。
(たいていの場合、"tracert <IP address>" や "ping <IP address>"で用が足りてしまうことも多いので、必ずしも間違いではないのですが)

なんか回答がバラバラなので整理しましょう。
調査している自分自身が使用している端末は、Windows XPのPCであると仮定します。
また、調べるのは基本的に外部から名前解決可能な名前(No.2さんの言う"2"に相当する名前)とします。

パターン1:
対象のIPアドレスがWindows端末機で、自分が使用している端末と同じネットワークに属しているか同一のWINSサーバを参照しているとき……No.4さんの答えで検索できます。

nbtstat -A <IP Address>

パターン2:
ネットワーク管理者がDNSをきちんと管理して...続きを読む

Qweb.configとは?(初心者です)

Web開発をしております。友人がweb.configの話をするのですが、私はそれは、使っておりません。web.configとは、ASP.NETを使用するときにのみ、使う設定ファイルなのでしょうか?
また、ASP.NET開発にて、web.configを使用しないと代替するものってなんなのでしょうか?
どうか、教えてください。お願いします。

Aベストアンサー

"web.config" で検索すればいくらでも出てくると思うのですが・・・

http://www.google.com/search?num=50&hl=ja&q=web.config%E3%81%A8%E3%81%AF&lr=lang_ja

http://www.google.com/search?num=50&hl=ja&q=%22web.config%E3%81%A8%E3%81%AF%22&lr=lang_ja

これらの数件を読むだけで解決すると思いますよ。
特に「今は使っていない」に対する解決は
http://www.atmarkit.co.jp/fdotnet/aspnet/aspnet18/aspnet18_01.html
の Page1~Page3 あたりで済むかもしれませんね。

QIISのログに出力される「GET」と「POST」の意味

IISのログに出力される「GET」と「POST」の意味
IISのログに出力される「GET」と「POST」はどういう意味なのでしょうか。
「GET」はサーバーからクライアントに送信した画面で
「POST」はクライアントがsubmitした画面のことなのでしょうか?
aspでできているwebシステムを表示したログを解析しています。

Aベストアンサー

>IISのログに出力される「GET」と「POST」はどういう意味なのでしょうか。

HTTPプロトコルのメソッドです。

GET 情報をWebサーバから取り出す
POST 情報をWebサーバに送り込む

これを理解するには、HTTPプロトコルのある程度の理解が必要です。

簡単な解説は、
http://www.atmarkit.co.jp/fnetwork/rensai/tcp02/01.html

詳細な仕様はRFC 2616を参照
http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング