web-dev-qa-db-ja.com

非ページメモリをリークしているアプリケーションを特定するにはどうすればよいですか?

最近、ライブサーバーに問題があり、Webアプリが応答を停止しました。私たちが得ていたのは、サーバーを再起動するまでの503エラーだけで、問題はありませんでした。結局、それをhttperr.logまでたどると、たくさんの1_Connections_Refusedエラーが見つかりました。

さらなる調査により、非ページプールの制限に達したことが示されているようです。それ以来、Poolmon.exeを使用して非ページプールメモリを監視しており、問題の原因となっているタグを特定したと考えています。

Tag   Type    Allocs       Frees       Diff       Bytes      Per Alloc
Even  Nonp  51,231,806   50,633,533   684,922   32,878,688      48

Poolmon.exe/gを使用すると、マップされたドライバーが[<不明>イベントオブジェクト]として表示されます。

これはほとんどnoまったく役立ちます。私のチームはこの問題の調査にかなりの時間を費やしてきましたが、これを特定のアプリケーションやサービスに絞り込むプロセスを見つけることができませんでした。ほとんどの人は、ページングされていないメモリがリセットされるまで、マシンのプロセスを強制終了することで問題を解決しているようです。これは、プロダクションマシンで作業するときに正確に表示したいものではありません。

タスクマネージャを開いてプロセスリストを表示した場合。 NPプール値が105KのMailService.exeが表示されます。これは、2番目にリストされているプロセスの値より36K高いです。過去にメールサーバーでいくつかの問題があったため、またはこの問題に関連していない可能性があります)私の直感はこれが問題を引き起こしているということです。

ただし、サービスの再開に入る前に、単なる「直感」よりも少し確信を持ってみたいと思います。

私もpoolmon.exe/cを使用してみましたが、これは常にエラーを返します:

unable to load msvcr70.dll/msvcp70.dll

そしてそれはlocaltag.txtを作成しません。どこにあるのかわからないので、同僚がインターネットからpooltag.txtをダウンロードする必要がありました。 winデバッガーやwin DDKがインストールされていません(私が確認できます)。これらのいずれもインストールされていないため、上記のエラーが表示される可能性がありますが、わかりません。

最後に私は試しました:

C:\windows\system32\driver\findstr /m /l Even *.sys

これにより、かなりのサイズの.sysファイルのリストが返され、問題は解決しませんでした。

だから私の質問はこれです:このメモリリークの原因を絞り込む他の方法はありますか?

更新:

以下に提案するように、私は最終日ほどプール非ページバイトをログに記録しており、プロセスが上昇しているかどうかを確認しています。ほとんどの場合、すべてのプロセスは、その使用においてかなり静的であるように見えます。そのうちの2つは、わずかに上昇しているようです。私はこれを今後数日間監視し続けます。

また、プロセスのいずれも過度の数のハンドルを使用していないように見えることも前に言及するのを忘れていました。

更新2:

私はこれをここ数週間監視してきました。個々のプロセスの非ページバイトプールと合計非ページバイトプールは、その間比較的安定しています。この間にWindowsが更新されてサーバーが再起動したので、問題が解決したかどうか疑問に思っています。私はこれに先立っていたので、非ページバイトプールで一貫した成長が確実に見られません。

8
Developer

私はこれを約6週間から7週間監視しており、ようやく問題に対する決定的な答えを出すことができます。

まず、個々のプロセスの非ページ化バイトは、それらがすべてその使用においてかなり静的であるように見えたため、実際には何の有用な情報もありませんでした。スパイクがありましたが、その後は常にベースラインに戻りました。

Nonpaged Bytes Memoryの合計もしばらくの間は静的でしたが、その後徐々に増加し始めてから急上昇しました。スパイク後、メモリの約半分が解放され、パターンが繰り返されるまでしばらくの間(より高いレベルで)静的なままでした。グラフを見ると、これらのスパイクはかなり規則的に配置されているように見え、2週間おきに日曜日に発生していることがわかりました。

それで、次の質問は、日曜日に隔週で何が実行されているのですか?私はイベントビューアーを見て行きましたが、スパイクが発生するたびにMcAfeeが実行されていました。また、サーバーに頻繁にログオンして問題を監視すると、McAfeeがリアルタイムスキャナーを使用しているため、うっかり問題を悪化させたと考えています。

スケジュールされたタスクであるスキャンは、NP McAfee固有のタグではなく、PoolMonのイベントオブジェクトタグにメモリの増加が添付されているのを見た理由も説明していると思います。私たちは庭の道を下ります。

これで、リークの原因がわかったので、それに対して何かを行うことができます。それを追跡するのにこれだけ長い時間がかかったのは信じられないことです。

[〜#〜] update [〜#〜]:ちょうど最後のメモとして。 McAfeeは週末に更新され、これにより非ページメモリの問題が完全に解決されました。

更新2:これに賛成票を獲得したばかりなので、これに更新を追加します。最初はMcAfeeへのアップデートで問題が解決したようです。つまり、NPメモリに定期的な間隔での急激なスパイクは見られなくなりました。アップデート以降、McAfeeはログを書き込まないようです。デフォルトでイベントビューアに表示されるようになりました。アクティブにスキャンしているときは非表示になります。

しかし、NPのメモリ使用量は徐々に増加しています。2週間ごとにサーバーを再起動する必要があるところまで達しています。最近、新しいサーバーを取得したのは非常に悪いことです。更新されたハードウェアとソフトウェアによってこの問題が解消されることを期待して[〜#〜] but [〜#〜] Windows Server 2008、SQL Server 2008 R2、およびMcAfeeのみがインストールされた完全に新しいサーバーwas [〜#〜] still [〜#〜]表示NPメモリリーク。McAfeeを完全に削除した後で初めて、リークが停止し、それが残っています。サーバーに切り替える準備として、すべてのソフトウェアをサーバーにセットアップした後でも静的です。

私はそれ以降読んだので、これが真実であるかどうかはわかりませんが、問題はMcAfeeにあるのではありませんが、McAfeeが使用するWindowsルーチンが原因でNPメモリがリークします。明らかに、ネットワークアクティビティがリークの原因です。つまり、より多くのネットワークアクティビティ=>より大きなリークです。これは、サーバーがビジーになるにつれてリークが悪化するという点で、私たちの経験と一致しているようです。

6
Developer