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