代码之家  ›  专栏  ›  技术社区  ›  Paul Draper

如何在bash/shell中节流管道

  •  0
  • Paul Draper  · 技术社区  · 4 年前

    背景

    我正在还原数据库的tar快照。

    在恢复过程中,由于磁盘I/O饱和,我的计算机几乎无法使用。

    不幸的是,我的操作系统(Ubuntu 18.04)使用了截止日期I/O调度程序,它忽略了任何I/O优先级的概念。

    提问

    相反,我试图创建一个shell管道来限制对源代码tar的读取。

    something db.tar.gz | tar xzf -
    

    因此,我可以控制我的写入速度,并假装我的操作系统缺乏真正的I/O调度器。

    我该怎么做?

    尝试

    到目前为止,我已经试过了 pv 然而,它似乎不适合这项任务。

    pv -L 5M db.tar.gz | tar xzf -
    

    进度表经常显示速度比限制高出数倍,当这种情况发生时,我的电脑会锁定。

    1 回复  |  直到 4 年前
        1
  •  0
  •   that other guy    4 年前

    系统阻塞磁盘IO并需要限制吞吐量是不正常的,但你在StackOverflow上而不是ServerFault上问过,所以。。。

    这个 pv 命令如广告所示。你看到速度飙升的原因是 tar 暂时太慢了,所以 pv 让它读得更快,恢复到平均5 MiB/s。

    任何给定的5MB gzip压缩数据块都可以对应5MB到100MB+的未压缩数据,因此为了使处理更加统一,您可以应用它 之后 解压缩改为:

    gzip -d < db.tar.gz | pv -L 5M | tar x
    

    如果做不到这一点,你可以破解一个bash循环,它将以稳定的速度写入,不允许追赶:

    cat db.tar.gz |
        while sleep 1 && [[ $(LC_ALL=C dd bs=5M count=1 2>&1 >&3) != "0+0 records"* ]] 3>&1; do true; done |
        pv |
        tar xz