MMCSS とネットワークパケット受け取りの抑制

Vista のファイルコピーが遅い件について に,Mark Russinovich 氏の最近のポスト,『Vista Multimedia Playback and Network Throughput』の件を追記.



簡単に要約しておくとこんな話です.

  • Vista で Media Player を起動するとネットワークするープットが低下する件がネットで話題になっているが,Multimedia Class Scheduler Service (MMCSS) の影響という推測は正しい
  • MMCSS は,10 msec ごとに最大 8 msec の間,Playback スレッドの優先度クラスを realtime range に引き上げる
  • ネットワークパケットの受け取りは次の順序で行われる.これらの処理は,ユーザモードスレッドよりも高い割り込みレベルで実行されるため,スレッド優先度に関わらず優先される.
    1. 割り込みによる Deferred Procedure Call (DPC) のキューイング
    2. 割り込みレベルが DPC レベルでの,ドライバコールバック
  • 高頻度でのネットワークパケットの受け取りは,容易に CPU 時間を食いつぶす
  • このような高頻度でのネットワークパケットの受信が,Playback スレッドへの遷移を無視できないほど遅延させてしまうことが分かった.
    • MMCSS では,Playback スレッド使用時に,NDIS ドライバを制御して,ネットワークパケットの受け取りに制限を持たせることにした.
    • 制限値は 10 パケット/msec.Ethernet の標準的なパケットサイズ 1500 byte では,理論値約 15 MB /sec ということになる
  • 複数のネットワークアダプタが存在するときに,パケット数の受け取り上限がさらに低下する.(これはバグという扱いらしい)
    • 2 つのネットワークアダプタが存在すると,(1 枚あたり?) 8 パケット/msec
    • 3 つのネットワークアダプタが存在すると,(1 枚あたり?) 6 パケット/msec
    • 受け取りパケット数はパフォーマンスカウンタの "packets received per second" で見ることができる