質問: ### 前提・実現したいこと iphlpapi.dllのGetExtndedTcpTable()、GetExtndedUdpTable()で通信情報を定期取得しているのですが、プログラムの実行中「Wmi Provider Host」プロセスのCPU使用率が上がってしまいます。 下記の環境で実行したところ最高で30%弱ほどまで上昇しました。 確認のためスペックに劣る別環境で実行したところ、100%まで食いつぶされてしまいました。 原因及び対策をご教示ください。 ### 該当のソースコード [DllImport("iphlpapi.dll")] extern static int GetExtendedTcpTable(......) ### 補足情報(言語/FW/ツール等のバージョンなど) C# Windows Server 2012 R2 CPU:3.60GHz メモリ:16GB
回答: WMIはメモリリークやハンドルリークなど多くの問題を抱えています。長時間起動し続ける環境でWMIを使用する場合は定期的にWMIを強制終了する必要があります。 今回の関数がそういった対象の関数かわかりませんが、以前別の関数を呼び出しているとメモリがどんどん増えていく現象があり、Windows OSを作っている会社から「定期的にプロセスを落としてください、再度関数を呼び出すと自動で起動します」といった感じの回答をもらったことがあります。 WMIを使っているうちに徐々に負荷が高くなっていくようでしたら、定期的にWMIのプロセスを強制終了したほうが良いです。 GetProcessesByNameでWmiPrvSEを探し、PrivateMemorySize64が一定値以上大きくなった場合にKill()します。