解除30MB/s魔咒! 实战USB 2.0大提速
泡泡网主板频道7月5日 1998年USB 1.1规范正式发布,产品主要用于将PC和电话连接起来实现计算机设备和通讯设备的完美融合,实现移动领域内的人机数据交互,成为新的廉价而且方便的通讯连接方案。
很快由于传输速率的限制,2000年4月USB-IF(USB Implementers Forum)组织很快制定出了新的USB 2.0传输规范,数据传输速率提升至480Mbps,由于方便的热插拔和快速的数据交换速度,使得这一标准被PC广泛采用。
时值今日USB 3.0已经得到大面积的推广,这个建立在2008年的规范在经历了长达四年的风雨后,已经展现出强大的竞争力,Intel和AMD基于原生USB 3.0的芯片组控制器已经成为主流用户的标配,留给第三方芯片厂商机会已经不多。
而在USB 2.0到USB 3.0过渡的过程中,很多人由于种种原因坚守在USB 2.0阵线上,理论上高达60MB/s的传输速度本可以满足绝大部分数据传输需求,不过糟糕的协议和编码方式使得长期以来USB 2.0最高实际传输速度被限制在30MB/s左右,本文将从数据传输底层分析USB 2.0传输原理和编码方式,找出一条提升USB 2.0传输速度的途径,最大限度缩短传输时间。
虽然USB 3.0普及之路有了很大的起色,不过目前在用的USB主控和终端设备大部分依然基于USB 2.0规范,这也直接导致很多高速设备无法享受到5Gbps的高速带宽。
我们知道USB 2.0的理论传输速率为480Mbps,也就是60MB/s的数据传输带宽,而在实际应用中这一速率受到传输协议(Bulk-Only Transport(BOT)协议)、编码方式的影响被限制在35MB/s以下,理论带宽利用率只有一半左右。
正是基于此,USB 3.0的设计完全抛弃了USB 2.0的总线,新增两组数据总线,而为了保证向下兼容,USB 3.0保留了USB 2.0的一组数据总线。而在传输协议方面,USB 3.0除了支持传统的BOT协议,还新增了USB Attached SCSI Protocol(UASP)协议,可以完全发挥出5Gbps的高速带宽优势,虽然目前只有很少的设备能达到这一传输速率。
传统BOT协议早在1999年USB 1.1发布不久后就诞生,它规定USB设备在同一时间只能接收或处理一条命令,而到USB 2.0时代,虽然设备传输速率得到了极大的提升,但BOT协议并没有改善,随着存储设备传输速率的提升,BOT协议阻碍USB传输速率的问题已经显现出来。于是大容量数据交换就迫切需要新的传输协议,因此USB-IF组织就将SCSI和USB相结合推出了新的UASP协议,支持多命令并发执行和NCQ队列功能,极大的提高了数据传输效率,另外由于支持UASP的主控设备都具备独立的计算内存模块,使得USB数据传输对CPU的依赖大幅降低。
按照USB-IF组织的计划,UASP除了支持USB 3.0,还向下对USB 2.0开放,不过到目前为止USB 2.0方面还没有任何音讯,另外受到USB 2.0传输编码方式和匮乏的D+、D-总线限制,UASP要在USB 2.0上展开并不是很容易。
目前由于设备传输速率限制以及USB 3.0 5Gbps传输带宽的冗余,UASP协议并没有急于展开,另外要实现UASP协议的支持,除了主控设备,终端设备也需要支持UASP,终端设备的芯片设计难度将会加大,这使得闪存等小型存储设备的成本和体积将会显著增加,不利于产品推广,现有的一些支持UASP的设置仅限于外置存储。
30MB/s成了USB 2.0存储设备的实际极限速度
回归到主流的USB 2.0设备上来,前文我们已经提到,受BOT传输协议、编码方式的影响USB 2.0传输速度被限制在35MB/s以下,也就是说USB 2.0传输带宽还有不小的提升空间。
USB 2.0使用了NRZI(Non-Return-to-Zero Inverted)编码,它是基于串行传输模式,传输连续的0、1字符串。在RZ(Return-to-zero Code)编码中,正电平代表逻辑1,负电平代表逻辑0,并且每传输完一位数据,信号返回到零电平,也就是说,信号线上会出现3种电平:正电平、负电平、零电平。
而零电平因为是附加的内容浪费传输带宽,所以需要去掉归零,于是就变化成了NRZ(Non-return-to-zero Code)编码。在USB传输中,每个USB数据包,最开始都有个同步域(SYNC),这个域固定为0000 0001,这个域通过NRZI编码之后,就是一串方波,接受者可以用这个SYNC域来同步之后的数据信号。此外,因为在USB的NRZI编码下,逻辑0会造成电平翻转,所以接受者在接受数据的同时,根据接收到的翻转信号不断调整同步频率,保证数据传输正确。
但是,这样还是会有一个问题,就是虽然接受者可以主动和发送者的频率匹配,但是两者之间总会有误差。假如数据信号是1000个逻辑1,经过USB的NRZI编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成1001个或者999个1了。
USB对这个问题的解决办法,就是强制插0,也就是传说中的bit-stuffing,如果要传输的数据中有7个连续的1,发送前就会在第6个1后面强制插入一个0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。接受者只要删除6个连续1之后的0,就可以恢复原始的数据了。
由于强制插0保持发送者和接收者频率同步会造成USB 2.0传输带宽的浪费,浪费的大小则根据插0的多少而不同。这样USB 2.0 60MB/s的传输带宽就要打一定折扣了。对于USB 3.0来说,由于要保证高达5Gbps数据传输的正确性,采用了时下流行的8b/10b编码方式,有效数据利用率为80%。也就是USB 3.0的有效数据传输带宽为500MB/s。
除了编码方式,影响USB 2.0传输速率的还有BOT传输协议,BOT协议在操作系统下限制最大为64KB区块,而持续数据块大小为128KB。由于BOT协议的原因,BOT区块会因为串行处理而浪费大量等待时间,这又一次将有限的60MB/s传输带宽浪费了不少,NRZI和BOT双重限制下,有效传输带宽就剩下50%左右了。
USB传输底层NRZI编码方式我们无法改变,不过我们可以扩大BOT协议的区块大小,增加USB带宽利用率,这对于持续传输尤其有效。
修改BOT区块大小之前,我们要从微软官方下载一个补丁Windows6.1-KB2581464,补丁将Usbstor.sys驱动程序中的最大传输尺寸值从默认的64KB增加到2MB。
安装补丁后,系统还无法直接为存储设备应用为2MB区块模式,这个时候我们还需要将存储设备的INF设备信息(INF设备信息是由VID_xxxx&PID_xxxx字符串组成,唯一的标识了这款产品)添加到Usbstor.sys下面。
打开注册表,定位到“HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\usbstor”下面,新建一个INF存储设备项,然后建立“MaximumTransferLength”=dword:001fffe0(001fffe0十进制数值为2097120,也就是2MB)的DEWORD值,保存后重启系统就完成了INF信息配置。
在安装、配置完后,现在就可以享受到性能的提升。由于USB 2.0已经非常普及,而USB 3.0也向下兼容,为保证USB 2.0传输满速,我们代替的使用了USB 3.0存储设备测试这一提速效果。
● 测试平台
泡泡网主板频道测试平台 | |
硬件配置 | |
---|---|
处理器 | Intel Core i7 3770K (4C8T,L3=8MB,3.5-3.9GHz) |
主板 | GigaByte GA-Z77M-D3H (Intel Z77) |
内存 | Samsung 4GB DDR3-1600 x2 (9-9-9-24 1T) |
显卡 | NVIDIA GeForce GT 640 |
固态硬盘 | OCZ Vertex 3 240GB |
电源 | Antec TPQ-1000 |
显示器 | Dell 3007WFP |
软件配置 | |
操作系统 | Windows 7 Ultimate SP1 64bit |
显卡驱动 | ForceWare 301.42 WHQL |
在测试之前先说明下USB 2.0提速的原理,首先提速是基于USB 2.0控制器以及BOT传输协议、NRZI编码,也就是说USB 2.0控制器、存储设备并不是使其传输速度低于35MB/s的原因,获得的性能提升是来源于总线上的效能改善,换句话说如果你的USB存储设备传输速率低于30MB/s,那么提速将没有明显的效果,因为此种情况下,USB 2.0的总线还是可以满足你的存储设备传输带宽需求的,这也是我们不采用USB 2.0存储设备的原因,因为大部分的USB 2.0速度是达不到30MB/s以上的传输速率的。
当然选择的USB 3.0设备虽然支持5Gbps传输,不过由于接驳在USB 2.0接口上,所以传输规范和总线协议依然是基于USB 2.0,所以理论速率还是会被限制在480Mbps以内。
测试所用的三组设备Kinston DT G2 USB 3.0高速闪存、SATA 6Gbps SSD转USB 3.0外置存储、SATA 3Gbps HDD转USB 3.0外置存储在SuperSpeed模式下实际传输速率(读写)都超过了60MB/s,理论上是不会对所测试的USB 2.0传输造成性能瓶颈。
测试选取的三组设备Kinston DT G2 USB 3.0高速闪存、SATA 6Gbps SSD转USB 3.0外置存储、SATA 3Gbps HDD转USB 3.0外置存储,其中SSD和HDD使用了相同的USB 3.0硬盘底座。
首先进行的ATTO Disk Benchmark测试中,默认配置下,所有三款设备的读写速度最高只有36.5MB/s,加速后读写速度都出现了显著的增加,其中最高的SATA 6Gbps SSD转USB 3.0读取达到了44.8MB/s,这在以往USB 2.0数据传输中基本不可能看到,而写入速度也一举突破40MB/s为42.2MB/s,表现同样出色。
虽然这些成绩在USB 3.0下能够很轻松取得,但是对于那些USB 2.0老用户来说在不升级USB 3.0的前提下获得40MB/s的传输带宽,相对默认环境还是有不小的突破,能够节约不少时间。
另外一项AS SSD测试主要基于存储设备的持续读写性能、4K、4K-64线程传输速率,由于移动存储设备主要用于文件拷贝,所以测试仅选取了持续读写这一项。
整个测试基本和ATTO Disk Benchmark表现一致,默认情况下SATA 3Gbps HDD转USB 3.0存储设备获得了32.2MB/s的读取速度,写入速度只有29.1MB/s,开启加速后,读写速度分别提升至39.9MB/s和39.3MB/s,提升幅度分别为24%和35%。
整个组建、测试下来,我们看到经过改善后的USB 2.0最大传输速度已经有了明显的提升,虽然离60MB/s理论速度还有一定的差距,但是我们知道这只存在于理想状态,毕竟USB 2.0的传输协议和编码方式已经严重制约了其理论传输速度的发挥。
离60MB/s理论还是有一定差距
虽然目前USB 2.0设备很多都没有达到30MB/s的传输速率,不过在USB 3.0存储设备普及之前,一些老的高速传输设备,使用USB 2.0加速还是能为数据传输节约不少的时间,另外作为大容量存储的代表,基于USB 2.0的移动硬盘在不升级的情况下免费获得传输性能的提升也是一件不错的事。
谈到这里,很多人会疑问这种加速模式是否可以适用于USB 3.0,提升其传输性能,答案是肯定的!不过正如我们测试所用到的高速USB 3.0存储设备,其实是因为USB 2.0的传输协议和编码规范影响了传输速度,而不是设备本身,而USB 3.0虽然目前还是基于BOT传输协议,但是5Gbps的带宽,除了SSD以外,很少设备能将其喂饱,也就是说在不使用高速设备的情况下加速前后传输速度微乎其微。
未来USB传输是属于UASP的
对于USB 3.0传输规范,UASP协议将是未来的一个重点开发对象,在USB 3.0性能出现瓶颈前,USB-IF组织将会大力推广UASP协议,相对于本文的USB 2.0改善措施,UASP将带来USB传输史上的革命,它将全面取代现有的BOT传输协议。■<