测试性能之前,需要明确几点:
1. 数据是真正更新到硬件上,而不是缓存里;
2. 真正的性能数据不应该大于硬件总线速度(比如总线带宽是1GB/s,测试出2GB/s的数据必然是测试方法有问题);
3. 文件系统性能数据应该指的是底层API数据,至少是命令行上,而不是图形界面的数据
Windows和Linux的一大区别就是缓存机制不同。
1. Windows的缓存是基于盘(分区的),Linux是整个操作系统有一套统一的缓存管理机制
2. Linux的缓存很大,/dev/shm一般情况下是系统内存的一半,Windows的缓存机制与Linux不同,每个分区的缓存通常在几十MB左右(WIN7时代数据,新版本不了解)。
下面是测试环节:
同样一款U盘,同样的PC,新盘格式化FAT32以后,把coreutils-8.31拷贝进去(46M,约3000个文件),在Windows 10命令行删除,需要33.24秒,在Linux 19.04上删除需要34.636秒,基本上差不多。所以,对于可移动设备,并且是关闭缓存的情况下,二者性能其实差不多。
但是在本地硬盘上(SSD):
1. Windows删除需要0.78秒,Linux只需要0.05秒
2. 首次从U盘复制到本地硬盘,Linux首轮复制过去大概需要几秒钟(<5秒),但第二轮复制只需要0.08秒,46/0.08=575MB/s,即使不考虑写放大,这个数值也超过了我这个入门级的SSD的写速度。
3. Linux在执行写操作(删除、复制)以后,执行一下sync,会有比较明显的延迟
4. Windows从U盘复制到本地,首轮复制需要7秒多,第二轮复制需要5秒
5. Windows图形界面删除文件很慢,每次都要先统计有多少个文件
所以可以得出一些结论:
1. Linux对于本地磁盘的写操作(删除、复制)并没有真正写到盘上,sync才是
2. Windows的文件系统缓存机制做的不好,比Linux性能差的多,尤其是小文件
3. Windows图形界面的开销更大
如果做一些破坏性测试(我不做这个实验了,太费机器,容易把机器搞死),比如删除一个比较庞大的代码树(Linux内核这种级别),执行一下rm -rf,返回以后马上掉电重启(不是软关机),你会发现刚才删的东西大多数都还在。而Windows的NTFS虽然删的慢,但一般情况下不会回滚很多数据。
所以,Windows文件系统性能确实做的不好,但Linux快并不一定是真的删除。
Windows文件系统慢是因为它的缓存机制设计的问题(这个机制也直接影响了Windows无法删除正在打开的文件),想了解的话,去读一下github上的fastfat源码,可以了解个大概。我个人理解是微软不会去改变这个机制,因为这套东西跟Windows内核绑定的太紧密,除非重新设计Windows,否则不太可能有巨大的优化。
最新消息:陈小武的学生们已经被排成一排,挨个查手机了。