我正在尝试使用以下方法检查我拥有的不同设备的写入速度:
dd bs=1M count=256 if=/dev/zero of=/path/to/device oflag=dsync
我想要准确读取写入速度,并且想知道使用不只是零的文件是否会产生明显的速度差异,或者使用 /dev/zero 是否是测试写入速度的合理方法。
答案1
/dev/zero
以下是在我的系统上对 的吞吐量的测试:
$ dd if=/dev/zero of=/dev/null bs=1M count=1000000
1000000+0 records in
1000000+0 records out
1048576000000 bytes (1,0 TB) copied, 65,2162 s, 16,1 GB/s
这里除了 CPU 的缓存速度之外没有其他瓶颈。这意味着在我的系统中/dev/zero
可以生成最多16,1 GB/s
个零,因此绝对应该足够快以满足你的目的。
答案2
并非总是如此。我最近以完全相同的方式测试了一个磁盘,它/dev/zero
欺骗我认为我拥有了所需的性能,因为外部磁盘正在使用NTFS 磁盘压缩。起初我尝试使用/dev/urandom
来解决这个问题,但我发现它欺骗了我认为事情进展太慢了。如果你想不被欺骗地做到这一点,那么你需要将一个随机文件写入一个tmpfs
位置并复制那文件复制到目标磁盘。
dd if=/dev/urandom of=/tmp/temp-random.img bs=1G count=1 iflag=fullblock oflag=dsync
dd if=/tmp/temp-random.img of=/path/to/device/temp-random.img bs=1G count=1 iflag=fullblock oflag=dsync
请注意,这假设已/tmp
安装为tmpfs
,如果不是这种情况,那么您应该安装一个临时文件系统并使用它:
sudo mkdir /mnt/tmp
sudo mount -t tmpfs tmpfs /mnt/tmp/
dd if=/dev/urandom of=/mnt/tmp/temp-random.img bs=1G count=1 iflag=fullblock oflag=dsync
dd if=/mnt/tmp/temp-random.img of=/path/to/device/temp-random.img bs=1G count=1 iflag=fullblock oflag=dsync
sudo umount /mnt/tmp/
sudo rmdir /mnt/tmp
还要注意,您需要确保您的文件足够大,大于磁盘的缓存(设置count=N
得比 GiB 中的缓存大小大得多)。
答案3
也许 /dev/zero 不是一个实际的来源;稳定但不现实。您可能会获得最快的速率,但 IRL 信息通常不是那么有条理。为了检查这一点,使用 /dev/zero 和 /dev/urandom 运行几个测试并比较速率。您必须考虑的另一点是BS参数。如果不优化此值,精度将再次变差。最佳大小取决于许多因素(即 SO、架构、您正在写入的设备的一些特性......)。我刚刚对我的 SSD 进行了此测试;仅需十秒钟即可写入:
dd if=/dev/zero of=./output_file
2968447+0 records in
2968447+0 records out
1519844864 bytes (1,5 GB, 1,4 GiB) copied, 8,52739 s, 178 MB/s
dd if=/dev/zero of=./output_file bs=4096
942211+0 records in
942211+0 records out
3859296256 bytes (3,9 GB, 3,6 GiB) copied, 17,3544 s, 222 MB/s
因此,4096 在我的硬件中看起来是一个不错的块大小,但我需要运行大量测试才能确定。而且……最大的BS越多越好吗?并非总是如此。