Windows Vista播放多媒體減慢網(wǎng)速原因
著名Windows專家、《Windows Internals》一書作者M(jìn)ark Russinovich近日在其Blog上對近幾天一些論壇上提出的Windows Vista在播放多媒體文件時導(dǎo)致網(wǎng)絡(luò)速度嚴(yán)重減慢提出了解釋,他在博客中提到:
很多人正確地指出了導(dǎo)致媒體播放時網(wǎng)絡(luò)性能下降問題的根源在于多媒體類計劃程序(MMCSS),一項曾在Technet雜志上連續(xù)三期介紹的Vista內(nèi)核新改變。多媒體播放需要媒體流具有一個穩(wěn)定的速率,否則當(dāng)要求達(dá)不到時播放就會出現(xiàn)“卡”的現(xiàn)象。MMCSS服務(wù)運行于服務(wù)宿主Svchost.exe 中,它自動提升音視頻播放的優(yōu)先級以防止其他軟件過分占用播放軟件應(yīng)得到的CPU時間。
當(dāng)一個多媒體應(yīng)用程序開始播放,多媒體API自動請求MMCSS服務(wù)在每10毫秒中的最多8毫秒時間將其播放線程的優(yōu)先級提升至級別16-31的最高級 (Realtime),而這決定于播放線程需要多少CPU時間。由于其它線程運行在動態(tài)優(yōu)先級15以下,就算是CPU占用相當(dāng)大的應(yīng)用程序都不會影響播放。
你能夠通過在WMP中播放一段音視頻剪輯來看到這一變化。在播放時運行可靠性與性能監(jiān)視器(perfmon.exe),選中性能監(jiān)視器,在Thread對 象中對所有WMPlayer.exe的線程加入Priority Current選項。將圖像范圍調(diào)整至31(Windows中最高優(yōu)先級)你就能夠輕易看到被提升的線程,在這里是優(yōu)先級21:
不僅是其他線程的活動,媒體播放也能受到網(wǎng)絡(luò)活動的影響。當(dāng)一個數(shù)據(jù)包到達(dá)系統(tǒng),觸發(fā)一個CPU中斷,將會使網(wǎng)絡(luò)設(shè)備的驅(qū)動程序執(zhí)行一個中斷服務(wù)程序 (ISR)。其它設(shè)備的中斷請求在ISR運行時將被阻止,因此ISR通常用于執(zhí)行一些設(shè)備記錄并且在一個DPC(Deferred Procedure Call)中進(jìn)行一些在一個更長的數(shù)據(jù)傳輸。當(dāng)DPC在中斷啟用的狀態(tài)被執(zhí)行,它們將無視優(yōu)先級而優(yōu)先于任何線程,因此可能對媒體播放線程造成沖擊。
而網(wǎng)絡(luò)DPC的處理要求幾乎是最高的,因為它將把數(shù)據(jù)包傳送至TCP/IP驅(qū)動,這需要長時間的計算才能完成。TCP/IP驅(qū)動校驗每個數(shù)據(jù)包、確定每個 包使用的協(xié)議、更新連接狀態(tài)、尋找接收應(yīng)用程序,并將接收到的數(shù)據(jù)復(fù)制到應(yīng)用程序的緩沖區(qū)內(nèi)。這一個Process Explorer截圖顯示了當(dāng)我將一個大文件復(fù)制到其它系統(tǒng)時,DPC的CPU占用率的上升。
在Vista開發(fā)時對MMCSS的測試中,發(fā)現(xiàn)即使增加線程優(yōu)先級,大規(guī)模的網(wǎng)絡(luò)傳輸也會使長時間運行的DPC影響到播放線程。因此MMCSS將會發(fā)送一條消息至NDIS驅(qū)動,使其每毫秒僅傳輸10個數(shù)據(jù)包(每秒1萬個)。
標(biāo)準(zhǔn)以太網(wǎng)的幀大小大約為1500字節(jié),1萬個包每秒的限制使得速度被限制在15兆每秒左右。這對于百兆網(wǎng)絡(luò)沒有影響,但將會使千兆網(wǎng)絡(luò)的性能下降到最大值的15%。
同時在NDIS的這段限制代碼中,一個BUG將使得這種限制在多網(wǎng)卡的系統(tǒng)中放大。比如如果你有一臺同時擁有有線和無線網(wǎng)卡的機(jī)器,這個限制將擴(kuò)大到8000包/秒,而三塊網(wǎng)卡時則進(jìn)一步擴(kuò)大到6000包/秒。這個限制此時在百兆網(wǎng)絡(luò)上也顯而易見。
我在我的3網(wǎng)卡筆記本上也發(fā)現(xiàn)了這一限制。在我向另一臺機(jī)器復(fù)制文件的同時,我打開WMP播放音樂。任務(wù)管理器顯示千兆網(wǎng)絡(luò)的使用率從20%降低至6%。
你能通過在性能監(jiān)視器視圖的Network對象中添加“每秒接收數(shù)據(jù)包”來監(jiān)視NDIS的數(shù)據(jù)包接收情況。下面你能看到我在實驗中接收數(shù)據(jù)率的變化。NDIS處理的數(shù)據(jù)包數(shù)沒有達(dá)到6000的“理論最大值”,可能是因為與對方機(jī)器進(jìn)行的連接準(zhǔn)備有關(guān)。
就算限制如此之大,Internet傳輸也不會受影響,因為多次中轉(zhuǎn)遠(yuǎn)遠(yuǎn)降低了數(shù)據(jù)包的傳輸率。
Vista的這個限制來自在百兆網(wǎng)絡(luò)上高傳輸率的同時達(dá)到低延遲流暢播放的實驗結(jié)果。這個硬編碼的限制是短視的,它忽略了今日多處理器系統(tǒng)和千兆網(wǎng)絡(luò)普及的現(xiàn)狀。現(xiàn)在Windows的網(wǎng)絡(luò)開發(fā)組正和MMCSS組共同努力,開發(fā)一個補(bǔ)丁來應(yīng)對此問題。
(譯者評論:不是一個BUG,是一個功能。難道為了那該死的多媒體組件,就要犧牲網(wǎng)絡(luò)性能?那些超高端的視頻編輯系統(tǒng),通過千兆網(wǎng)編輯文件服務(wù)器 上那些碼率上百Mbps的低壓縮率高清視頻素材,這樣一來不就“卡”到死了嗎?再進(jìn)一步說,如果Windows Server 2008正式版上這個MMCSS服務(wù)還是默認(rèn)啟用的,那么攻擊者就有了一種新的DoS服務(wù)器的方法,只要他有服務(wù)器的一般用戶權(quán)限,3389上去一放歌, 外面瘋狂DDoS、CC,服務(wù)器的當(dāng)機(jī)還會遠(yuǎn)嗎?)
在評論中有人提出了解決方案:
修改注冊表
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesAudiosrvDependOnService
將Windows Audio服務(wù)的依存服務(wù)選項中的MMCSS服務(wù)去掉,
再禁止MMCSS服務(wù),就能破解掉這一限制。
