pv 是什么
可不是 page view,是pipe viewer,管道偷窥器的缩写。这个东西的源站点在google code上,需要的话可以访问pv 的官网 。
这个东西的官方手册页(man pv或者pv(1))里面说,pv是一个让管道用户可以看到管道里发生什么事情的工具。可以看到管道处理的进度等等。
pv 是干什么的
实际上,pv(1) 的命令行参数非常丰富。除了可以进行管道观察之外,还可以干很多事情。下面列举一些:
-
查看管道中的数据流速
-
查看管道中数据流动的时间
-
通过给出预期的数据大小,计算预期完成的时间
-
给管道内流动的数据传输速率限流
为什么用管道限流
我们经常有各种限流的需求,比如,跨网络拷贝数据的时候、比如我们向磁盘书写数据的时候。为了避免过分占据网络带宽或者磁盘带宽,我们都要想办法做一些限流的事情。
而限流恰恰是一个挺麻烦的事情,有些工具有限流功能,比如 scp、rsync等,有些则没有,比如cp、tar、nc。这让我们的自动化脚本产生巨大的难度。
pv 最让人激动人心的功能,就是能通过参数对管道中的数据流动速度进行限流,这个参数是下面这个:
-L RATE, --rate-limit RATE
我们可以通过 k, m, g 的后缀来表示千、兆、吉的数量级,数据尺寸是“字节”。比如:
pv -L 300k
意思是让pv把管道中的数据流速限制在300K字节每秒。
为什么用管道限流呢?
因为我们知道,我们为了保持网络的礼貌,在生产环境中,尽量不要把带宽占满,有时候有些操作,是会把带宽占满的。比如,我们全速拷贝一个巨大的文件,很可能打击到一些网络薄弱的环节。而我们在自动化脚本中经常使用管道,如果我们可以利用管道限流,那么我们就完全可以在本地利用管道先把流量限制住,然后再使用各种形式的io,从而大大优化各种io环节,降低开销。而管道限流本身,基本上让我们可以对任意的支持标准输入输出的命令进行限流,这样其使用范围近乎是无限的。
获取pv
在大多数RedHat基础的服务器上,直接用yum就可以安装:
sudo yum install pv
slackware 则可以去 slackbuilds.org 获取制作包制作 txz 安装包。最辛苦的可以去上面的 google code 下载源代码,然后编译安装,编译安装的标准方法就是:
tar zxvf .. cd pv... ./configure make make install
的过程。
用法和例子
我想看看一个慢速的查询是否发生了数据传输
我有个不快的查询,大概要好几分钟跑完,并且获取的数据也比较多,我想试试执行一下,看看大概会有多久:
time psql -U qa -h somehost.qunar.com -d vacation -f t3.sql | pv -t -r > /dev/nul
查询保存在 t3.sql 里头,我链接到测试库进行测试,这个 sql 会把数据 copy 到标准输出上。然后,我用 pv 查看前面 psql 的标准输出管道,
我让 pv 记录时间: -t 选项
记录传输速率: -r 选项
然后用开头的 time 命令看看这个命令实际使用的时间。
我想传输一个大数据到rtools1上头,但是需要限流100k/秒
可以用类似下面的命令:
cd /opt ; tar cf - datadir | pv -e -t -b -L 10M| ssh haha@wjoyxt.com 'cd /opt ; tar xvf -'