去年、Microsoft SharePoint Team Blogでリリースが予告されていたDisposeチェックツールですが、先週末にリリースされました。ふふふ。待ってました!!

http://blogs.msdn.com/sharepoint/archive/2009/01/29/spdisposecheck-released.aspx

これは、独自に開発したWEBパーツなどで、SPSiteやSPWebのDispose処理に問題が無いか?などをチェックするツールです。このツールは開発者だけでは無く、情シスの人が納品されたWebパーツやフリーのWebパーツを導入する前に、念の為にチェックする目的でも有効と思います。

 

■実験

このツール、VisualStudioなどの開発環境は不要のようです。事務用のWindowsXP上で試してみます。

http://code.msdn.microsoft.com/SPDisposeCheck

で、SPDisposeCheck toolをダウンロードして、PCにインストール。

 

使い方はいたって簡単。 サンプルのexeファイル(SPDisposeExamples.exe)が付属しているので、試しに以下を実行。

①SharePoint Dispose Checkをインストールしたファイルダへ移動。

C:\Program Files\Microsoft\SharePoint Dispose Check>

②以下のコマンドを実行

SPDisposeCheck.exe  SPDisposeExamples.exe

注:基本的な書式は

  SPDisposeCheck.exe   (開発したアセンブリファイル[exe,DLL])

 

すると、以下のような検出結果が表示されます。

ID: SPDisposeCheckID_150
Module: SPDisposeExamples.exe
Method: SPDisposeExamples.SPWebCollectionLeak.SPWebCollectionAddLeak(System.String)
Statement: innerWeb := webCollection.{Microsoft.SharePoint.SPWebCollection}Add(strWebUrl)
Source: C:\ROGERLA\Demo\SPDisposeExamples\SPWebCollectionLeak.cs
Line: 40
Notes:   Disposable type not disposed: Microsoft.SharePoint.SPWeb
         ***This may be a false positive depending on how the type was created or if it is disposed outside the current scope
More Information: http://blogs.msdn.com/rogerla/archive/2008/02/12/sharepoint-20
07-and-wss-3-0-dispose-patterns-by-example.aspx#SPDisposeCheckID_150
———————————————————-

Total Found: 18

う~ん、便利。サンプルファイルには18か所も問題があるってトコでしょうか?

尚、Readmeを見ると、以下のオプションがあります。

SPDisposeCheck <path to assemblies> -debug –xml <file>

-debug adds additional information.

-xml outputs the errors to an XML file instead of text

 

 

■Dispose処理なしの影響

SPSiteやSPWebにはDispose処理が必要であり、Dispose処理が無い場合の影響については以下のサイトに情報があります。

http://msdn.microsoft.com/ja-jp/library/bb687949.aspx

****抜粋************************************************************************

ほとんどの Web パーツ開発者は、SharePoint オブジェクトを破棄(Dispose)する必要があること、およびその理由を認識していません。ガーベジ コレクションによって自動的にこの機能が実行されると考えているようですが、いかなる場合も正しくありません。

(Dispose処理が無いと) ユーザー負荷が小さいうちは、前述のシナリオでは問題が発生しません。しかし、ユーザー負荷が増大するにつれ、パフォーマンスの低下、ユーザー タイムアウト、予期しないエラー、また場合によっては、SharePoint アプリケーションまたはアプリケーション プールの障害が発生し始める可能性があります。システムをヒットするユーザー数が増大するにつれ、この状況は悪化します。メモリ使用量が増大するにつれ、システムの動作がおかしくなり始めます。たとえば、パフォーマンスが低下したり、アプリケーション プールがリサイクルされるか、iisreset コマンドが発行されるまで、障害状態になったりするなどします

**********************************************************************************

う~ん、恐ろしい。実際、Dispose処理の行っていないWebパーツを複数配置し、負荷ツールで50~300名以上の負荷をかけ続けたら、w3p.exeのメモリ使用量が増加し、WebサーバのCPU負荷率も上昇しました。タスクマネージャーで見るとw3wp.exeがダントツ一番でメモリを使い、CPUを食いつぶしているのが分かります。この時、IISresetやアプリケーションプールのリサイクルを実行すると、メモリが解放されると同時にCPU使用率も下がりました。この点の動きは以下に記載があります。

http://support.microsoft.com/kb/954830/ja

http://support.microsoft.com/kb/954828/ja

****抜粋************************************************************************

32 bit 環境では ASP.NET Web のホスト プロセス (aspnet_wp.exe または w3wp.exe) のメモリ使用量が 800 MB を超えると OutOfMemoryException が発生し始め、1 GB を超えると GC の負荷により CPU 使用率が上昇し始める事が知られています。なお、この数値はあくまで一般的な経験値であり、アプリケーションの構成や実装によっては、300 MB 程度で OutOfMemoryException が発生する事例や、1.8 GB 使用していても例外が発生しない事例も確認されています。

*********************************************************************************

Dispose処理がされていないと、w3wp.exeのメモリ使用量が上昇し、WebサーバのCPU負荷が高くなる。結果、ユーザの目には「MOSSサイトの表示に時間がかかる」という結果が待ち受けているようです。よって、このDisposeチェックツールによる確認作業は有効かと思います。

 

■備考

/3GBとかWebガーデンについては、MOSSの場合は非推奨であるとの記述が以下にあります。

http://technet.microsoft.com/ja-jp/library/cc298550.aspx

MOSSでのアプリケーションプールのリサイクルについては、以下に記載があります。

http://technet.microsoft.com/ja-jp/library/cc850698.aspx

広告