极速U盘写入速度变慢原因分析及解决方法
去年就已经发现了这款速度极高的Sandisk Extreme闪迪至尊极速U盘(CZ80),据称,读取速度可达190MB/s,写入速度可达110MB/s。今年2月,实在忍不住,买了一个32GB的。刚买来时速度的确非常快,无论是从硬盘拷文件上去还是从上面拷文件下来,瓶颈基本上都在硬盘。硬盘成为瓶颈的情况下,80~90MB/s传输速度已经达到硬盘性能的极限了。随机写入速度我也作了测试,感觉由于杀毒软件、USB的延迟等因素叠加起来,和移动硬盘差不多,但和主机上的硬盘相比还是有差距。但是,即使是这个减慢了许多倍的速度,也已经是普通U盘的3倍以上了。
使用了近三个月,没被我少折腾。在上面拷大量文件,在上面装虚拟机,装完虚拟机又删掉重装,有时又在虚拟机里面跑磁盘碎片整理,反反复复好几次——注意,这个U盘使用的是SSD即固态硬盘主控(可以百度一下,有网友分析过的,我体验下来也是这个感觉),所以,它可以(并且是很适合)用来装虚拟机!我之前试过的所有U盘,随机写入每秒不到20次就封顶了,用来跑虚拟机是会被拖死的!这个U盘让我非常高兴!但是,不乐观的是,被我折腾许久以后,写入速度下降到只有3~7MB/s了。这让我很头大,本来是极速U盘的,这样下去还不如普通的金士顿了。
后来仔细想了一想,它的SSD特性正是发生这种情况的原因。在对它进行超过它容量的写入(即写入数据超过了32GB)后性能下降。以下作一下原理分析,然后我再讲如何恢复。首先想说明一点,CZ80采用的主控芯片是SSD主控,也就是固态硬盘主控,采用固态硬盘的算法。这意味着,它的连续读写性能是依赖并发性来加强的。
另一方面,它的随机写入将会因为被转换为连续写而性能较高。这与一般的U盘是很不一样的。不过,这也带来了超容量写入后性能显著下降的问题。
要解释这个问题,首先要从固态硬盘的原理说起。最简单的U盘,都是直接对闪存进行读取或写入的(外加一定的损耗平衡处理,但这里忽略此效应)。当读取时,可以只读取一个页,比如说,4KB大小的页,甚至更小。而写入的时候,必须以块为单位进行写入。一个块通常是512KB。每次写入都要操作整个块的数据,因此普通U盘随机写入的速度是很慢的,因为会写入多个块。并且,写入通常要对块作一次读,一次擦除和一次写,因此速度往往只有读取的1/3。
这也就是为什么有的U盘在读取时可以有20MB每秒而写入时只有7MB每秒的原因。
而固态硬盘的算法不同。一是为了解决连续读写的速度限制,它采用并发读写的方式来加以改善。二是为了解决随机(零碎)写的性能问题,它采用了一个映射表。在每个块内的每个页的物理地址都不再和文件系统看见的页对应,而是分别映射到不同的以页为粒度的文件系统逻辑地址。这样一来,随机写就被转换成了连续写——每次写入时都写入后续页,同时更新映射,以建立逻辑地址与物理页面之前的关联。
但是,这种转换不是没有代价的。最明显的代价就是,当新买来的空的固态硬盘中的每个块,都被按顺序全部写过一遍后,继续写入遇到的下一个块就可能包含数据。此时,不能直接写入整个块的数据了,而是要获取这个块的信息,看里面有多少个页是空闲的,把要写入的数据与块里面的有效数据合并,然后再写入整个块(还记得吗?写入的最小单位是一个块)。
这样一来,无论是连续写入还是随机写入,性能都要打折扣。而且,需要写入的数据量只是实际写入量的一部分,这个效应叫做写放大(英文write amplification)。为了解决连续写入的性能问题,固态硬盘还应用了两个技术。一是over provisioning,超规容量,它能改善最坏情况下的写放大和性能下降。二是后台垃圾回收,它能利用盘的空闲时间,把空闲空间整理成连续的,从而为后续的写入性能提供保障。
超规容量的表现方式通常比较隐蔽。比如,128G的固态硬盘可能有7%左右的额外空间,它对于用户是不可见的,这部分空间被用来解决满载情况下的写放大问题。注意,满载的情况并不一定表现为磁盘满。这个问题后面讨论。先说一下这个超规容量能保证多少性能。假设它就是7%,那么,写入时,就会有0.07/1.07的概率能写入有效数据,这也就是写入的平均效率。假设新买来时的写入速度是150MB/s,那么此时就是约9.8MB/s。
而后台垃圾回收的原理是,当电源插着,并且没有读写请求时,固态硬盘就把那些有效数据没有放满的块(也就是里面有些页是空闲的)合并,从而使空闲页变得连续。这样做了之后,一旦写入,速度就会很快,直到所有连续的块都写过了,并且此间没有空闲时间来做后台垃圾回收之后,速度才会降低。
之后,就要讲到除了超规容量之外的另一个优化手段了:TRIM指令。在业界还没有标准化这个指令之前,盘上所有被写入过的空间都被认为是有数据的空间。这样的话,一旦超容量写入后,就会发生前面讲到的满载情况,经常会发生写放大,其效率就像刚才所说的,超规容量除以总容量。TRIM指令的用途,即是让操作系统标记出文件系统中的哪些部分所对应的固态硬盘页面是可以释放的,从而增加块中包含的空闲页面的量,降低写放大效应。
比如说,实际文件系统中被占用的空间只有50%,有了TRIM指令(并且操作系统适时地发出了这个指令)之后,平均写效率可达(0.50 + 0.07)/(1.00 + 0.07)。所以,不要小看TRIM的作用。事实上,有了TRIM指令后,不但性能能随着空闲空间的增多而提高,连固态硬盘的寿命也会被延长。
现在回到我的第一个问题上来。我的Sandisk Extreme至尊极速 CZ80 U盘显然不是一个SSD,而是一个采用SSD主控的U盘。因为TRIM指令通常只是在SATA接口上传输,不支持USB接口,所以,它就好比是一个不支持TRIM指令的固态硬盘。因此,使用久了,写入的数据量超过它的容量了以后,由于没有TRIM通知它哪些页是有数据的,它就认为所有页都有数据(空闲的页只有超规容量那么多),于是根据前面的计算,性能明显下降,无论是连续写还是随机写都不理想。
那么,解决办法呢?说实话我起先并不确信我一定能摸索出解决办法。Sandisk并没有提供这样一个官方工具来解决。我所能想到的几个办法中,比较靠谱的是快速格式化,格式化成FAT32,这是它出厂时的规格。但是试了以后,好似乎是好点了,从2MB/s提升到了3~7MB/s(不稳定),但还是只有出厂速度的1/10不到。
但是,幸运的是,我咨询了闪迪的客服。问下来,客服说尝试下完全格式化。抱着死马当活马医的心态,我尝试了一下。
完全格式化后,速度有了明显的提高,在有杀毒软件、小文件复制等不利因素影响的情况下,从硬盘上复制文件到U盘的平均速度还是达到了14~15MB/s(峰值达到过50MB/s,偶尔遇到硬盘性能瓶颈了)。虽然和刚买来时的80MB/s有差距,但是我想了想,可能是软件和硬盘因素比较大。而且还有一个细节要分享下:第一次完全格式化时,在性能监视器中能看见U盘的写入,平均速度只有14MB/s(虽然峰值是60MB/s的样子)。做完后我尝试第二次完全格式化,此时基本上都有102MB/s的速度这个样子了。所以,格式化的确能恢复它的性能,也就能继续用了,但要尽量避免大数据量的写入(包括ReadyBoost)。还是用来跑虚拟机是最合适的,或者用来在电脑间传文件。
在此非常感谢闪迪的客户支持。用一句给中国医生的话,真是妙手回春,哈哈!当然这是开玩笑的啦。有勇气尝试第一个SSD主控的U盘,也必然要能经得起考验,是指我自己啦。
做个总结吧:本文从“使用固态硬盘主控的闪迪至尊极速U盘”说起,将固态硬盘的几个性能特性作了简介,并提供了Extreme至尊极速U盘的性能恢复手段。希望对于好奇的您来说,这篇文章有助于理解固态硬盘的性能特性。最后,感叹一句:SSD主控的U盘伤不起啊!
后来听网友说:由于主控不支持TRIM指令,用WTG久了会掉速,我今天就弄得掉速了一次,后来全零填充才恢复好了。受其启发,实验用SysInternals的SDelete工具(https://technet.microsoft.com/en-us/sysinternals/sdelete.aspx)将盘上的空闲空间清零(命令格式:sdelete -z D:)。经过数小时的实验,发现这样做也可以恢复绝大部分速度(在32GB版的CZ80上写入的最高速度是102MB/s,而填零后恢复的某些区域则低于这个速度)。这个方法比格式化要方便许多了。但这样做有一个很明显的缺点,就是那些被填零的块中,有些块不是全空的。这样的块可能随着U盘的文件写入会慢慢产生。对于这样的块,速度不可能恢复到原来的100%。因为,它相当于擦除了某些全空的块(于是下一次可以直接写入,无需重新擦除)。对于非全空的块,这样做只是复制该块,并将其中的空页面改写为零页面,非空页面保持不变,这样明显比较慢。所以,该速度有一个下限,比如,当可用空间有至少一半的时候,平均速度不低于“复制-擦除-写入”速度的1/2(具体多少未知,猜想最终速度下限超过50MB/s)。(文/Robbie Mosaic)