首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在bash/shell中限制管道

如何在bash/shell中限制管道
EN

Stack Overflow用户
提问于 2020-02-11 06:10:20
回答 1查看 219关注 0票数 0

背景

我正在恢复一个数据库的tar快照。

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

不幸的是,我的操作系统(Ubuntu18.04)使用了deadline I/O调度程序,它忽略了I/O优先级的任何概念。

问题

相反,我正在尝试创建一个shell管道来限制读取源代码tar。

代码语言:javascript
复制
something db.tar.gz | tar xzf -

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

我该怎么做呢?

尝试

到目前为止,我已经尝试过pv,但是它似乎不适合这个任务。

代码语言:javascript
复制
pv -L 5M db.tar.gz | tar xzf -

进度指示器经常显示速度超过限制数倍,当发生这种情况时,我的计算机就会锁定。

EN

回答 1

Stack Overflow用户

发布于 2020-02-11 06:44:39

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

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

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

代码语言:javascript
复制
gzip -d < db.tar.gz | pv -L 5M | tar x

如果做不到这一点,你可以拼凑一个bash循环,它将以稳定的速度编写,并且不允许追赶:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60159205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档