為什麼用 USB 拷文件的速度遠低於理論值?

看了各位的回答,我決定把問題改成這個:為什麼USB拷文件速度總是遠低於理論值?


我就是做USB驅動的,U盤驅動也做過,控制器驅動也做過,我來解釋一下速度的問題:

首先實際速度肯定低於理論速度,比如百兆乙太網,能到10MB/s的速度就不錯了,但是為什麼USB差距這麼大,主要是USB傳輸的無用包實在是太多了。

對於USB2.0,480Mbps是指匯流排的頻率,也就說,匯流排信號每秒最多能傳輸這麼多bit,這些信號包括控制信號和數據信號,現在來看看那數據信號都有什麼:
每125us就有一個micro frame(微幀),每1ms還有一個frame,在USB規範里叫SOF,類似於一種同步信號。

標準USB傳輸過程:

in/out token,data0/1,ack,真正有效的數據就在data0/1里,如果一個data包放不下,那麼會放到多個data里。
傳輸之前,對於2.0設備還要發起一個ping請求,確認設備是活著的。

USB不是一個全雙工設備,通常的行為是這樣:匯流排空閑,主機端請求數據,匯流排空閑,設備回應,匯流排空閑,主機準備接受數據,匯流排開始傳輸,傳輸完成匯流排空閑,主機檢查數據無誤,給設備回應說數據傳輸正常結束(不需要重傳)。
對於U盤本身:

由於U盤規範的原因,大多數操作系統要求定期檢查U盤狀態(是否是alive的),這個請求叫做test unit ready(各個OS都有,大家就不要吵了,U盤規範上的)。

同時傳輸512位元組(一個扇區的數據)要包括命令標識,命令號,LBN(邏輯塊地址)以及亂七八糟一堆堆的東西,一個扇區大概需要將近600位元組的數據。同時主機端還要給予相應的回應。

至於前面有人說bulk傳輸不會佔滿帶寬,這也不是完全對的,確實USB傳輸分為interrupt傳輸,bulk傳輸,ISO傳輸,但是只有interrupt預留了很少,ISO會保留30%左右,但當沒有ISO傳輸存在的時候,bulk是可以佔掉這一部分的。

USB2.0規範里給了一個公式,算傳輸時間的(演算法解釋就太複雜了,見USB2.0 5.11.3 Calculating Bus Transaction Times):

High-speed (Input):
Non-Isochronous Transfer (Handshake Included)
= (55 * 8 * 2.083) + (2.083 * Floor(3.167 + BitStuffTime(Data_bc))) + Host_Delay

BitStuffTime(Data_bc) 這部分就是數據傳輸需要的時間,算起來麻煩,但是看到前面有一個2.083就能看出來,傳輸一個bit基本上需要2.083倍的時間,所以,簡單的把480Mbps除以2.083,再轉換成位元組大概是:28.8MB/s,也就是說,最多就這麼快,再刨除bulk-only模式里的那一堆堆的多餘指令:一個包需要16個位元組左右,Windows一次請求是4KB(可能是為了頁對齊),再浪費掉1%左右的時間,以及host delay,也就是主機的校驗延遲,那麼實際速度就20多MB/s,不管是讀還是寫。

但是我知道肯定有人說,測得的實際速度比這個快,當然了,我也見過比這個快的,為什麼?恰好我做過Windows里文件系統開發,也研究過Linux里的fat驅動,先說Linux,它很變態,你的寫操作不一定真正寫到磁碟上(證據我有,因為我有USB分析儀,能抓匯流排傳輸),Linux會在後台慢慢的寫,前台看上去已經寫進去。

Windows比Linux強一些,但是基於強大的預讀和緩存,Windows也不是實時讀寫,所以會看到數字有跳動的情況(Windows內核里cc開頭的函數就是干這個的)。
我們開發產品的過程中,看到過的最高匯流排利用率也就是80%左右(分析儀獲得的匯流排數據),也就是說28MB的速度可能還要打個八折,崩潰去吧。
另外,U盤(flash介質)會更慢一些,因為U盤本身寫的就慢,SSD和硬碟會好些,雖然SSD也是flash,但是SSD緩存大,並且有保障機制。
所以,作為一個USB驅動的開發人員(維護過EHCI驅動,改過U盤驅動,寫過滑鼠、FTDI串口驅動,改過USBD),我覺得U盤的速度是很坑爹的。

解釋完了。


  • 不是真的,同樣的硬體chipset的情況下,linux,mac,win速度都差不多,win7在讀寫大文件速度上要快一些。有專業評測發表,請上網搜索先,請不要據說。
  • 考慮到USB2.0 High Speed 480Mbps的理論速度,40MB/S基本就是USB2.0讀寫速度的上限。我記得USB2.0協議規定要留10%的帶寬給control,bulk傳輸也不能佔用所有帶寬.
  • 我見過自己裝的機器,用些爛主板,電氣性能不行,USB讀寫確實很慢,比USB1.1強不了多少,這個要怪硬體。還有人的貪便宜買的爛U盤,讀寫速度就是不行

==============================

  • 我測試了手頭的筆記本Acer 4750G, Intel(R) 6 Series/C200 Series Chipset,Win7SP1 64bit, 4G內存USB2.0 Zynet移動硬碟盒(裡面裝500G SATA筆記本硬碟,硬碟速度足夠快,瓶頸在USB介面)拷貝一個大電影(2GB)。結果如下:
    讀速度大概是30~31MB/s ; 寫比較詭異,一開始&>70MB/s, 10秒後降到穩定30MB/s. 寫速度一開始比較大應該是用了內存做緩存。

高木端,學習,思考,理解,改善。

龔奇源 贊同
先搞清楚bit和byte的區別

速度差這麼大,首先是高端木同學所說的「單位問題」:大B(Byte)和小b(bit)的問題,接著才是時國懷同學說的「無用包的問題」。
1. 單位問題(byte和bit):
兩者的差距8 bit = 1 byte (8 b = 1 B)

我們所見的大部分參數(網速,傳輸參數)都是bit,也就是小b;而電腦上(windows,linux)網路速度和傳輸文件的速度都是大B,也就是大B。所以,差8倍以上沒有什麼好奇怪的。

USB 2.0的理論速度是480 Mbps(480Mbit/s),實際速度是30MBps (30MByte/s)。換算下,480Mbit/s=60MByte/s。首先,在參數上就差了8倍。60MByte/s和30Mbyte/s之間的差距才是後面時國懷所說的無用包的問題。

PS:我們家裡的寬頻也同樣有單位遊戲,4兆寬頻(4Mbit/s),下行是512KByte/s,正好是8倍(4096)。上行多少這個就看運營商良心了(目前肯定不到4兆)。

2. 無用包的問題(時國懷已經說的很詳細了)

時國懷,VxWorks開發

簡單一句話:不可能所有的帶寬都能拿來做傳輸。不然,就等著數據出錯吧。裡面有校驗,確認等等,這些都是必要的開銷。


先搞清楚bit和byte的區別


持續傳輸和隨機傳輸是不同的,一般產品的標稱傳輸速率是持續傳輸速率(單個大文件),這也是為什麼消費者感覺標稱速度與實際速度落差巨大的關係 。如果是大量小文件拷貝比如相機存儲卡里的大量照片,那麼速度打折是正常的,畢竟一般的u盤soc的處理能力有限和體積關係造成結構上只能雙面雙貼也就才兩通道自然速率提升不起來。
pc里的性能就是短板效應明顯,即使你的u盤自身速率很快但也受限與連接平台及匯流排速率或平台內的存儲器(例如hdd,hdd的尋道時間和響應速率隨機讀寫緩慢)的速率造成傳輸速率慢(畢竟傳輸是雙向的)

然而你們不知道有Sandisk cz88及Corsair Flash voyager Gtx嗎


因為存在瓶頸,比如你USB3.0的介面插上只支持USB2.0的移動硬碟,那麼速度最快也只有2.0的速度,還有就是硬體驅動的支持。
總會存在瓶頸,和短板效應一樣,速度決定於最短的那根木板,找到這個瓶頸,就能夠提升速度,但是永遠達不到理論速度,會有線路損耗,溫度影響等等。


木桶效應來解釋的話,就是你的優盤速度太慢,導致低於理論值速度,也就是介面帶寬吧。然而當換成速度足夠快的的優盤時,往往能接近理論速度,不過想達到還是不可能的,有時還受制於文件系統。


快閃記憶體設備的話一般瓶頸在快閃記憶體,SSD那種除外,普通U盤有個10M都算不錯了。
USB2.0的480MBps(60M Byte/s)指的是硬體匯流排上的速度,但一級級的協議開銷,出錯重傳等等因素疊加在一起,有個30多M就不錯了。


用操作系統的思想去考慮的話,一級二級三級調用 響應時間 關中斷 維護現場這些都是影響讀出速度的吧,用過那麼多u盤 真心覺得寫速度要想快就不能貪小便宜買很便宜但轉速很低的u盤。
說到這 很好奇間諜電影里那麼快的拷入速度是怎麼實現的呢?


他們的都不對,哈哈!
關鍵是這個,usb的速度是那麼大,指的是傳輸速度,而不是你傳送文件保存到存儲設備上的速度,你等於加上了,存儲設備進行讀寫的速度一般2.0速度能夠達到30兆就不錯了。底層可能用的flash emmc sd mmc一般手機上是按照sdio這個協議規範來的。而實現這種傳輸 是有3個數據位,7個數據位來傳輸。根據時鐘不同,速度也有不同。嘿嘿,可能位數沒說對。忘了。


推薦閱讀:

微軟粉是怎樣煉成的?
為什麼Excel圖標是X,而不是E?
微軟有哪句口號或者理念是最有代表性的??

TAG:macOS | 微軟Microsoft | MicrosoftWindows | 文件系統 | 驅動程序 |