我正在编写带有一些实时约束的 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
,不仅是打开,还有后续的 read
和 writes
。使用正确的缓冲区大小可以在这种大型副本中产生显着差异。请注意,如果您的最终目标是磁盘到磁盘副本,则 /dev/zero
不是一个很好的基准测试。
如果你不能通过匹配它的系统调用来匹配 dd
的速度......好吧,阅读源代码。
关于无法达到 dd 的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3479862/