环回文件系统的性能

有没有人在Linux环回文件系统上做过任何性能/基准testing? 到目前为止,你的经验是什么? 是否有严重的性能下降? 健壮性如何?

http://freshmeat.net/articles/virtual-filesystem-building-a-linux-filesystem-from-an-ordinary-file

我在回送设备中用写操作做了一些基准testing。 这是结论:

  • 如果在每次写入之后进行同步,则环回设备的性能会差很多(差不多是慢两倍)。
  • 如果您允许磁盘cachingIO调度程序来完成他们的工作,那么使用环回设备和直接磁盘访问之间几乎没有任何区别。

基准testing结果

首先,我在8GB的tmpfs环回设备上运行了一个基准testing,在回环设备中运行了一个回环设备( 每次写入操作后都有同步 ):

在tmpfs中的ext4:

Measured speed: 557, 567, 563, 558, 560, 559, 556, 556, 554, 557 Average speed : 558.7 MB/s (min 554 max 560) 

extf在tmpfs中的ext4:

 Measured speed: 296, 298, 295, 295, 299, 297, 294, 295, 296, 296 Average speed : 296.1 MB/s (min 294 max 299) 

显然,使用带有同步写入function的回送设备时,性能会有所不同。
然后我在我的硬盘上重复了同样的testing。
ext4(硬盘,1000MB,3次):

 Measured speed: 24.1, 23.6, 23.0 Average speed : 23.5 MB/s (min 23.0 max 24.1) 

ext4 ext4(硬盘,945MB):

 Measured speed: 12.9, 13.0, 12.7 Average speed : 12.8 MB/s (min 12.7 max 13.0) 

现在在每次写入之后没有同步time (dd if=/dev/zero bs=1M count=1000 of=file; sync) ,测量为<size> / <time in seconds> )。
ext4(硬盘,1000 MB):

 Measured speed: 84.3, 86.1, 83.9, 86.1, 87.7 Average speed : 85.6 MB/s (min 84.3 max 87.7) 

ext4 ext4(硬盘,945MB):

 Measured speed: 89.9, 97.2, 82.9, 84.0, 82.7 Average speed : 87.3 MB/s (min 82.7 max 97.2) 

(令人惊讶的是,环回基准testing看起来比原始磁盘基准testing更好,大概是因为环回设备的尺寸较小,因此在实际的“同步到磁盘”上花费的时间更less)

基准设置

首先,我在我的/ tmp(tmpfs)中创build了一个8G的环回文件系统:

 truncate /tmp/file -s 8G mkfs.ext4 /tmp/file sudo mount /tmp/file /mnt/ sudo chown $USER /mnt/ 

然后我通过用数据填充挂载的回送文件来build立基线:

 $ dd if=/dev/zero bs=1M of=/mnt/bigfile oflag=sync dd: error writing '/mnt/bigfile': No space left on device 7492+0 records in 7491+0 records out 7855763456 bytes (7.9 GB) copied, 14.0959 s, 557 MB/s 

这样做之后,我在之前的环回设备中创build了另一个环回设备:

 mkdir /tmp/mountpoint mkfs.ext4 /mnt/bigfile sudo mount /mnt/bigfile /tmp/mountpoint sudo chown $USER /tmp/mountpoint 

又跑了十次:

 $ dd if=/dev/zero bs=1M of=/tmp/mountpoint/file oflag=sync ... 7171379200 bytes (7.2 GB) copied, 27.0111 s, 265 MB/s 

然后卸载testing文件并将其删除:

 sudo umount /tmp/mountpoint sudo umount /mnt 

(同样在HDD上进行testing,除了我也加了count=1000来防止testing填满我的整个磁盘)
(并且对于不同步testing,我运行了ddsync操作)

我没有问题。 这一切都是坚如磐石的。 Linux中的文件系统caching和IO调度程序是非常合理的,它不应该在直接询问磁盘和请求磁盘上文件的一部分之间做出任何明显的区别。