2011-07-20 17 views
2

私は時折メモリが不足しているような不思議なシナリオがあります:数週間働いて突然すべてがメモリ不足例外をスローし、サーバーが再起動されるまで実行します。数週間後または数日後に起こることがあります。私たちは規則的なパターンを特定できませんでした。 C# Asp.net Mvcのサイトでメモリが不足しています

    • ネットフレームワーク3.5
    • MVC 2.0専用サーバ(無ポリシーの制限など)にIIS 6.0を
    • :ここ

      このサイトで使用さハイテクもののリストは、 3層アーキテクチャ(UI - BLL - DAL)

    • Automapper 1.1.0.118
    • ELMAH 1.1
    • FluentValidation 2.0
    • MvcContrib 2.0.95.0
    • MvcSiteMapProvider 3.0.0.1
    • キャッスル2.5.2
    • NHibernateは3.0.0.4
    • FluentNHibernate 1.1.0.0
    • PdfSharp 1.31.1789.0
    • MarkdownSharp

    これ以外のサイトには、(iframeを介して)いくつかのol dのレガシーASPフォーム。これらの形式はサイトの古いバージョン(完全にasp)にあったものと同じですが、いくつかの問題がありますが、古いサイトは決してメモリ不足にはなりませんでした。

    私はすでに、すべてのIDisposable実装するクラスは、などusing文、ノー無限ループ、

    内のサイトには、奇妙な何もしないされているように、それはニュースのようにDBから一部のデータを引き出し、共通のものをチェックしました特定のフォーム提出後にオンザフライでpdfを生成し、ニュースレターを購読することができます。普通のもの。

    私は本当に断りがない、私は多くのサイトを開発しました。ほとんどすべての場所で上記のライブラリを使用しましたが、私はこの種の問題を経験するのは初めてです。

    私はこの情報が問題を「発見」するのに十分ではないですけど、誰もが、私が見落としているかもしれない何かを考え、あるいは何もすることができた場合、それは非常に

    EDIT :)歓迎されますことを、詳細を重要かもしれません。私たちは別のWebサイトが同じサーバ(古いASPで作られています)で動いていて、うまく動作していますが、もう1つは立ち往生しています。だから、サーバー全体のメモリが使い果たされていないように思えます。それ以外の場合は動作しません。

  • +0

    サイトのメモリ消費量を見てみるとそれは一般的に時間の経過と共に増加するか、またはこれらの奇妙なスパイクから安定して離れていますか? –

    +0

    これは正常です。アプリケーションプールが1GBになったので、プールを再起動してelmahにアクセスできました。私は多くのoutofmemoryexceptionsを発見しました。まだ無知。 –

    +0

    あなたのサイトはファイルをアップロードする能力がありますか?私は、サーバーが同時にファイルをアップロードしているあまりにも多くのユーザーに過負荷になっている可能性がありますか? –

    答えて

    3

    DebugDiagをインストールします。プロセスのダンプを取ってメモリのしきい値を超えてしまうようにトリガします(たとえば、300Mb、その後は100Mb)。ダンプ・ファイルはあなたに突然、私は城が設定され、どのように使われるかを見て、あなたは、コントローラの依存関係を解決するために城を使用しない、使用されるすべてのそのメモリに

    +0

    それは素晴らしいオプションですが、私はサーバーに何もインストールすることはできません、それは専用ホスティング、住宅ではありません。 –

    +0

    自宅でサイトを実行し、負荷テストツールで動作を再現する方法はありますか? –

    +0

    DebugDiagは今ここにあります:http://www.microsoft.com/en-us/download/details.aspx?id=26798 – Timbo

    0

    を占有しているものについての手掛かりを与えるべき比較

    ControllerBuilder.Current.SetControllerFactory方法?その場合は、コントローラインスタンスを解放することも忘れないでください。

    +0

    私はキャッスルを使用してコントローラ工場を設定していません。実際、私が探しているので、今はまったく使用されていません。以前はWindsor-IoCに使用されていましたが、今はもう使用されていません。死んだ依存。 –

    +0

    さて、リチャードの説明に従ってダンプファイルを見てください。一方、静的なもの(例えばコレクション)を宣言する場所を探してみると、これはリークの良い候補です。 – Thomas

    +0

    コード内に静的なものがないかチェックします。それは良いアドバイスです。私は静的変数などを使用することを覚えていませんが、残念ながらより安全です。 –

    0

    IIS7/7.5および高負荷でホスティングしているマルチアプリケーションプールの場合は、gcモードを変更してみてください。

    aspnet.config

    [要素](http://msdn.microsoft.com/en-us/library/ms229357.aspx要素)

    +0

    私の特徴リストに明記されているように、IIS6です。 –

    +0

    申し訳ありませんしかし、私はこれがIIS6でのメモリ使用のための利用可能なパラメータだと思います。 – takepara

    +0

    とにかく、私はそれが次の理由でGCの問題だとは思わない:管理された言語の利点は、あなたが悪いやり方であなたのメモリを扱う場合、リソースが不足してGCが救助になるということです。私は欠陥のあるコードを実験し、無限ループを生成し、OOM例外が発生します。しかし、次の呼び出しでは、GCは処理をパスしてクリアします。この場合、アプリケーションプールは再起動されるまでその状態のままです。だから私は、GCがアンマネージコードを扱うことができないので、リークの原因となっているアンマネージドコードだと思っています。それは正しいと思いますか、私は物事を過単純にしていますか? –

    関連する問題