我决定乱搞一下btrfs
,发现了一些奇怪的性能异常。我所做的测试是使用两个外部硬盘驱动器,一个格式化为ext4
另一个btrfs
。
ext4
性能结果如下:
$ sudo dd if=/dev/zero of=/media/Backup/out.img count=1024 bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 24.1959 s, 44.4 MB/s
$ sudo dd if=/dev/zero of=/media/Backup/out.img count=1024 bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 24.1619 s, 44.4 MB/s
44.4MB/s 对我来说是典型的,但现在btrfs
(注意:我似乎总是在删除文件后立即获得 3.1GB/s 的高 IO):
$ sudo dd if=/dev/zero of=/tmp/test/out.img count=1024 bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.347933 s, 3.1 GB/s
$ sudo dd if=/dev/zero of=/tmp/test/out.img count=1024 bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 1.1732 s, 915 MB/s
$ sudo dd if=/dev/zero of=/tmp/test/out.img count=1024 bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 1.21539 s, 883 MB/s
$ sudo dd if=/dev/zero of=/tmp/test/out.img count=1024 bs=1024k
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 1.25093 s, 858 MB/s
我的问题是这里发生了什么事btrfs
?为什么性能IO高很多?我什至直接跑了一次sync
,它立即完成了。
我正在运行最新的稳定内核。
答案1
我还建议您使用除dd
. Brtfs 不是传统的文件系统,而是一种写时复制和事务性文件系统,大多数操作都是在内存中完成的,而不是直接在硬盘上完成。
因此,当您发出删除并重新创建文件时,我相信它只会重用内存中的内容。我们不要忘记您正在创建一个仅用零初始化的文件。 BRTFS 仅在超时后或达到足够的页面时才写入磁盘。
我建议你看一下这个文件(PDF)。它提供了更深入的解释,更详细地说明了您的问题的可能解释。
答案2
此行为是因为 BTRFS 支持稀疏文件。基本上,任何足够长的“空白空间”(0 位)字符串都将存储为元数据,表示“从这一点到另一点都是 0”,而不是实际将 0 写入磁盘。在这种情况下,由于您的输入流是 /dev/zero,因此您的全部的文件是 0,因此它在磁盘上的实际大小或多或少只是一小部分元数据。
不过,不确定为什么在先删除文件后您会看到吞吐量明显增加。