我经常用 dd 备份数据,大概是从 SSD 上 dd 整个硬盘或者分区的 block device 到机械硬盘(读入端的性能为写出端的 10+倍),并且经过 pigz 压缩 (dd if=/sda bs=xx | pigz >xxxx.img.gz
类似这样)
bs 我经常喜欢设置成较大的值,比如 512M ,1024M ,因为以前似乎印象中设置一个太小的 bs 比如 KB 级的或者 1M 性能会比较差,但是似乎发现一个现象:硬盘不会连续读写,假如设置成 1024M ,是不是 dd 先从源盘读满 1G 的数据,然后再往 pipe 那边扔,等待 pipe 写完之后,再读下一个 1G ?如果是这样的话,就影响吞吐量了,等于有某个时间段管道的某一端是空闲状态。
还有一个现象似乎可以佐证这一点,pigz 能把我的 CPU 跑满,但是看 CPU 占用率的曲线,每隔几秒(大概 10 秒左右?)会有一个 1~2s 的凹槽( CPU 使用率下降,降到 0%),这似乎是在等待读盘/写盘。
我想的是,既然入比出的性能高很多,那如何让 buffer 始终处于满的状态,让输出端( pigz 和写出设备)一直有东西吃,而不是等它们吃完再读入下一个 block ,然后这过程中它们没东西可吃。
总之,如何优化能提高整个 dd 的性能,或者有什么更好的方案吗?
另外我刚在 stackoverflow 看到另一种压缩方案,用 squashfs 流式压缩:
sudo mksquashfs empty-dir squash.img -p 'sda_backup.img f 444 root root dd if=/dev/sda1 status=progress bs=512M'
这样好处是以后 dd 出来的镜像方便挂载(如果直接对 block device 做 gzip 以后确实不太方便使用),目前还没测这个方案性能如何,不知道各位有什么高见?以及现在 squashfs 有多种压缩算法可以选,在这种场景下哪种效能最好呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.