IO队列长度监控脚本(以及iostat,tail命令详解)
一、磁盘说明
磁盘在系统中负责存储和读取任务,磁盘的处理速度直接影响到了计算机的速度。
二、监控目的
随时掌握IO的使用情况,防止IO瓶颈
三、监控指标
IO队列长度
IO ps(每秒可以读写多少次)
磁盘吞吐量
四、监控命令
1、iostat命令
iostat 主要用于输出磁盘IO 和 CPU的统计信息。
iostat属于sysstat软件包。可以用yum install sysstat 直接安装
(1)用法:iostat [选项] [<时间间隔>] [<次数>]
选项:
-c: 显示CPU使用情况
-d: 显示磁盘使用情况
-N: 显示磁盘阵列(LVM) 信息
-n: 显示NFS 使用情况
-k: 以 KB 为单位显示
-m: 以 M 为单位显示
-t: 报告每秒向终端读取和写入的字符数和CPU的信息
-V: 显示版本信息
-x: 显示详细信息
-p:[磁盘] 显示磁盘和分区的情况
[root@CentOs shell]# iostat
Linux 3.10.0-1160.59.1.el7.x86_64 (CentOs) 2022年04月22日 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.00 0.05 0.00 0.00 99.92
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 0.39 7.11 4.14 305295 177914
dm-0 0.40 6.35 4.09 272947 175825
dm-1 0.00 0.05 0.00 2204 0
[root@CentOs shell]#
(2)cpu属性值说明:
%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比。
备注:如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。
disk属性值说明:
磁盘名称
device:磁盘名称
tps:每秒钟发送到的I/O请求数.
kB_read/s:每秒从驱动器(磁盘)读入的数据量,单位是K
kB_wrtn/s:每秒从驱动器(磁盘)写入的数据量,单位是K
kB_read:读入的数据总量.
kB_wrtn:写入的数据总量.
[root@CentOs shell]# iostat -x
Linux 3.10.0-1160.59.1.el7.x86_64 (CentOs) 2022年04月22日 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.00 0.05 0.00 0.00 99.92
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.02 0.22 0.17 7.12 4.15 57.35 0.00 0.87 0.81 0.94 0.38 0.02
dm-0 0.00 0.00 0.20 0.20 6.37 4.10 52.37 0.00 0.91 0.85 0.97 0.37 0.01
dm-1 0.00 0.00 0.00 0.00 0.05 0.00 50.09 0.00 0.17 0.17 0.00 0.09 0.00
rrqm/s:将读入请求合并后,每秒发送到设备的读入请求数.
wrqm/s:将写入请求合并后,每秒发送到设备的写入请求数.
r/s:每秒发送到设备的读入请求数.
w/s:每秒发送到设备的写入请求数.
rsec/s:每秒从设备读入的扇区数.
wsec/s:每秒向设备写入的扇区数.
rkB/s:每秒从设备读入的数据量,单位为K.
wkB/s:每秒向设备写入的数据量,单位为K.
avgrq-sz:发送到设备的请求的平均大小,单位是扇区.
avgqu-sz:发送到设备的请求的平均队列长度.
await:I/O请求平均执行时间.包括发送请求和执行的时间.单位是毫秒.
svctm:发送到设备的I/O请求的平均执行时间.单位是毫秒.
%util:在I/O请求发送到设备期间,占用CPU时间的百分比.用于显示设备的带宽利用率.
当这个值接近100%时,表示设备带宽已经占满.
2、iozone命令
五、脚本应用场景:
磁盘使用率监控一般周期为小时、天,不会太频繁。
监控平台+监控脚本
计划任务+监控脚本
手动监控
六、解决问题
及时掌握磁盘容量,防止100%造成磁盘无法读取。
七、监控命令
[root@CentOs shell]# cat io_status.sh
#!/bin/bash
#磁盘io监控 明确知晓HD的使用情况
#监控指标 IO队列长度 IOPS 吞吐量
#监控命令: iostat iozone
#iostat命令
io(){
device_num=`iostat -x |egrep "^sd[a-z]"|wc -l`
iostat -x 1 3|egrep "^sd[a-z]"|tail -n +$((device_num))|awk '{io_long[$1]+=$9}END{for (i in io_long)print io_long[i],i}'
}
#阈值如何判断 2-3已经很大了(我们一般是不会写循环的,此处是为了实验需要!)
while true
do
io
sleep 5
done
[root@CentOs shell]#
我们一般可以做个测试,重新开启一个终端,运行这个命令:dd if=/dev/zero of=/tmp/bigfile bs=1M count=3000
[root@CentOs shell]# dd if=/dev/zero of=/tmp/bigfile bs=1M count=3000
记录了3000+0 的读入
记录了3000+0 的写出
3145728000字节(3.1 GB)已复制,12.5831 秒,250 MB/秒
[root@CentOs shell]# rm -rf /tmp/bigfile
[root@CentOs shell]#
我们发现,刚开始还不明显,新开终端运行了命令之后数值就上量了!
附:
tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。
tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。
命令格式:tail [参数] [文件]
参数:
- -f 循环读取
- -q 不显示处理信息
- -v 显示详细的处理信息
- -c<数目> 显示的字节数
- -n<行数> 显示文件的尾部 n 行内容
- --pid=PID 与-f合用,表示在进程ID,PID死掉之后结束
- -q, --quiet, --silent 从不输出给出文件名的首部
- -s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒
实例
要显示 notes.log 文件的最后 10 行,请输入以下命令:
tail notes.log # 默认显示最后 10 行
要跟踪名为 notes.log 的文件的增长情况,请输入以下命令:
tail -f notes.log
此命令显示 notes.log 文件的最后 10 行。当将某些行添加至 notes.log 文件时,tail 命令会继续显示这些行。 显示一直继续,直到您按下(Ctrl-C)组合键停止显示。
显示文件 notes.log 的内容,从第 20 行至文件末尾:
tail -n +20 notes.log
显示文件 notes.log 的最后 10 个字符:
tail -c 10 notes.log