在macOS Sierra上使用`dd`的性能问题?


0

我不确定我是否是唯一有此问题的人,但是当我在升级到macOS Sierra后尝试闪存磁盘映像时,我的性能非常差。

当我使用以下命令闪存磁盘映像时,我的写入速度大约为300-500k:

$ unzip -p /path/to/image | pv | sudo dd bs=32m of=/dev/rdisk2
1.31GiB 0:55:37 [ 424KiB/s] [                            <=>    ]
^C
0+4279363 records out
2191033856 bytes transferred in 5218.495041 secs (419859 bytes/sec)

有趣的是,如果我在VM(Ubuntu 12.04)中使用完全相同的SD卡,磁盘映像和USB读取器完成同样的操作,我的性能会更快。

$ unzip -p /path/to/image | pv | sudo dd bs=32M of=/dev/sdc
3.73GB 0:02:30 [25.4MB/s] [                            <=>    ]
0+55333 records in
0+55333 records out
4004511744 bytes (4.0 GB) copied, 150.572 s, 26.6 MB/s

这曾经很好地工作El Capitan。

我也试过使用内置的SD卡读卡器闪烁,但性能大致相同。


查看日志,性能差异的原因是第一种情况是使用512字节记录,而第二种情况使用~72KB记录。我猜测差异的原因是缓冲区大小pv,或者可能是两个实现中的默认管道大小。如果pv从管道中省略,则比较这两个命令,但如果解压缩到文件并将其复制为两个单独的操作,则将获得最佳性能,此时您将获得完整的32MB缓冲区。您可以通过发送dd信号来监控进度USR1,可能来自后台任务。
AFH

我可以确认即使我移除pv管道,行为也保持不变。我让它运行了30分钟,没有完成。在此期间,它只写了330MiB。
vpetersson 2016年

在这种情况下,它必须是bash默认的管道大小; 所以解压缩图像,然后用类似的东西复制它dd if=image.iso of=/dev/rdisk2 bs=32M& while kill -USR1 $!; do sleep 30; done。这会每30秒发出一次进度消息,但您当然可以更改sleep参数; 当它也给出了一个错误dd完成后,你可以通过重定向抑制stderrkill命令。
AFH 2016年

Answers:


1

考虑测试不同的块大小以获得最佳性能。

使用bs = 4096适用于以4096块边界格式化的现代拇指驱动器,而早期的拇指驱动器使用512。

另外使用/ dev / rdiskX设备。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.