Deferred Procedure Call
最近なぜかメインPCが重たくなっている。特に動画とかがカクカクになっている。はて?以前はそうではなかったのに、突然なんで?とずっと悩んでいた。
元々メインPCのシステムはP-III 1GHz×2のデュアルCPU構成になっているのでマルチプロセッサ対応のアプリなんかでは、早いときは早い(笑)。なので「もしかして片肺飛行になっているのでは・・・」と思ったのだが、タスクマネージャでもProcess Explorerで見ても問題ない。
で、ふとProcess Explorerのプロセスを眺めていたら「DPC」に対する負荷が異常に大きい。「DPCって何?」って調べてみると
- DPC(Deferred Procedure Calls)
- プライオリティの低くてもいい処理を後回しにして、高いプライオリティでの動作時間を減らす処理方法
とある。うーん、よくわからない。
で、もうちょっと調べてみるとSun ONE Directory Serverのインストール&チューニングガイドのサイトに
マルチプロセッサシステムでネットワークカードからCPUへの割り込みが入った場合、それが緊急度が高くないと判断されるとDPCとなって延期される。この延期されたDPCが特定のCPUに多くなってくると、もう片方のCPUに送られてしまい更に負荷が高くなってしまう。これはWindowsのデフォルト動作である
んだそうです。なるほど、24時間ネットに繋ぎっぱなしでOpenVPNとかも利用しているから、結果としてCPUに見えない負荷を与えているのだろう。
解決する方法として
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\NDIS\Parameters
にあるProcessorAffinityMaskの値を0にする(無ければ追加)して再起動すると、
- 割り込みを処理したCPUが、そのCPUに対応するDPCの処理も行うようになる
- 1つまたは複数のネットワークインタフェースカードが特定のCPUに固定されない
- その結果、割り込みとネットワークインタフェースカードで生成されるDPCに対するCPUの処理が改善される。
わけで、結果として重たくなくなりました(^-^)
以上、またしても覚書にて。