文章目录
说明实现过程脚本代码给权限创建目录加入定时任务观察脚本执行上面问题结果总结如何测试Linux命令运行时间?说明time 命令基本用法将时间信息写入文件显示更详细的时间信息自定义输出格式linux查看磁盘io的几种方法第一种:用 top 命令 中的cpu 信息观察第二种:用vmstat说明vmstat参数解释第三种:用iostat(神器,好用)安装常用参数选项说明最常使用iostat参数解释更多使用示例显示一条统计记录,包括所有的CPU和设备.仅看cpu信息,2秒一次,输出3次查看TPS和吞吐量信息每隔2秒,显示一次设备统计详细信息,ctrl+c结束。每隔2秒,显示一次设备统计详细信息.总共输出3次.每隔2秒显示一次sda设备的扩展统计信息,共输出6次.每隔2秒显示一次sda及上面所有分区的统计信息,共输出3次.定位到硬盘io大的dm位置硬盘io脚本使用方法说明
哈喽,新年好呀,新年后上班遇到的第一个故障,额,就是虚拟机的一个外挂盘vdb有时候(是的,有时候,概率性出现,有时候几天出现一次)会出现vi写入文件都直接卡死的情况(但是此时vda系统硬盘是正常的),出现该情况以后呢,也会导致vdb中的所有文件无法访问,而导致应用中断。
所以根据此情况呢,初步得出3个可能性
1、会不会是因为vdb这个外挂盘使用有问题呢? 因为该盘划lv的时候并没有用fdisk化扇区,而1024G的空间他们只使用了500G,因为没有化扇区,所以使用了一半的裸盘容量,而剩下的裸盘容量因为某些原因出现某种操作(比如效验),在大量写入的时候(类似于写无底洞文件到这个文件下,大量产生io),会导致该外挂盘卡死(因为裸盘没有使用到的文件扇区在做效验导致正在使用的扇区卡死呢)。2、因为他们是通过一个脚本持续不断的往vdb这个挂载目录下写文件,会不会因为写入vdb这个脚本逻辑有啥问题,导致的这种情况发生呢?但他们有把这个脚本服务全停了,理论上vi就恢复了,但vi并没有恢复,所以这个可能性几乎为0,所以可能性最大的还是猜想1,但是我现在没有办法验证(不知道怎么验证这种没有化扇区并且使用一半裸盘容量的lv到底有没有问题)。3、会不会是因为底层的vdb这个外挂盘有问题呢? 仅仅是猜想哈,因为这个外挂盘是在底层创建的,而且这个外挂盘是3副本,虽然数据不可能丢失,但理论上也不可能出现某个外挂盘出现vi写入故障啊! 现在云上一共有几千个外挂盘,没有任何一个出现过这次遇到的硬盘卡死问题(连vi写点东西都直接卡死),虽然我不相信底层创建的外挂盘会有问题,但还是保留意见吧,毕竟凡事无绝对,反正现在遇到了,万一这个真的就是发生那种不可能发生的概率性问题了呢!
总结
现在呢,最大的怀疑还是上面猜测1,是因为使用的问题导致的,没有使用到的裸盘容量在遇到大量写入io的时候,在做效验,导致正在使用的那半边容量卡主,反正数据没丢过,使用肯定是没问题的,只是有点纳闷,为什么有那么使用方化lv不给硬盘化扇区呢!!!!! 离谱
现在的解决方案
1、先创建一个vdc外挂盘,正常流程,化扇区,做lv,挂目录,并写一个脚本,和vdb一起,每分钟写入一次数据,看vdb出问题的时候,vdc是否正常 a.假设vdb出问题了,vdc正常,那么就坐实了我猜测1中的想法,是他们使用的问题,因为一直在往vdb中写入文件,某一瞬间遇到大量io,没使用的那半边容量在做效验,导致正在使用的空间卡死。。。。b.假设vdb出问题了,vdc也出问题,那么,那么,那么。。。啥问题呢? 可是vda系统盘是正常的啊,先保留吧,应该不会出现这种问题,要真出现了,我也得去寻求大佬给答案了。
现阶段
我现在新建了一个vdc,并将创建lv挂载到/test目录上了,所以呢,写了如下的监控脚本,等下次vdb出问题了,再看结果是啥问题把。
所以我需要实现的脚本就是
1、echo写入vdb和vdc挂载的目录任意文件,记录写入完成时间,正常时间一瞬间完成,如果vdb出问题了,那么写入完成时间会变得很长,此时再看vdc的完成时间是否正常
2、监控硬盘io和cpu使用率(根据应用方消息,如果vdb卡主了,使用率会飙升)
3、把这些信息分别加入到定时任务,每分钟执行一次,并且分开记录,所以我是创建了3个目录(vdb,vdc,io)分别记录这些信息,然后最后用当天日期存放信息。
实现过程
脚本代码
[root@ciserver sh]# cat vdb.sh date >> /sh/vdb/`date +%Y%m%d`uptime >> /sh/vdb/`date +%Y%m%d`#另外,如果最小化安装可能time命令能执行,但没有/usr/bin/time这个路径,可以用find查找time路径,#然后替换,如果找不到,可以拷贝/usr/bin/time这个文件到该台服务器上即可# /date是vdb挂载目录`/usr/bin/time -o /sh/vdb/time.txt echo test > /date/aaa.txt` >> /sh/vdb/`date +%Y%m%d`cat /sh/time.txt >> /sh/vdb/`date +%Y%m%d`echo -e "\n" >> /sh/vdb/`date +%Y%m%d`[root@ciserver sh]#[root@ciserver sh]# cat vdc.sh date >> /sh/vdc/`date +%Y%m%d`uptime >> /sh/vdc/`date +%Y%m%d`#另外,如果最小化安装可能time命令能执行,但没有/usr/bin/time这个路径,可以用find查找time路径,#然后替换,如果找不到,可以拷贝/usr/bin/time这个文件到该台服务器上即可# test是vdc挂载目录`/usr/bin/time -o /sh/vdc/time.txt echo test > /test/aaa.txt` >> /sh/vdc/`date +%Y%m%d`cat /sh/time.txt >> /sh/vdc/`date +%Y%m%d`echo -e "\n" >> /sh/vdc/`date +%Y%m%d`[root@ciserver sh]#[root@ciserver sh]# cat io.sh date >> /sh/io/`date +%Y%m%d`echo "vmstst" >> /sh/io/`date +%Y%m%d`vmstat 2 5 >> /sh/io/`date +%Y%m%d`echo "iostat" >> /sh/io/`date +%Y%m%d`iostat -dx >> /sh/io/`date +%Y%m%d`echo -e "\n" >> /sh/io/`date +%Y%m%d`You have new mail in /var/spool/mail/root[root@ciserver sh]#
注:监控io是需要一个命令的
上传一个镜像挂载到linux上,安装下面的命令全部执行一遍即可,必须安装,否则iostat无法执行。
给权限创建目录
我执行过了,所以我在前面加#了,你自己把下面命令全部执行一遍即可
[root@ciserver sh]# # chmod 777 vdb.sh[root@ciserver sh]# # chmod 777 vdc.sh[root@ciserver sh]# # chmod 777 io.sh[root@ciserver sh]# # mkdir /sh/vdb[root@ciserver sh]# # mkdir /sh/vdc[root@ciserver sh]# # mkdir /sh/io[root@ciserver sh]#
加入定时任务
下面是每分钟执行一次,因为分开写的,所以我写了3条
[root@ciserver sh]# crontab -e* * * * * /sh/vdb.sh* * * * * /sh/vdc.sh* * * * * /sh/io.sh# 然后wq保存退出
观察脚本执行
因为我之前有写入信息,所以我现在全部清空
[root@ciserver sh]# > io/2024 [root@ciserver sh]# > vdb/2024 [root@ciserver sh]# > vdc/2024 [root@ciserver sh]#
然后看是否会每分钟按需记录信息,几分钟后,发现信息都正常记录,该脚本完成,那么就等待下一次vdb出问题以后再看吧。
[root@ciserver sh]# cat io/2024 Mon Feb 14 17:01:01 CST vmststprocs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st3 00 4050564 4400 2822632 0 0 15 12 215 165 1 3 96 0 03 00 4052392 4400 2822884 0 00 39 3756 6028 1 2 97 0 00 00 4053756 4400 2822888 0 00 18 3781 5408 1 1 97 0 00 00 4053540 4400 2822864 0 00 47 3180 5021 1 1 98 0 01 00 4052936 4400 2822832 0 02 72 3936 6116 1 2 98 0 0iostatLinux 3.10.0-957.el7.x86_64 (ciserver) 02/14/_x86_64_ (8 CPU)Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.37 2.23 7.23 118.86 96.02 45.420.01 1.61 3.00 1.18 0.65 0.61dm-0 0.000.00 2.20 7.60 117.15 95.21 43.320.02 1.78 3.04 1.41 0.62 0.61dm-1 0.000.00 0.00 0.000.060.00 29.180.00 1.19 1.19 0.00 0.95 0.00Mon Feb 14 17:02:01 CST vmststprocs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st4 00 4049012 4400 2822968 0 0 15 12 216 167 1 3 96 0 00 00 4060652 4400 2822944 0 02 42 3728 5835 1 2 97 0 00 00 4059992 4400 2822956 0 00 14 3689 5759 1 2 98 0 00 00 4061164 4400 2822968 0 02 32 3899 5622 2 2 97 0 00 00 4060792 4400 2822972 0 00 16 2863 4724 0 1 99 0 0iostatLinux 3.10.0-957.el7.x86_64 (ciserver) 02/14/_x86_64_ (8 CPU)Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.37 2.22 7.23 118.49 95.89 45.340.01 1.61 3.00 1.18 0.65 0.61dm-0 0.000.00 2.20 7.60 116.78 95.09 43.240.02 1.77 3.04 1.41 0.62 0.61dm-1 0.000.00 0.00 0.000.060.00 29.180.00 1.19 1.19 0.00 0.95 0.00Mon Feb 14 17:03:01 CST vmststprocs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st3 00 4060748 4400 2823056 0 0 15 12 217 169 1 3 96 0 00 00 4052648 4400 2823068 0 00 26 5633 7641 1 3 95 0 02 00 4050996 4400 2823084 0 00 36 3811 5968 1 1 98 0 01 00 4051460 4400 2823088 0 00 32 3829 5543 1 2 97 0 00 00 4051112 4400 2823104 0 00 16 3825 5957 1 1 98 0 0iostatLinux 3.10.0-957.el7.x86_64 (ciserver) 02/14/_x86_64_ (8 CPU)Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.37 2.22 7.23 118.12 95.74 45.270.01 1.61 3.01 1.18 0.65 0.61dm-0 0.000.00 2.19 7.60 116.42 94.94 43.180.02 1.77 3.04 1.40 0.62 0.61dm-1 0.000.00 0.00 0.000.060.00 29.180.00 1.19 1.19 0.00 0.95 0.00Mon Feb 14 17:04:01 CST vmststprocs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 00 4047992 4400 2823424 0 0 15 12 218 170 1 3 96 0 00 00 4049572 4400 2823516 0 00 49 4270 6384 1 2 97 0 00 00 4048360 4400 2823528 0 00 24 3757 5729 1 2 97 0 00 00 4049548 4400 2823544 0 00 22 3948 5785 1 2 97 0 00 00 4048904 4400 2823560 0 00 31 3666 5450 1 1 97 0 0iostatLinux 3.10.0-957.el7.x86_64 (ciserver) 02/14/_x86_64_ (8 CPU)Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.37 2.21 7.23 117.75 95.59 45.210.01 1.60 3.01 1.18 0.65 0.61dm-0 0.000.00 2.18 7.60 116.06 94.79 43.110.02 1.77 3.04 1.40 0.62 0.60dm-1 0.000.00 0.00 0.000.060.00 29.180.00 1.19 1.19 0.00 0.95 0.00[root@ciserver sh]# [root@ciserver sh]# cat vdb/2024 Mon Feb 14 17:01:01 CST 17:01:01 up 5:17, 2 users, load average: 0.54, 0.54, 0.400.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 632maxresident)k0inputs+0outputs (0major+208minor)pagefaults 0swapsMon Feb 14 17:02:01 CST 17:02:01 up 5:18, 2 users, load average: 0.27, 0.47, 0.390.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 632maxresident)k0inputs+0outputs (0major+208minor)pagefaults 0swapsMon Feb 14 17:03:01 CST 17:03:01 up 5:19, 2 users, load average: 0.27, 0.46, 0.390.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 632maxresident)k0inputs+0outputs (0major+208minor)pagefaults 0swapsMon Feb 14 17:04:01 CST 17:04:01 up 5:20, 2 users, load average: 0.10, 0.37, 0.370.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 632maxresident)k0inputs+0outputs (0major+208minor)pagefaults 0swaps[root@ciserver sh]# cat vdc/2024 Mon Feb 14 17:01:01 CST 17:01:01 up 5:17, 2 users, load average: 0.54, 0.54, 0.400.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 632maxresident)k0inputs+0outputs (0major+208minor)pagefaults 0swapsMon Feb 14 17:02:01 CST 17:02:01 up 5:18, 2 users, load average: 0.27, 0.47, 0.390.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 632maxresident)k0inputs+0outputs (0major+208minor)pagefaults 0swapsMon Feb 14 17:03:01 CST 17:03:01 up 5:19, 2 users, load average: 0.27, 0.46, 0.390.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 632maxresident)k0inputs+0outputs (0major+208minor)pagefaults 0swapsMon Feb 14 17:04:01 CST 17:04:01 up 5:20, 2 users, load average: 0.10, 0.37, 0.370.00user 0.00system 0:00.00elapsed 100%CPU (0avgtext+0avgdata 632maxresident)k0inputs+0outputs (0major+208minor)pagefaults 0swaps[root@ciserver sh]#
上面问题结果总结
首先,上面猜测的13都不正确,用dd做了很多测试,vdb和vdc的写入速度是一样的,不存在我前面说的那种问题,2的个理论上也没问题,重启以后排队全部释放了(这台虚拟机已经运行370多天了),基本上一切都正常了。因为重启前,硬盘各种io包括wait都是固定一个值了,那么这个值是均峰值了,后面还有很多排队的,所以值一直不会变化,重启以后,排队的释放了,现在偶尔会高,但io够用了。(所以重启大法还是有用的)最后 我们把vdb没使用的空间全部扩容了,并且后面尝试把vdb的数据迁移一部分到vdc上,后续再观察看看是否会出现这种问题吧!
现在一切 岁月静好~
解决这个问题期间也出现过争执,用户总是说是我们底层有问题,但还是理解用户方的心情,毕竟出问题了也着急,其实我知道这种情况是用户使用场景导致的,但搞技术的,遇到问题还是需要用数据说话,最终也用数据坐实了问题,也证明了我们底层没问题,用户也没拿我们底层说事了,这对我来说,很是欣慰!耗时2天 问题基本定位到了 处理方案也提供了,后面就逐步落实吧 1、现阶段是先把vdb空间扩容,因为是分布式存储,空间大,可以分布广一点,多少能缓解下io压力。2、新增一个vdc,把vdb中的io分散一部分到vdc上。3、新建一台虚拟机,把业务分开部署到另外一台虚拟机上。问题得到解决 皆大欢喜 记录一下(2月15日 18:04:53)。
如何测试Linux命令运行时间?
说明
因为我们对于时间的要求比较高,需要在短时间内就获取到正确的时间。所以我们就需要对这个脚本运行时间进行测试,看看从开始运行到正确设置时间需要花费多少时间。
其实在工作中,还有很多情况下需要测试一个脚本或者程序运行多少时间,特别是对于时间性要求比较高的系统更是如此。
对于时间的测试,我们可以用到一个命令:time 。下面我们就详细看看如何使用 time 命令来对脚本/命令进行测时。
time 命令基本用法
time 命令最基本的用法,就是time + 命令
,比如:[root@ciserver sh]# time ping PING (123.125.114.144) 56(84) bytes of data.64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=1 ttl=56 time=2.83 ms64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=2 ttl=56 time=2.77 ms…………^C--- ping statistics ---8 packets transmitted, 8 received, 0% packet loss, time 10818msrtt min/avg/max/mdev = 2.765/2.808/2.862/0.039 msreal 0m11.173suser 0m0.004ssys0m0.002s
在结果里real
表示从我们执行 ping 命令到最终按 ctrl+c 终止这段时间所耗费的时间;user
及sys
分别表示 ping 命令在用户空间及内核空间所运行的时间。
将时间信息写入文件
如果我们想把时间信息直接写入到文件,而不是显示在屏幕上,那么我们可以使用 -o 选项,并指定写入的文件路径。不同写法 方式1[root@ciserver sh]# /usr/bin/time -o /test/time-output.txt ping
方式2
注:如果最小化安装可能time命令能执行,但没有/usr/bin/time这个路径,可以用find查找time路径,然后替换,如果找不到,可以拷贝/usr/bin/time这个文件到该台服务器上即可
# /date可以是任意挂载目录(这种情况更适用于测试不同外挂盘的性能等场景)[root@ciserver sh]# `/usr/bin/time -o /sh/vdb/time.txt echo test > /date/aaa.txt` >> /sh/vdb/`date +%Y%m%d`
执行这个命令后,ping 命令的输出结果依然会在终端里,而 time 命令的结果就写入到我们所指定的 time-output.txt 文件里。
-o
选项表示输出文件不存在就创建,如果存在的话就直接覆盖重写。如果我们不想覆盖重写,而是想追加在文件后面,我们可以使用-a
选项。
[root@ciserver sh]# /usr/bin/time -a /test/time-output.txt ping
显示更详细的时间信息
time 命令不带选项的话,显示的信息量比较少,如果我们想获得更详细的信息,那么我们可以使用 -v 选项。[root@ciserver sh]# /usr/bin/time -v ping PING (123.125.114.144) 56(84) bytes of data.64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=1 ttl=56 time=2.75 ms64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=2 ttl=56 time=2.76 ms64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=3 ttl=56 time=2.85 ms64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=4 ttl=56 time=2.77 ms^C--- ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3300msrtt min/avg/max/mdev = 2.751/2.785/2.851/0.075 msCommand being timed: "ping "User time (seconds): 0.00System time (seconds): 0.00Percent of CPU this job got: 0%Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.64Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 2140Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 626Voluntary context switches: 10Involuntary context switches: 0Swaps: 0File system inputs: 0File system outputs: 0Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0
这个结果信息就相当详细了,我们可以获取到足够多我们所需要的信息。
自定义输出格式
默认情况下,time 命令只输出 real,usr,sys 三个内容,如果我们想要个性化一些,算定义它的输出格式,time 命令也是支持的。time 命令支持的格式有很多,如下所示:C - Name and command line arguments usedC-使用的名称和命令行参数D - Average size of the process's unshared data area in kilobytesD—进程非共享数据区的平均大小(以KB为单位)E - Elapsed time in a clock formatE-时钟格式的运行时间F - Number of page faultsF-页面错误数I - Number of file system inputs by the processI-进程的文件系统输入数K - Average total memory use of the process in kilobytesK-进程的平均总内存使用量(KB)M - Maximum resident set the size of the process during the lifetime in KilobytesM-最大驻留设置进程在生存期内的大小(以KB为单位)O - Number of file system outputs by the processO-进程的文件系统输出数P - Percentage of CPU that the job receivedP—作业接收到的CPU百分比R - Number of minor or recoverable page faultsR-轻微或可恢复的页面错误数S - Total number of CPU seconds used by the system in kernel modeS—系统在内核模式下使用的CPU总秒数U - Total number of CPU seconds used by user modeU-用户模式使用的CPU总秒数W - Number of times the process was swapped out of main memoryW—进程从主内存中交换的次数X - Average amount of shared text in the processX-过程中共享文本的平均数量Z - System's page size in kilobytesZ-系统的页面大小(以KB为单位)c - Number of times the process was context-switchedc—进程被上下文切换的次数e - Elapsed real time used by the process in secondse-进程使用的已用实时时间(秒)k - Number of signals delivered to the processk——传递给过程的信号数量p - Average unshared stack size of the process in kilobytesp-进程的平均非共享堆栈大小(以KB为单位)r - Number of socket messages received by the processr—进程接收的套接字消息数s - Number of socket messages sent by the processs—进程发送的套接字消息数t - Average resident set size of the process in kilobytest-进程的平均驻留集大小(以KB为单位)w - Number of time the process was context-switched voluntarilyw——进程自动切换上下文的时间x - Exit status of the commandx-命令的退出状态
如果我们想要输出以下这样的格式:
Elapsed Time = 0:01:00, Inputs 2, Outputs 1
我们可以这样自定义:
[root@ciserver sh]# /usr/bin/time -f "Elapsed Time = %E, Inputs %I, Outputs %O" ping PING (220.181.38.148) 56(84) bytes of data.64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=54 time=1.82 ms64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=54 time=1.86 ms^C--- ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3003msrtt min/avg/max/mdev = 1.825/1.859/1.879/0.056 msElapsed Time = 0:03.92, Inputs 0, Outputs 0
如果你想让输出的结果有换行,可以在对应的地方添加 \n ,比如:
[root@ciserver sh]# /usr/bin/time -f "Elapsed Time = %E \n Inputs %I \n Outputs %O" ping
这样输出的结果就类似于这样:
Elapsed Time = 0:03.92Inputs 0Outputs 0
linux查看磁盘io的几种方法
怎样才能快速的定位到并发高是由于磁盘io开销大呢?可以通过三种方式:
第一种:用 top 命令 中的cpu 信息观察
top可以看到的cpu信息有:Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombieCpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si#具体的解释如下:Tasks: 29 total 进程总数1 running 正在运行的进程数28 sleeping 睡眠的进程数0 stopped 停止的进程数0 zombie 僵尸进程数Cpu(s):0.3% us 用户空间占用CPU百分比1.0% sy 内核空间占用CPU百分比0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比98.7% id 空闲CPU百分比0.0% wa 等待输入输出的CPU时间百分比0.0% hi0.0% si0.0% wa 的百分比可以大致的体现出当前的磁盘io请求是否频繁。如果 wa的数量比较大,说明等待输入输出的的io比较多。
第二种:用vmstat
说明
vmstat 命令报告关于线程、虚拟内存、磁盘、陷阱和 CPU 活动的统计信息。由 vmstat 命令生成的报告可以用于平衡系统负载活动。系统范围内的这些统计信息(所有的处理器中)都计算出以百分比表示的平均值,或者计算其总和。输入命令:vmstat 2 5
【意思是每2秒执行一次,一共执行5次】如果发现等待的进程和处在非中断睡眠状态的进程数非常多,并且发送到块设备的块数和从块设备接收到的块数非常大,那就说明磁盘io比较多。
[root@ciserver sh]# vmstst 2 5procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st3 00 4050564 4400 2822632 0 0 15 12 215 165 1 3 96 0 03 00 4052392 4400 2822884 0 00 39 3756 6028 1 2 97 0 00 00 4053756 4400 2822888 0 00 18 3781 5408 1 1 97 0 00 00 4053540 4400 2822864 0 00 47 3180 5021 1 1 98 0 01 00 4052936 4400 2822832 0 02 72 3936 6116 1 2 98 0 0
vmstat参数解释
Procs
r(run)
: 等待运行的进程数
当我们只有一个cpu的时候,在同一个时间段,只有一个进程在被CPU处理,其余的在排队。只要在排队就是run的状态,当中我们可以限定一个进程使用cpu 的时间,进行轮流。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。b(block)
: 处在非中断睡眠状态的进程数
表示进程被cpu以外的状态给阻断了,比如是硬盘,网络,当我们进程发一个数据包,网速快很快就能发完,但是当网速太慢,就会导致b的状态
Memory
swpd
: 虚拟内存使用情况,单位:KB
swpd 当内存不够的时候,会把数据放在swpd中,如果这个swpd数值在变动的时候,说明内存不够了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。w
: 被交换出去的可运行的进程数。此数由 linux 计算得出,但 linux 并不耗尽交换空间【没有这个参数忽略】free
: 空闲的内存,单位KBbuff
: 被用来做为缓存的内存数,单位:KB
Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存cache
: cache直接用来记忆我们打开的文件,给文件做缓冲(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
Swap
si
: 从磁盘交换到内存的交换页数量,单位:KB/秒
每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。so
: 从内存交换到磁盘的交换页数量,单位:KB/秒
每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。注:如果swpd在变的时候,这两个数值也是在变动的,si:有多少个数据块单位k,从swap中进入到内存中,so,就是从内存中出来的
IO
bi
: 发送到块设备的块数,单位:块/秒
块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒bo
: 从块设备接收到的块数,单位:块/秒
块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
这两个数值是和磁盘有关系的,bi就是读的量,bo就是写的量
System
in
: 每秒的中断数,包括时钟中断cs
: 每秒的环境(上下文)切换次数
每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
CPU
按 CPU 的总使用百分比来显示
us
: CPU 使用时间
表示用户级别的,用户占用,数字不会超过100,这个是百分比形式。用户派的资源占用cpu的百分比,如果长时间大于50,代表系统资源不够了
us+sy+id=100%sy
: CPU 系统使用时间
系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。id
: 闲置时间
空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。wa-st
: 等待IO CPU时间。
等待,和b有点类似,等待cpu 的百分比,有多少个进程在等待cpu,如果数值大,就说明cpu就快不够了
第三种:用iostat(神器,好用)
iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
安装
iostat
是 sysstat 工具集的一个工具,需要安装。 Centos的安装方式是:yum install sysstat -y
【也可以使用我上面脚本代码中的用rpm安装】Ubuntu的安装方式是:aptitude install sysstat
常用参数选项说明
-c
仅显示CPU统计信息.与-d选项互斥.-d
仅显示磁盘统计信息.与-c选项互斥.-k
以K为单位显示每秒的磁盘请求数,默认单位块.-p
device | ALL与-x选项互斥,用于显示块设备及系统分区的统计信息.也可以在-p后指定一个设备名,如:iostat -p hda
, 或显示所有设备iostat -p ALL
-t
在输出数据时,打印搜集数据的时间.-V
打印版本号和帮助信息.-x
输出扩展信息.
最常使用
io和cpu使用率观察简直不要太方便。iostat -dx
显示磁盘扩展信息也可以用iostat -dx 1
表示每秒更新一次,一直动态刷新,ctrl+c
结束,这个是在io比较大的时候,观察用特别方便。
[root@ciserver sh]# iostat -dxLinux 3.10.0-957.el7.x86_64 (ciserver) 02/14/_x86_64_ (8 CPU)Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.37 2.22 7.23 118.49 95.89 45.340.01 1.61 3.00 1.18 0.65 0.61dm-0 0.000.00 2.20 7.60 116.78 95.09 43.240.02 1.77 3.04 1.41 0.62 0.61dm-1 0.000.00 0.00 0.000.060.00 29.180.00 1.19 1.19 0.00 0.95 0.00
r/s
和w/s
分别是每秒的读操作和写操作,而rKB/s
和wKB/s
列以每秒千字节为单位显示了读和写的数据量。
如果这两对数据值都很高的话说明磁盘io操作是很频繁。
iostat参数解释
下面参数是iostat -dx
的所有内容
rrqm/s
:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);
wrqm/s
:每秒这个设备相关的写入请求有多少被Merge了。
rsec/s
:每秒读取的扇区数;
wsec/
:每秒写入的扇区数。
rKB/s
:每秒从设备读入的数据量,单位为K.
wKB/s
:每秒向设备写入的数据量,单位为K.
avgrq-sz
:平均请求扇区的大小
avgqu-sz
:是平均请求队列的长度。毫无疑问,队列长度越短越好。
await
: 每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。【该值太大可能会导致应用缓慢】
这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
svctm
: 表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长, 系统上运行的应用程序将变慢。
svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。
%util
: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
更多使用示例
显示一条统计记录,包括所有的CPU和设备.
[root@ciserver ~]# iostatLinux 3.10.0-957.el7.x86_64 (ciserver) 02/16/_x86_64_ (8 CPU)avg-cpu: %user %nice %system %iowait %steal %idle1.18 0.00 3.14 0.01 0.00 95.67Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 12.43 40.45 182.90 6968892 31508996dm-0 12.68 40.25 182.81 6934478 31493513dm-1 0.00 0.01 0.00 18960[root@ciserver ~]#
仅看cpu信息,2秒一次,输出3次
[root@ciserver ~]# iostat -c 2 3Linux 3.10.0-957.el7.x86_64 (ciserver) 02/16/_x86_64_ (8 CPU)avg-cpu: %user %nice %system %iowait %steal %idle1.18 0.00 3.14 0.01 0.00 95.67avg-cpu: %user %nice %system %iowait %steal %idle1.21 0.00 5.37 0.13 0.00 93.29avg-cpu: %user %nice %system %iowait %steal %idle1.85 0.00 3.32 0.00 0.00 94.83[root@ciserver ~]#
查看TPS和吞吐量信息
注:下面的-k
磁盘读写速度单位为KB,-m
磁盘读些速度为MB
[root@ciserver ~]# iostat -d -k 2 3Linux 3.10.0-957.el7.x86_64 (ciserver) 02/16/_x86_64_ (8 CPU)Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 12.42 40.34 182.61 6968892 31548750dm-0 12.66 40.14 182.52 6934478 31533267dm-1 0.00 0.01 0.00 18960Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda4.00 0.00 18.000 36dm-0 4.00 0.00 18.000 36dm-1 0.00 0.00 0.0000Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda3.50 0.00 20.000 40dm-0 3.50 0.00 20.000 40dm-1 0.00 0.00 0.0000[root@ciserver ~]# iostat -d -m 2 3Linux 3.10.0-957.el7.x86_64 (ciserver) 02/16/_x86_64_ (8 CPU)Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtnsda 12.42 0.04 0.18 680530809dm-0 12.66 0.04 0.18 677130794dm-1 0.00 0.00 0.0010Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtnsda3.50 0.00 0.0200dm-0 3.50 0.00 0.0200dm-1 0.00 0.00 0.0000Device: tps MB_read/s MB_wrtn/s MB_read MB_wrtnsda4.50 0.00 0.0400dm-0 4.50 0.00 0.0400dm-1 0.00 0.00 0.0000[root@ciserver ~]#
每隔2秒,显示一次设备统计详细信息,ctrl+c结束。
[root@ciserver ~]# iostat -dx 2Linux 3.10.0-957.el7.x86_64 (ciserver) 02/16/_x86_64_ (8 CPU)Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.25 1.28 11.15 40.44 182.87 35.920.01 1.12 4.03 0.78 0.25 0.32dm-0 0.000.00 1.28 11.40 40.24 182.78 35.180.01 1.14 4.05 0.81 0.25 0.31dm-1 0.000.00 0.00 0.000.010.00 27.280.00 1.01 1.01 0.00 0.82 0.00^C[root@ciserver ~]# iostat -dx 2Linux 3.10.0-957.el7.x86_64 (ciserver) 02/16/_x86_64_ (8 CPU)Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.25 1.28 11.15 40.44 182.87 35.920.01 1.12 4.03 0.78 0.25 0.32dm-0 0.000.00 1.28 11.40 40.24 182.78 35.180.01 1.14 4.05 0.81 0.25 0.31dm-1 0.000.00 0.00 0.000.010.00 27.280.00 1.01 1.01 0.00 0.82 0.00Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.00 0.00 4.500.00 22.009.780.00 0.44 0.00 0.44 0.44 0.20dm-0 0.000.00 0.00 4.500.00 22.009.780.00 0.44 0.00 0.44 0.44 0.20dm-1 0.000.00 0.00 0.000.000.000.000.00 0.00 0.00 0.00 0.00 0.00Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.00 0.00 8.000.00 76.50 19.120.00 0.12 0.00 0.12 0.12 0.10dm-0 0.000.00 0.00 8.000.00 76.50 19.120.00 0.12 0.00 0.12 0.12 0.10dm-1 0.000.00 0.00 0.000.000.000.000.00 0.00 0.00 0.00 0.00 0.00^C[root@ciserver ~]#
每隔2秒,显示一次设备统计详细信息.总共输出3次.
[root@ciserver ~]# iostat -dx 2 3Linux 3.10.0-957.el7.x86_64 (ciserver) 02/16/_x86_64_ (8 CPU)Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.25 1.28 11.15 40.43 182.82 35.920.01 1.12 4.03 0.78 0.25 0.32dm-0 0.000.00 1.28 11.40 40.23 182.73 35.180.01 1.14 4.05 0.81 0.25 0.31dm-1 0.000.00 0.00 0.000.010.00 27.280.00 1.01 1.01 0.00 0.82 0.00Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.00 0.00 7.000.00 26.757.640.00 0.21 0.00 0.21 0.21 0.15dm-0 0.000.00 0.00 7.000.00 26.757.640.00 0.21 0.00 0.21 0.21 0.15dm-1 0.000.00 0.00 0.000.000.000.000.00 0.00 0.00 0.00 0.00 0.00Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.00 0.00 6.000.00 43.25 14.420.00 0.33 0.00 0.33 0.25 0.15dm-0 0.000.00 0.00 6.000.00 43.25 14.420.00 0.33 0.00 0.33 0.25 0.15dm-1 0.000.00 0.00 0.000.000.000.000.00 0.00 0.00 0.00 0.00 0.00[root@ciserver ~]#
每隔2秒显示一次sda设备的扩展统计信息,共输出6次.
注:如果需要检测多个外挂盘,可以写多个,如:iostat -x sda dab 2 3
[root@ciserver ~]# iostat -x sda 2 3Linux 3.10.0-957.el7.x86_64 (ciserver) 02/16/_x86_64_ (8 CPU)avg-cpu: %user %nice %system %iowait %steal %idle1.18 0.00 3.14 0.01 0.00 95.67Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.25 1.28 11.15 40.42 182.78 35.910.01 1.11 4.03 0.78 0.25 0.32avg-cpu: %user %nice %system %iowait %steal %idle0.83 0.00 4.34 0.00 0.00 94.83Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.00 0.00 5.000.00 22.008.800.00 0.40 0.00 0.40 0.30 0.15avg-cpu: %user %nice %system %iowait %steal %idle2.05 0.00 3.59 0.00 0.00 94.36Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilsda0.000.00 0.00 15.500.00 4675.75 603.320.01 0.94 0.00 0.94 0.58 0.90[root@ciserver ~]#
每隔2秒显示一次sda及上面所有分区的统计信息,共输出3次.
[root@ciserver ~]# iostat -p sda 2 3Linux 3.10.0-957.el7.x86_64 (ciserver) 02/16/_x86_64_ (8 CPU)avg-cpu: %user %nice %system %iowait %steal %idle1.18 0.00 3.14 0.01 0.00 95.67Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 12.43 40.40 182.78 6968892 31527087sda1 0.00 0.17 0.092870215483sda2 12.42 40.22 182.69 6937474 31511604avg-cpu: %user %nice %system %iowait %steal %idle0.89 0.00 5.04 0.00 0.00 94.06Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda7.46 0.00 35.570 71sda1 0.00 0.00 0.0000sda2 7.46 0.00 35.570 71avg-cpu: %user %nice %system %iowait %steal %idle0.83 0.00 4.02 0.00 0.00 95.15Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda5.50 0.00 29.000 58sda1 0.00 0.00 0.0000sda2 5.50 0.00 29.000 58[root@ciserver ~]#
定位到硬盘io大的dm位置
如,下面的这个硬盘使用率就高的离谱,属于异常的啦~ 那么我现在如何知道使用率很高的dm呢,如dm-7,我想知道这个是哪个目录,查看方式。iostat -dxLinux 3.10.0-1062.9.1.el7.x86_64 (xz-dmz-collect-public1.novalocal) 02/14/ _x86_64_(16 CPU)Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilvda0.000.31 0.01 3.430.63 396.52 231.320.05 14.00 1187.59 11.56 0.99 0.34vdb0.00 14.74 0.44 401.473.52 2969.82 14.800.05 0.30 11.85 0.29 0.23 9.41dm-0 0.000.00 0.00 0.000.000.01 11.780.00 944.57 15.21 957.55 680.25 0.18dm-1 0.000.00 0.00 0.000.000.018.120.00 15.52 14.25 15.88 4.74 0.00dm-2 0.000.00 0.00 0.010.060.06 30.630.01 1117.74 3694.97 682.24 236.53 0.19dm-3 0.000.00 0.00 0.000.000.00 14.460.00 814.55 4.76 921.66 717.63 0.05dm-4 0.000.00 0.01 2.770.56 396.41 285.970.12 43.34 734.13 41.96 10.82 3.00dm-5 0.000.00 0.00 0.000.000.00 16.090.00 3.69 3.23 7.38 3.38 0.00dm-6 0.000.00 0.00 0.000.000.02 11.100.00 159.86 282.02 156.31 137.20 0.04dm-7 0.000.00 0.44 410.533.52 2969.82 14.470.03 0.05 12.01 0.03 0.30 12.20vdc0.000.00 0.00 0.000.000.00 36.380.00 1.98 0.65 2.22 0.27 0.00dm-8 0.000.00 0.00 0.000.000.00 33.640.00 2.15 0.54 2.30 1.93 0.00
命令:ll /dev/disk/bu-id
这个就会列出lv对应的软连接是哪个dm了!
硬盘io脚本使用方法
首先,本文上面代码中就有命令记录的方式。其他脚本的方法,去这篇博客吧~linux的CPU占用脚本、内存占用脚本和硬盘IO测试代码
监控不同外挂盘的硬盘io 查看linux命令运行时间和记录 iostat命令查看硬盘io 查看硬盘io的几种方法 定位到硬盘io高的dm