DB运行产生太多的磁盘IO的话,性能肯定会受到影响。可以借助zabbix这样的工具进行磁盘IO的监测,或者自己动手都可以。
我们可以从proc/diskstats中直接获取信息:
7 3 loop3 0 0 0 0 0 0 0 0 0 0 0 7 4 loop4 0 0 0 0 0 0 0 0 0 0 0 7 5 loop5 0 0 0 0 0 0 0 0 0 0 0 7 6 loop6 0 0 0 0 0 0 0 0 0 0 0 7 7 loop7 0 0 0 0 0 0 0 0 0 0 0 ..... 8 0 sda 16140 67741 1740112 1453724 16858 18744 1043336 390704 0 173612 1844580 8 1 sda1 176 138 1468 1160 0 0 0 0 0 1160 1160 8 2 sda2 164 486 1300 1556 0 0 0 0 0 1556 1556
sda为整个硬盘的统计信息
sda1为第一个分区的统计信息
sda2为第二个分区的统计信息。
信息依次为:
1、major 主设备号
2、minor 磁盘次设备号
3、name 磁盘的设备名
4、rio 读请求总数
5、rmerge 合并的读请求总数
6、rset 读扇区总数
7、读数据花费的时间,单位ms
8、wio写请求总数
9、wmerge 合并的写请求总数
10、wset 写扇区总数
11、写数据花费的时间
12、现在正在进行的IO数等于IO队列中请求数
13、系统真正花费在IO上的时间,减去重复等待时间
14、系统花费在IO上花费的时间。
要计算某块磁盘的IOPS的话,只需要将第4列和第8列的值相加。
监控代码:
#!/bin/bash uprio=0 upwio=0 while true do rio=$(grep '\bsda\b' /proc/diskstats | awk '{print $4}') wio=$(grep '\bsda\b' /proc/diskstats | awk '{print $8}') Real_rio=$[ $rio - $uprio ] Real_wio=$[ $wio - $upwio ] Iops=$[$Real_rio + $Real_wio] echo "Iops:$Iops Read : $Real_rio Write: $Real_wio" uprio=$rio upwio=$wio sleep 1 done
监控输出:
Iops:35373 Read : 16792 Write: 18581 Iops:9 Read : 0 Write: 9 Iops:0 Read : 0 Write: 0 Iops:0 Read : 0 Write: 0 Iops:0 Read : 0 Write: 0 Iops:5 Read : 0 Write: 5 Iops:43 Read : 0 Write: 43
对于DB服务器 可以考虑将日志文件和数据文件放到不同的磁盘,这样就可以分别监控 日志和 数据的IOPS。这个可以参考:http://keeland.org/?p=45
对于DB所使用的磁盘,我们还应该监测其IO利用率,可以通过IOSTAT 进行。
本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/982233,如需转载请自行联系原作者