Exchange 2010 での PdhEnumObjects によるハンドル リークについて
今回は、Exchange Server 2010 に対応するパフォーマンス カウンターの情報を収集するプログラムを開発の方に対してご注意頂きたい点を記載します。
事象
Exchange 2010/Windows 2012 で PdhEnumObjects を、引数 bRefresh を TRUE で呼び出した際に、レジストリ キー HKLM\SYSTEM\ControlSet001\Services\MSExchangeAL\Performance のハンドルが 1 つリークします。
PdhEnumObjects function
https://msdn.microsoft.com/en-us/library/windows/desktop/aa372600(v=vs.85).aspx
原因
本事象は PdhEnumObjects() の呼び出しに伴って実行される、Exchange Server 2010 上のモジュール alsperf.dll のある関数が呼ばれた際にハンドルがクローズされないため発生します。
発生条件
本事象は以下の環境で発生します。
・ Exchange 2010/Windows 2012 (Exchange 2010 が Window 2012 上で実行されている場合)
対処策
本事象の対処策として、以下がございます。
・ HKLM\System\CurrentControlSet\Services\MSExchangeAL\Performance に DWORD 値 "Disable Performance Counters" を作成し、値を1 に設定することで関連パフォーマンス カウンタ自体を無効化する。
・ PdhEnumObjects の bRefresh を False で実行する。
・ Exchange Server 2013、または Exchange 2016 を利用する。
・ 許容できる場合、無視する。
備考
本事象は Exchange サーバーの動作そのものには影響はありません。プログラムから PdhEnumObjects を (bRefresh を TRUE で) 呼び出す場合にのみに発生します。この問題のためハンドルが 1 つリークしますがハンドルは約 2^24 == 16,777,216 程度まで作成することはできるため PdhEnumObjects を繰り返し何度も呼ぶようなことがなければ問題ありません。
なお Exchange 2010/Windows 2008 R2 等の環境では発生しません。これは OS 側の pdh 関連処理の実装が異なるためです。また、Exchange 2013 や Exchange 2016 では alsperf.dll 自体が存在しないため、OS に関わらず本事象は発生いたしません。