Linux下有许多使用Python语言编写的监控工具,如inotify-sync、dstat和glances。此外,如果要根据业务编写简单的监控脚本,很多工程师也会选择Python语言。Python语言是一门简单易学/语法清晰/表达能力强的编程语言,非常适合于编写监控程序的场景。使用Python语言编写监控程序具有以下几个优势:
1、Python语言开发效率高。Python语言有自己的优势与劣势,使用Python开发监控程序是一个充分发挥Python优势,避免Python劣势的领域。对于监控程序来说,能够利用Python语言开发效率高的优势尽快完成程序的编写工作。同时,监控程序也不要求性能,因此避免了Python语言性能不如C、C++和Java的劣势。
2、Python语言表达能力强。相信任何一个学习Linux的工程师都使用过shell脚本编写过监控程序。虽然Linux下有很多监控工具,也有很多文本处理程序,但是获取监控与解析结果是完全不同的工具。解析监控结果的程序不理解监控程序输出结果的具体含义。Python语言中有非常丰富的数据结构,可以用各种方式保存监控结果,以便后续处理。
3、利用第三方库开发监控程序。Python的标准库本身非常强大,被称为“连电池都包含在内”。对于一个问题,如果标准库没有提供相应的工具,那么也会有开源的项目来填补这个空白。监控程序正式这样一种情况,在Python语言中,具有非常成熟的第三方库帮助开发者简化监控程序的编写工作。
一、Python编写的监控工具
我们将介绍两个Python语言编写的监控工具,分别是dstat和glances。
1、多功能系统资源统计工具dstat
dstat是一个用Python语言实现的多功能系统资源统计工具,用来取代Linux下的vmstat、iostat、netstat、和ifstat等命令。并且,dstat克服了这些命令的限制,增加了额外的功能,以及更多的计数器与更好的灵活性。dstat可以在一个界面上展示非常全面的监控信息,因此,在系统监控、基准测试和故障排除等应用场景下特别有用。
我们可以使用dstat监控所有系统资源的使用情况,并且可以结合不同的场景定制监控的资源。例如,在同一时间段以相同的时间频率比较网络带宽与磁盘的吞吐率。
dstat将以列表的形式显示监控信息,并且使用不同的颜色进行输出,以可读性较强的单位展示监控数值。例如,对于字节数值,dstat自动根据数值的大小,以K、M、G等单位进行显示,避免了开发者使用其他命令时因为数值太大造成的困惑和错误。此外,使用dstat还可以非常方便地编写插件,用来收集默认情况下没有收到的监控信息。dstat是专门为人们实时查看监控信息设计的,因此默认将监控结果输出到屏幕终端。我们也可以将监控信息以CSV格式输出到文件,以便后续处理。
(1)dstat介绍
作为一个多功能系统资源统计工具,dstat具有以下特性:
结合了vmstat,iostat,ifstat,netstat以及更多的信息
实时显示统计情况
在分析和排障时可以通过启用监控项并排序
模块化设计
使用python编写的,更方便扩展现有的工作任务
容易扩展和添加你的计数器(请为此做出贡献)
包含的许多扩展插件充分说明了增加新的监控项目是很方便的
可以分组统计块设备/网络设备,并给出总数
可以显示每台设备的当前状态
极准确的时间精度,即便是系统负荷较高也不会延迟显示
显示准确地单位和和限制转换误差范围
用不同的颜色显示不同的单位
显示中间结果延时小于1秒
支持输出CSV格式报表,并能导入到Gnumeric和Excel以生成图形
如果操作系统默认没有安装dstat,那么需要我们手动进行安装。如下所示:
yum install dstat
查看dstat命令的帮助信息与支持选项,如下所示:
dstat --help
dstat命令的--version选项,处理显示dstat的版本以外,还会显示操作系统的版本、Python语言的版本、CPU的个数,以及dstat支持的插件列表等详细信息。如下所示:
[root@192 ~]# dstat --version
Dstat 0.7.2
Written by Dag Wieers <dag@wieers.com>
Homepage at http://dag.wieers.com/home-made/dstat/
Platform posix/linux2
Kernel 3.10.0-957.el7.x86_64
Python 2.7.5 (default, Oct 30 2018, 23:45:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]
Terminal type: xterm (color support)
Terminal size: 16 lines, 83 columns
Processors: 1
Pagesize: 4096
Clock ticks per secs: 100
internal:
aio, cpu, cpu24, disk, disk24, disk24old, epoch, fs, int, int24, io, ipc,
load, lock, mem, net, page, page24, proc, raw, socket, swap, swapold,
sys, tcp, time, udp, unix, vm
/usr/share/dstat:
battery, battery-remain, cpufreq, dbus, disk-tps, disk-util, dstat,
dstat-cpu, dstat-ctxt, dstat-mem, fan, freespace, gpfs, gpfs-ops,
helloworld, innodb-buffer, innodb-io, innodb-ops, lustre, memcache-hits,
mysql-io, mysql-keys, mysql5-cmds, mysql5-conn, mysql5-io, mysql5-keys,
net-packets, nfs3, nfs3-ops, nfsd3, nfsd3-ops, ntp, postfix, power,
proc-count, qmail, rpc, rpcd, sendmail, snooze, squid, test, thermal,
top-bio, top-bio-adv, top-childwait, top-cpu, top-cpu-adv, top-cputime,
top-cputime-avg, top-int, top-io, top-io-adv, top-latency,
top-latency-avg, top-mem, top-oom, utmp, vm-memctl, vmk-hba, vmk-int,
vmk-nic, vz-cpu, vz-io, vz-ubc, wifi
[root@192 ~]#
除了使用dstat命令的--version选项查看dstat的详细信息获取可支持的插件以外,还可以使用dstat命令的--list选项获取dstat的插件列表。如下所示:
[root@192 ~]# dstat --list
internal:
aio, cpu, cpu24, disk, disk24, disk24old, epoch, fs, int, int24, io, ipc, load, lock, mem, net, page, page24,
proc, raw, socket, swap, swapold, sys, tcp, time, udp, unix, vm
/usr/share/dstat:
battery, battery-remain, cpufreq, dbus, disk-tps, disk-util, dstat, dstat-cpu, dstat-ctxt, dstat-mem, fan,
freespace, gpfs, gpfs-ops, helloworld, innodb-buffer, innodb-io, innodb-ops, lustre, memcache-hits, mysql-io,
mysql-keys, mysql5-cmds, mysql5-conn, mysql5-io, mysql5-keys, net-packets, nfs3, nfs3-ops, nfsd3, nfsd3-ops, ntp,
postfix, power, proc-count, qmail, rpc, rpcd, sendmail, snooze, squid, test, thermal, top-bio, top-bio-adv,
top-childwait, top-cpu, top-cpu-adv, top-cputime, top-cputime-avg, top-int, top-io, top-io-adv, top-latency,
top-latency-avg, top-mem, top-oom, utmp, vm-memctl, vmk-hba, vmk-int, vmk-nic, vz-cpu, vz-io, vz-ubc, wifi
[root@192 ~]#
直接在终端输入dstat命令,dstat将以默认参数运行。默认情况下,dstat会收集CPU、磁盘、网络、交换页和系统消息,并以1秒钟1次的频率进行输出,直到我们按Ctrl+C结束。
(2)dstat常用选项
如下所示,dstat会提示我们没有指定任何参数,因此使用-cdngy参数运行。
[root@192 ~]# dstat
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
9 3 88 0 0 0| 219k 60k| 0 0 |2682B 5427B| 163 1542
20 5 75 0 0 0| 0 0 | 66B 894B| 0 0 | 326 4218
19 6 75 0 0 0| 0 0 | 126B 410B| 0 0 | 330 4431
18 7 75 0 0 0| 0 0 | 66B 416B| 0 0 | 341 2998
20 6 74 0 0 0| 0 0 | 66B 350B| 0 0 | 340 4098
19 6 75 0 0 0| 0 0 | 66B 350B| 0 0 | 319 4010
20 5 75 0 0 0| 0 0 | 66B 350B| 0 0 | 326 4378
19 6 75 0 0 0| 0 0 | 66B 350B| 0 0 | 322 4407
20 5 75 0 0 0| 0 0 | 66B 350B| 0 0 | 332 4520
21 6 73 0 0 0|1140k 0 | 66B 350B| 0 0 | 345 3341
20 7 72 0 0 1| 0 0 | 66B 358B| 0 0 | 348 3821
常用选项如下:
直接跟数字,表示#秒收集一次数据,默认为一秒;dstat 5表示5秒更新一次
-c,--cpu 统计CPU状态,包括system, user, idle, wait, hardware interrupt, software interrupt等;
-d, --disk 统计磁盘读写状态
-D total,sda 统计指定磁盘或汇总信息
-l, --load 统计系统负载情况,包括1分钟、5分钟、15分钟平均值
-m, --mem 统计系统物理内存使用情况,包括used, buffers, cache, free
-s, --swap 统计swap已使用和剩余量
-n, --net 统计网络使用情况,包括接收和发送数据
-N eth1,total 统计eth1接口汇总流量
-r, --io 统计I/O请求,包括读写请求
-p, --proc 统计进程信息,包括runnable、uninterruptible、new
-y, --sys 统计系统信息,包括中断、上下文切换
-t 显示统计时时间,对分析历史数据非常有用
--fs 统计文件打开数和inodes数
除了前面介绍的与监控相关的参数以外,dstat还可以像vmstat和iostat一样使用参数控制报告的时间间隔,或者同事指定时间间隔与报告次数。
例如,下面的命令表示以默认的选项运行dstat,每2秒钟输出一条监控信息,并在输出10条监控信息以后退出dstat。如下所示:
[root@192 ~]# dstat 2 10
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
9 3 88 0 0 0| 218k 60k| 0 0 |2674B 5409B| 164 1550
20 6 74 0 0 0| 0 0 | 66B 594B| 0 0 | 326 3956
21 6 73 0 0 0| 0 147k| 66B 346B| 0 0 | 360 4114
20 5 76 0 0 0| 0 0 | 66B 346B| 0 0 | 320 4494
20 6 74 0 0 0| 0 0 | 96B 372B| 0 0 | 349 4144
20 5 75 0 0 0| 0 0 | 66B 342B| 0 0 | 331 4360
21 6 74 0 0 0| 0 0 | 66B 342B| 0 0 | 344 3607
19 6 75 0 0 0| 0 0 | 66B 342B| 0 0 | 334 4475
21 6 74 0 0 0| 0 0 | 66B 342B| 0 0 | 338 4580
20 7 73 0 0 1| 0 0 | 66B 342B| 0 0 | 340 4341
20 6 74 0 0 0| 0 0 | 66B 342B| 0 0 | 344 3899
[root@192 ~]#
(3)dstat高级用法
dstat的强大之处不仅仅是因为它聚合了多种工具的监控结果,还因为它能通过附带的插件实现一些更高级功能。如:找出磁盘中占用资源最高的进程和用户。
dstat -cdlmnpsyt 5 可以得到较全面的系统性能数据。
dstat的--top-(io|bio|cpu|cputime|cputime-avg|mem) 通过这几个选项,可以看到具体是哪个用户哪个进程占用了相关系统资源,对系统调优非常有效。如查看当前占用I/O、cpu、内存等最高的进程信息可以使用dstat --top-mem --top-io --top-cpu选项。以下示例演示了如何找出占用资源最多的进程。
[root@192 ~]# dstat --top-mem --top-io --top-cpu
--most-expensive- ----most-expensive---- -most-expensive-
memory process | i/o process | cpu process
gnome-shell 115M|polkitd 203k 10k|polkitd 3.8
gnome-shell 115M|polkitd 459k 23k|polkitd 10
gnome-shell 115M|polkitd 625k 31k|polkitd 9.0
gnome-shell 115M|polkitd 592k 29k|dbus-daemon 8.0
gnome-shell 115M|polkitd 606k 30k|polkitd 9.0
gnome-shell 115M|polkitd 525k 26k|polkitd 10
gnome-shell 115M|polkitd 525k 26k|dbus-daemon 8.0
dstat的插件保存在/usr/share/dstat目录下,我们可以参考它们的实现,编写自己的插件。
(4)将结果输出到CSV文件
dstat还可以将监控信息保存到CSV文件中,以便后续进行处理。通过--output选项指定监控数据输出的文件。如下所示:
[root@192 ~]# dstat -a --output dstat_output.csv
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
9 3 88 0 0 0| 217k 60k| 0 0 |2656B 5370B| 165 1568
19 8 50 22 0 0| 11M 50k| 66B 838B| 128k 0 | 428 3116
19 6 75 0 0 0| 0 0 | 66B 374B| 0 0 | 325 4514
25 7 25 43 0 0|5284k 0 | 66B 350B| 476k 0 | 448 4227
18 7 74 0 0 1| 32k 144k| 66B 366B| 52k 0 | 334 4524
31 11 6 52 0 0|1944k 4096B| 66B 374B| 868k 0 | 613 3846
19 6 69 6 0 0| 116k 4096B| 66B 374B| 116k 0 | 337 4367
20 6 74 0 0 0| 0 0 | 66B 374B| 0 0 | 331 4573
20 7 73 0 0 0| 0 0 | 66B 350B| 0 0 | 339 3787
18 6 76 0 0 0| 0 0 | 66B 350B| 0 0 | 317 4472
20 6 74 0 0 0| 0 0 | 66B 350B| 0 0 | 338 3675
20 5 75 0 0 0| 0 0 | 66B 350B| 0 0 | 324 4633
21 5 74 0 0 0| 0 0 | 66B 350B| 0 0 | 318 4597
19 6 75 0 0 0| 0 0 | 66B 350B| 0 0 | 333 4847
18 6 76 0 0 0| 0 0 | 66B 350B| 0 0 | 308 4742 ^C
[root@192 ~]# cat dstat_output.csv
"Dstat 0.7.2 CSV output"
"Author:","Dag Wieers <dag@wieers.com>",,,,"URL:","http://dag.wieers.com/home-made/dstat/"
"Host:","192.168.32.138",,,,"User:","root"
"Cmdline:","dstat -a --output dstat_output.csv",,,,"Date:","22 Feb 2020 00:22:08 CST"
"total cpu usage",,,,,,"dsk/total",,"net/total",,"paging",,"system",
"usr","sys","idl","wai","hiq","siq","read","writ","recv","send","in","out","int","csw"
8.683,2.816,88.156,0.313,0.0,0.032,222019.623,61103.678,0.0,0.0,2655.691,5370.227,164.807,1568.447
19.388,8.163,50.0,22.449,0.0,0.0,11702272.0,51200.0,66.0,838.0,131072.0,0.0,428.0,3116.0
19.192,6.061,74.747,0.0,0.0,0.0,0.0,0.0,66.0,374.0,0.0,0.0,325.0,4514.0
24.510,6.863,25.490,43.137,0.0,0.0,5410816.0,0.0,66.0,350.0,487424.0,0.0,448.0,4227.0
18.182,7.071,73.737,0.0,0.0,1.010,32768.0,147456.0,66.0,366.0,53248.0,0.0,334.0,4524.0
30.928,11.340,6.186,51.546,0.0,0.0,1990656.0,4096.0,66.0,374.0,888832.0,0.0,613.0,3846.0
19.192,6.061,68.687,6.061,0.0,0.0,118784.0,4096.0,66.0,374.0,118784.0,0.0,337.0,4367.0