无法达到 dd 的速度

标签 c dd

我正在编写带有一些实时约束的 C 代码。我测试了我可以使用 dd 写入磁盘的速度:

dd if=/dev/zero of=/dev/sdb bs=32K count=32768 oflag=direct

这会将 1GB 的零写入 32K block 大小的/dev/sdb

我用这个达到了大约 103 MB/s

现在我以编程方式做类似的事情:

open("/dev/sdb",O_WRONLY|O_CREAT|O_DIRECT|O_TRUNC, 0666);

我得到一个时间戳值 从 32K 缓冲区写入/dev/sdb 10,000 次(在 for 循环中) 获取另一个时间戳值 做一些数字运算以获得以 MB/s 为单位的速率,它大约是 49 MB/s

为什么我达不到dd的速度? strace 揭示了我使用的相同打开命令。

最佳答案

检查系统调用 dd,不仅是打开,还有后续的 readwrites。使用正确的缓冲区大小可以在这种大型副本中产生显着差异。请注意,如果您的最终目标是磁盘到磁盘副本,则 /dev/zero 不是一个很好的基准测试。

如果你不能通过匹配它的系统调用来匹配 dd 的速度......好吧,阅读源代码。

关于无法达到 dd 的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3479862/

相关文章:

循环双向链表,打印函数

c++ - sprintf %g 说明符在点后给出的数字太少

c - (gvim 8271) IBUS 警告

linux - 创建一个没有挂载的虚拟软盘镜像?

linux - 如何使用 dd 命令创建具有特定值的文件?

python - 波浪号 (~) 在 subprocess.Popen() 中不起作用

c - 什么是 int (*a)[10]

c++ - 如何为缓冲区声明适当的大小

linux - 使用dd创建磁盘镜像时"No space left on device"