pt-diskstats是一个perl语言写的脚本,功能和iostat类似,给出磁盘的I/O统计信息。那么它和iostat又有什么不同呢?最大区别在于pt-diskstats可交互,输出信息更加详细,pt-diskstats可以按照不同方式聚合后输出。
pt-diskstats实质上是对/proc/diskstats做snapshot,然后进行相关计算后输出。那么/proc/diskstats又是什么东东呢。我们来捣鼓捣鼓 /proc/diskstats吧,随意取一份主机上的 /proc/diskstats文件下来。
pt-diskstats可以工作在两种模式下:
第一是工作在交互模式下,该模式下我们可以动态控制pt-diskstats的输出,立刻看到结果;
第二种是先收集/proc/diskstats的信息,存到一个文件里面,采集一段时候后再通过pt-diskstats来计算。
采集分析
这种模式下无人值守,用一个脚本再后台定时采集/proc/diskstats,采集完后我们用工具分析最终结果好了,最后我们可以得出该段时间内的整体IO性能,而不是瞬间的性能指标。
采集脚本如下:
#!/bin/bash
INTERVAL=1
LOOPS=10
INT=1
echo `date`
while (( $INT <&#61; $LOOPS )) do Sleep&#61;$(date &#43;%s.%N | awk "{print $INTERVAL - (\$1 % $INTERVAL)}") sleep $Sleep date &#43;"TS %s.%N %F %T" >> diskstats-samples.txt
cat /proc/diskstats >> diskstats-samples.txt
let INT&#61;INT&#43;1
done
echo &#96;date&#96;
/*采集时间自己改改LOOPS就好了&#xff0c;采集间隔修改INTERVAL即可&#xff0c;10代表10s*/
采集完后&#xff0c;生成一个很小的文本文件&#xff0c;这是我们可以使用pt-diskstats来对该输出做一些分析&#xff0c;统计出该段时间内&#xff0c;查看每块磁盘的IO活动(–group-disk)
脚本执行完成后&#xff0c;会生成一个diskstats-samples.txt的文件&#xff0c;下面就是用工具来分析这个文件中的内容
[root&#64;VM_54_118_centos scripts]# pt-diskstats --group-by disk diskstats-samples.txt
#ts device rd_s rd_avkb rd_mb_s rd_mrg rd_cnc rd_rt wr_s wr_avkb wr_mb_s wr_mrg wr_cnc wr_rt busy in_prg io_s qtime stime
{9} vda 0.0 0.0 0.0 0% 0.0 0.0 1.1 15.6 0.0 74% 0.0 0.1 0% 0 1.1 0.1 0.0
{9} vda1 0.0 0.0 0.0 0% 0.0 0.0 1.1 15.6 0.0 74% 0.0 0.1 0% 0 1.1 0.1 0.0
{9} vdb 0.0 0.0 0.0 0% 0.0 0.0 0.2 14.0 0.0 71% 0.0 0.0 0% 0 0.2 0.0 0.0
![a72ce61186e342c6c59a26b5df790959.png](https://img8.php1.cn/3cdc5/1566f/9f3/4e90d5e357881ea6.png)
输出说明&#xff1a;
#ts:如果按照disk聚合&#xff0c;该值代表到run的总时间&#xff0c;如果按照sample聚合&#xff0c;该值也代表当前run的时间&#xff0c;如果按照all聚合&#xff0c;代表两个快照间时间间隔。关于聚合&#xff0c;后面解释。
device:设备名
rd_s:实际发送到物理设备的读请求次数&#xff0c;该值一般情况下比实际应用请求次数小&#xff0c;因为在IO队列中&#xff0c;很多IO都被合并掉了。
rd_avkb:平均每次读请求的字节&#xff0c;单位KB/s,也就是单词次读数据量
rd_mb_s:该设备上的读取带宽&#xff0c;单位MB/s。ps:rd_s*rd_avkb&#61;rd_mb_s
rd_mrg:被合并的读请求数占总的读请求数的百分比&#xff0c;越高越好
rd_cnc:读请求并发性
rd_rt:读请求平均响应时间
wr_s, wr_avkb, wr_mb_s, wr_mrg, wr_cnc, wr_rt和读请求一样&#xff0c;不赘述
busy:人们习惯称为设备的繁忙程度&#xff0c;暂且这么理解吧
in_prg:当前正在向底层物流设备提交的IO请求数目&#xff0c;如果该值不为0或者很大&#xff0c;那么你的设备负载很重
io_s:IOPS。ps:rd_s&#43;wr_s&#61;ios_s
qtime:IO请求排队时间(IO请求实际发到物理设备前有个排队过程)
stime:物理设备实际做物理读写所耗费的时间
知道每个字段什么意思了&#xff0c;我们现在想查看sdb-sdc两块盘在采集的时间段内的整体IO平均负载情况。
[root&#64;VM_54_118_centos ~]# pt-diskstats --group-by disk --devices-regex vd[a-b] /wjqdata/mysql/scripts/diskstats-samples.txt
#ts device rd_s rd_avkb rd_mb_s rd_mrg rd_cnc rd_rt wr_s wr_avkb wr_mb_s wr_mrg wr_cnc wr_rt busy in_prg io_s qtime stime
{9} vda 0.0 0.0 0.0 0% 0.0 0.0 1.1 15.6 0.0 74% 0.0 0.1 0% 0 1.1 0.1 0.0
{9} vda1 0.0 0.0 0.0 0% 0.0 0.0 1.1 15.6 0.0 74% 0.0 0.1 0% 0 1.1 0.1 0.0
{9} vdb 0.0 0.0 0.0 0% 0.0 0.0 0.2 14.0 0.0 71% 0.0 0.0 0% 0 0.2 0.0 0.0
![bfd21bea0f297db03938a674bfd98741.png](https://img8.php1.cn/3cdc5/1566f/9f3/c77023b3ca8b946e.png)
我还想查看该段时间内sdb的iops变化情况
[root&#64;VM_54_118_centos ~]# pt-diskstats --group-by sample --devices-regex vd[b] --columns-regex io_s /wjqdata/mysql/scripts/diskstats-samples.txt
#ts device io_s
1.0 vdb 0.0
2.0 vdb 0.0
3.0 vdb 0.0
4.0 vdb 0.0
5.0 vdb 2.0
6.0 vdb 0.0
7.0 vdb 0.0
8.0 vdb 0.0
9.0 vdb 0.0
[root&#64;VM_54_118_centos ~]# pt-diskstats --devices-regex vd[a-z] --group-by sample
#ts device rd_s rd_avkb rd_mb_s rd_mrg rd_cnc rd_rt wr_s wr_avkb wr_mb_s wr_mrg wr_cnc wr_rt busy in_prg io_s qtime stime
0.7 {3} 0.0 0.0 0.0 0% 0.0 0.0 11.8 11.0 0.1 64% 0.0 0.6 1% 0 11.8 0.0 0.6
1.7 {3} 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0
2.7 {3} 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0
3.7 {3} 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0
4.7 {3} 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0
5.7 {3} 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0
6.7 {3} 0.0 0.0 0.0 0% 0.0 0.0 8.0 19.0 0.1 79% 0.0 0.0 0% 0 8.0 0.0 0.0
7.7 {3} 0.0 0.0 0.0 0% 0.0 0.0 2.0 4.0 0.0 0% 0.0 0.0 0% 0 2.0 0.0 0.0
8.7 {3} 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0
9.7 {3} 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0
10.7 {3} 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0
![1bc5f223e99306616d1fed0b9cc183fa.png](https://img8.php1.cn/3cdc5/1566f/9f3/7804bb13f71253ad.png)
查看帮助文档
按?就可以看到帮助文档&#xff0c;这些动作可以在改工具运行过程中调整具体配置&#xff0c;而不用停工具&#xff0c;在线调整。很棒吧
[root&#64;VM_54_118_centos ~]# pt-diskstats --devices-regex vd[a-z] --group-by sample
#ts device rd_s rd_avkb rd_mb_s rd_mrg rd_cnc rd_rt wr_s wr_avkb wr_mb_s wr_mrg wr_cnc wr_rt busy in_prg io_s qtime stime
0.4 {3} 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0
1.4 {3} 0.0 0.0 0.0 0% 0.0 0.0 0.0 0.0 0.0 0% 0.0 0.0 0% 0 0.0 0.0 0.0
2.4 {3} 0.0 0.0 0.0 0% 0.0 0.0 10.0 12.8 0.1 69% 0.0 0.2 0% 0 10.0 0.2 0.1
You can control this program by key presses:
------------------- Key ------------------- ---- Current Setting ----
A, D, S) Set the group-by mode S
c) Enter a Perl regex to match column names .
/) Enter a Perl regex to match disk names vd[a-z]
z) Set the sample size in seconds 1
i) Hide inactive disks yes
p) Pause the program
q) Quit the program
space) Print headers
------------------- Press any key to continue -----------------------
![6921f781ec7459ed71d1e35fa7a626cd.png](https://img8.php1.cn/3cdc5/1566f/9f3/5ac07383e56789b4.png)
关于pt-diskstats的使用详细参考官方文档说明&#xff1a;
![3ee62fbdbd294952ea971c2167becd8a.png](https://img8.php1.cn/3cdc5/1566f/9f3/1dd5a84af778c0c4.png)
如果您觉得本站对你有帮助&#xff0c;那么可以收藏和推荐本站&#xff0c;帮助本站更好地发展&#xff0c;在此谢过各位网友的支持。
转载请注明原文链接&#xff1a;【Percona-toolkit系列】Percona Toolkit工具之pt-diskstats