4

問題のソフトウェアはネイティブ C++/MFC アプリケーションであり、UDP 経由で大量のデータを受信し、表示、サウンド出力、ディスクへの書き込みなどのためにデータを処理します。アプリケーションの CHM ヘルプ ドキュメントがヘルプ メニューから起動され、ハードウェアからデータを収集しているときにヘルプ ドキュメントをクリックしたときに、最初に問題に遭遇しました。これを再現するために、AutoHotkey スクリプトを使用して、アプリケーションの実行中にヘルプ ドキュメント内をすばやくクリックします。システムで音が発生するとすぐに、エラーが発生し始めました。

サウンドカードを完全に無効にすると、サウンド出力は明らかに無効になりますが、すべてがエラーなしで正常に処理されます。ただし、サウンドを再生すると (このアプリケーション、別のアプリケーション、またはメッセージ ボックスからのビープ音だけでも)、何千ものパケットがドロップされます (各パケットにはタイムスタンプが付けられているため、これはわかっています)。2 番目のテストとして、アプリケーションをまったく使用せず、Wireshark を使用してハードウェアからの着信パケットを監視しました。案の定、Windows でサウンドが再生されるたびに、パケットがドロップされていました。実際、サウンドがアクティブに再生されていなくてもエラーが発生するわけではありません。(DirectSound8 を使用して) バッファを作成しただけで再生を開始しない場合でも、これらのエラーが発生します。

これは、ネットワーク カード (光ファイバーと RJ45 の両方) とサウンド カード (統合カードと個別カードの両方) を複数組み合わせた複数の PC で発生します。また、NIC とサウンド カードごとに異なるドライバー バージョンも試しました。すべてのテストは、Windows 7 32 ビットで行われています。私のアプリケーションはオーディオに DirectSound を使用しているため、さまざまな CooperativeLevels (通常の操作は DSSCL_PRIORITY) を試しましたが、成功しませんでした。

この時点で、それは私のアプリケーションとは何の関係もないことを確信しており、ハードウェア ベンダーや Microsoft と取引を始める前に、この問題の原因を誰か知っているかどうか疑問に思っていました。

4

2 に答える 2

6

この動作は仕様によるものです。Windows Vista 以降では、マルチメディア クラス スケジューラ サービス (MMCSS)と呼ばれるものを実装しました。これは、すべてのマルチメディアの再生を可能な限りスムーズにすることを目的としています。マルチメディアの再生はスムーズな再生を保証するためにハードウェア割り込みに依存しているため、割り込みが競合すると問題が発生します。主要なハードウェア割り込みソースの 1 つは、ネットワーク トラフィックです。このため、Microsoft は、プログラムが MMCSS で実行されているときにネットワーク トラフィックを調整することにしました。

2007 年Vista が登場したとき、これは大したことだったと思いますが、見逃していました。Mark Russinovich ( ypnosに感謝)によるMMCSSについての記事がありました。私の問題全体がこれに要約されたようです:

標準のイーサネット フレーム サイズは約 1500 バイトであるため、毎秒 10,000 パケットの制限は、約 15MB/秒の最大スループットに相当します。100Mb ネットワークは最大 12MB/s を処理できるため、システムが 100Mb ネットワーク上にある場合、通常、速度低下は見られません。ただし、1Gb ネットワーク インフラストラクチャがあり、送信システムと Vista 受信システムの両方に 1Gb ネットワーク アダプタがある場合、スループットは約 15% に低下します。さらに、NDIS スロットリング コードには、複数の NIC がある場合にスロットリングを拡大する不幸なバグがあります。たとえば、ワイヤレス アダプターと有線アダプターの両方を備えたシステムがある場合、NDIS は 1 秒あたり最大 8000 パケットを処理し、3 つのアダプターでは 1 秒あたり最大 6000 パケットを処理します。毎秒 6000 パケットは 9MB/秒に相当します。

複数のアダプターのバグが Windows 7 または Vista SP1 にまだ存在することを確認していませんが、問題が発生している場合は探す必要があります。

Russinovich の投稿へのコメントから、Vista SP1 でレジストリ設定が導入され、MMCSS が Windows に与える影響を調整できることがわかりました。特にNetworkThrottlingIndex キー.

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\NetworkThrottlingIndex私の問題の解決策は、キーをに設定して0xFFFFFFFFから再起動することにより、ネットワークスロットリングを完全に無効にすることでした。これにより、MMCSS のネットワーク調整部分が完全に無効になります。単純に値を に上げてみました70が、完全に無効にするまでエラーが発生しなくなりました。

これまでのところ、この変更による他のマルチメディア アプリケーション (および、自分のアプリケーションのビデオ キャプチャおよびオーディオ出力部分) への悪影響は見られません。変わったらまたここで報告します。

于 2011-01-11T22:57:00.090 に答える
1

Microsoft は、マルチメディア アプリケーション (Windows メディア プレーヤー、directX) が 100% 応答するようにするために、I/O パフォーマンスを予防的に低下させる奇妙なアンチ機能を Windows Vista カーネルに組み込んでいることが知られています。それがUDPでのパケットロスも意味するかどうかはわかりません。メソッドのこの不完全な正当化を読んでください:http://blogs.technet.com/b/markrussinovich/archive/2007/08/27/1833290.aspx

そこにあるコメントの 1 つは、これを非常にうまくまとめています。

于 2011-01-11T23:36:21.227 に答える