关于提高 dd 的性能, blocksize 和压缩算法讨论 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
liyafe1997
V2EX    Linux

关于提高 dd 的性能, blocksize 和压缩算法讨论

  •  
  •   liyafe1997 2024-03-06 17:42:02 +08:00 1964 次点击
    这是一个创建于 658 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我经常用 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 有多种压缩算法可以选,在这种场景下哪种效能最好呢?

    9 条回复
    billlee
        1
    billlee  
       2024-03-06 18:42:47 +08:00 via Android
    bs 一般设置成 MB 级就不影响性能了。
    备份文件用 tar 也好,用 squashfs 也好,都好过用 dd, 因为 sdd 不理解文件系统,会把无意义的空白空间也复制一份。
    压缩算法用 zstd 就好了,调压缩级别就可以适合各种不同场景。
    liyafe1997
        2
    liyafe1997  
    OP
       2024-03-06 19:12:05 +08:00
    @billlee 不是备份文件,我的目的就是要备份整个 block device
    GrayXu
        3
    GrayXu  
       2024-03-06 19:59:50 +08:00
    你的发现是对的,dd 同时只操作一个 blocksize ,pipe 本身并没有这么大的 buffer ,dd 等 pipe 拿完所有源数据后再去读新的源数据。但你这个场景下是写入盘 io bound ,提升 dd 的性能(比如说持有两个或者环形 buffer )对整体性能影响不会很大。

    但其实平衡 pipe 两端吞吐倒是一个很多讨论过的话题,比如包括 pigz 在内的压缩软件可以动态压缩率来匹配 pipe 的速率
    514146235
        4
    514146235  
       2024-03-06 20:08:34 +08:00
    一般备份这种 block 设备,我会用 qemu-img 转成 qcow2 。
    qcow2 支持压缩,也支持 mount 操作。
    liyafe1997
        5
    liyafe1997  
    OP
       2024-03-06 21:23:21 +08:00
    @GrayXu 感谢!
    我感觉 io bound 不完全在写入盘,主要在 pigz (因为 CPU 所有核能跑 100%?),以及等待读盘的时候浪费的时间。因为从 iotop 和写入盘的硬盘灯闪烁情况来看,写入盘并不是一直跑满的。
    liyafe1997
        6
    liyafe1997  
    OP
       2024-03-06 21:24:11 +08:00
    @514146235 感谢!好主意!回头试试性能如何。
    deorth
        7
    deorth  
       2024-03-07 08:45:42 +08:00 via Android
    换 btrfs/zfs ,用文件系统的 send 功能
    liyafe1997
        8
    liyafe1997  
    OP
       2024-03-07 09:14:38 +08:00 via Android
    @deorth 虽然但是请审题,我说的是备份 block device ,没说备份文件系统
    deorth
        9
    deorth  
       2024-03-07 10:08:34 +08:00 via Android
    @liyafe1997 XY 问题
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2591 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 15:29 PVG 23:29 LAX 07:29 JFK 10:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86