【问题标题】:How to throttle pipe in bash/shell如何在 bash/shell 中节流管道
【发布时间】:2020-05-26 06:59:13
【问题描述】:

背景

我正在恢复数据库的 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 -

进度条定期显示速度超过限制数倍,发生这种情况时我的电脑会锁定。

【问题讨论】:

    标签: linux bash shell io


    【解决方案1】:

    系统阻塞磁盘 IO 并要求限制吞吐量是不正常的,但您是在 StackOverflow 上而不是在 ServerFault 上询问的,所以...

    pv 命令按照宣传的方式工作。您看到速度峰值的原因是 tar 暂时太慢了,所以 pv 让它读得更快,以赶上平均 5 MiB/s。

    任何给定的 5MB 压缩数据块都可以对应于从 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
    

    【讨论】:

    • 我应该说,经常写入磁盘的程序(我注意到 Chrome 是一个大罪犯)被阻止了。如果一个程序不写入磁盘,那很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 2013-07-11
    • 2016-01-19
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多