我有一个 USB 密钥(PQI U822V-极速32G)我正在尝试在 Linux 上对 fast'n'dirty 进行基准测试。我正在测试写入带宽。
dd
在原始分区上
我从扇区 2048 开始创建了一个分区,然后进行了 4 GB 的顺序写入:
dd if=/dev/zero of=/dev/sdb1 bs=1M count=4096
我的速度约为 22 MB/s。
我还尝试了几 (4) 个dd
并行运行,如上面的一个,但使用count=1024
和seek=
选项来写入驱动器的不同区域。结果相同。
dd
在文件系统上
但是,当我使用 或 格式化分区sdb1
,并将大文件复制到其中(真实或)时,如下所示:ext4
NTFS
/dev/zero
time dd if=/dev/zero of=/media/USBKEY/file.bin bs=1M count=4096 ; time sync
正如制造商所宣传的那样,我确实达到了 > 66 MB/s。当然,我考虑的是sync
副本后的持续时间。
为什么会有如此大的性能差异?
答案1
现在我再看一遍,我意识到你说这是一个 USB 密钥(闪存驱动器)而不是硬盘驱动器。闪存只能以大块的形式进行擦除,并且如果不首先擦除单个扇区(以及它们所在的整个块),则无法写入单个扇区。由于软件希望能够随时在磁盘上写入任何想要的内容,因此磁盘中具有转换逻辑来透明地处理擦除。如何完成此操作会对写入性能产生巨大影响。许多设备对大部分磁盘使用一种算法,该算法可以很好地处理顺序写入,但在随机写入方面却很糟糕。靠近磁盘开头的区域通常由预格式化的 FAT 文件系统中的 FAT 使用,并且该区域经常被随机写入,因此他们在此区域使用不同的算法,该算法在顺序写入时速度较慢,但不是随机写入很糟糕。
因此,我现在非常确定我作为评论添加的最初猜测是正确的。当您写入文件系统时,您看到的是磁盘其余部分的性能,当您在偏移量零处进行 dd 时,您正在写入脂肪区域。如果您寻找几百 mb 的 dd 目的地,它应该会大大加快。
答案2
您的测量结果可以用内核架构来解释。使用文件系统访问将释放内核的全部潜力及其可以执行的所有缓冲区和优化。特别是缓冲区会加速你的基准测试(b/c 内核是 100% a_A_syncronous)。设备文件上的 dd 不使用其中的任何/大部分。
答案3
尝试使用hdparm
或不使用任何缓存来对驱动器性能进行基准测试:
$ sudo hdparm -tT /dev/sda1
/dev/sda1:
Timing cached reads: 6314 MB in 2.00 seconds = 3157.61 MB/sec
Timing buffered disk reads: 244 MB in 3.04 seconds = 80.26 MB/sec
答案4
这是由于写入优化而发生的稀疏文件在文件系统中。
当您dd if=/dev/zero
对原始设备执行此操作时,零块实际上会写入磁盘。
但是,当您将它们写入文件时,文件系统会忽略写入数据并仅保存元数据。这会导致写入磁盘的块非常少。该文件可以看作是一个大洞,里面什么也没有。
要以这种方式测试性能,请使用/dev/urandom作为输入文件 ( dd if=/dev/urandom
)。这将迫使文件系统将随机数据写入磁盘。