linux-dstat-监控工具

最近发现一个监控工具,用python实现的,可以用于替代 vmstat, iostat, mpstat, netstat and ifstat

Github

  dstat 是一个可以取代vmstat,iostat,netstat和ifstat这些命令的多功能产品。dstat扬长避短,即克服了这些命令的局限又增加了一些额外的功能,不但拥有更多的监控项,也更灵活。dstat在性能测试、基准测试和排除故障过程中可以很方便监控系统运行状况。
  dstat可以查看所有的实时系统资源,如:通过统计IDE控制器当前状态来比较磁盘利用率,或者直接通过网络带宽数值来比较磁盘的吞吐率(在相同的时间间隔内)。
  dstat以列表的形式提供选项信息,并清晰地告知以何种幅度和单位显示输出。输出信息整洁,降低发生错误的概率。最重要的是,整洁的数据更容易编写插件用来收集分析关注的数据信息。
  dstat默认输出是专门为实时查看而设计的,然而也可以将详细信息通过cvs输出到一个文件,然后将cvs文件导入到Gnumeric或者Excel中生成图表。

特性

  • 结合了vmstat,iostat,ifstat,netstat以及更多的信息
  • 实时显示统计情况,输出报告
  • 在分析和排障时可以通过启用监控项并排序
  • 模块化设计
  • 使用python编写的,方便扩展现有的工作任务
  • 容易扩展和添加你的计数器
  • 包含的许多扩展插件——增加新的监控项目很方便
  • 可以分组统计块设备/网络设备,并给出总数
  • 可以显示每台设备的当前状态
  • 极准确的时间精度,即便是系统负荷较高也不会延迟显示
  • 显示准确地单位和和限制转换误差范围
  • 不同的计量单位用不同的颜色显示
  • 显示中间结果延时小于1秒
  • 支持输出CSV格式报表,并能导入到Gnumeric和Excel以生成图形

安装

1
yum install dstat

使用

1
2
3
4
5
6
7
8
9
10
11
# dstat
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
2 1 97 0 0 0|1598B 109k| 0 0 | 0 0 |1115 1640
1 1 99 0 0 0| 0 5120B|1754B 2133B| 0 0 | 612 919
8 3 89 0 0 0| 0 0 |2743B 9319B| 0 0 |2955 3404
2 1 96 0 0 0| 0 212k|1967B 3292B| 0 0 |1353 2093
2 1 96 0 0 0| 0 5120B|4045B 5005B| 0 0 |1346 2034
执行 dstat 命令的时候,默认他会 收集-cpu-、-disk-、-net-、-paging-、-system-的数据,一秒钟收集一次。
默认输入 dstat 等于输入了dstat -cdngy 1或dstat -a 1

CPU状态:CPU的使用率。这项报告更有趣的部分是显示了用户,系统和空闲部分,这更好地分析了CPU当前的使用状况。如果你看到”wait”一栏中,CPU的状态是一个高使用率值,那说明系统存在一些其它问题。当CPU的状态处在”waits”时,那是因为它正在等待I/O设备(例如内存,磁盘或者网络)的响应而且还没有收到。

磁盘统计:磁盘的读写操作,这一栏显示磁盘的读、写总数。

网络统计:网络设备发送和接受的数据,这一栏显示的网络收、发数据总数。

分页统计:系统的分页活动。分页指的是一种内存管理技术用于查找系统场景,一个较大的分页表明系统正在使用大量的交换空间,或者说内存非常分散,大多数情况下你都希望看到page in(换入)和page out(换出)的值是0 0。

系统统计:这一项显示的是中断(int)和上下文切换(csw)。这项统计仅在有比较基线时才有意义。这一栏中较高的统计值通常表示大量的进程造成拥塞,需要对CPU进行关注。你的服务器一般情况下都会运行运行一些程序,所以这项总是显示一些数值。

默认情况下,dstat每秒都会刷新数据。如果想退出dstat,你可以按”CTRL-C”键。

需要注意的是报告的第一行,通常这里所有的统计都不显示数值的。

这是由于dstat会通过上一次的报告来给出一个总结,所以第一次运行时是没有平均值和总值的相关数据。

1
2
3
4
5
6
7
8
查看磁盘状态
# dstat -td -D /dev/vdb1
----system---- --dsk/vdb1-
time | read writ
04-04 14:57:42| 23B 2156B
04-04 14:57:43| 0 0
04-04 14:57:44| 0 0
04-04 14:57:45| 0 0
1
2
3
4
5
6
7
8
9
10
查看内存使用情况
# dstat -glms --top-mem
---paging-- ---load-avg--- ------memory-usage----- ----swap--- --most-expensive-
in out | 1m 5m 15m | used buff cach free| used free| memory process
0 0 |0.14 0.15 0.14|1028M 3208k 1800M 28.5G| 0 0 |mysqld 230M
0 0 |0.14 0.15 0.14|1038M 3208k 1800M 28.5G| 0 0 |mysqld 230M
0 0 |0.14 0.15 0.14|1029M 3208k 1800M 28.5G| 0 0 |mysqld 230M
0 0 |0.14 0.15 0.14|1027M 3208k 1800M 28.5G| 0 0 |mysqld 230M
0 0 |0.13 0.15 0.14|1027M 3208k 1800M 28.5G| 0 0 |mysqld 230M
0 0 |0.13 0.15 0.14|1027M 3208k 1800M 28.5G| 0 0 |mysqld 230M
1
2
3
4
5
6
7
8
9
10
11
12
13
查看cpu使用情况
# dstat -cyl --proc-count --top-cpu
----total-cpu-usage---- ---system-- ---load-avg--- proc -most-expensive-
usr sys idl wai hiq siq| int csw | 1m 5m 15m |tota| cpu process
2 1 97 0 0 0|1115 1640 |0.08 0.14 0.13| 191|agent 0.0
0 0 100 0 0 0| 215 354 |0.08 0.14 0.13| 191|
0 0 100 0 0 0| 195 346 |0.07 0.14 0.13| 191|ceph-osd 0.1
0 0 100 0 0 0| 247 416 |0.07 0.14 0.13| 191|
0 0 100 0 0 0| 201 345 |0.07 0.14 0.13| 191|ceph-mon 0.1
2 2 96 0 0 0|1627 2337 |0.07 0.14 0.13| 191|agent 0.2
2 1 96 0 0 0|1643 2570 |0.07 0.14 0.13| 191|td-guard 0.1
2 1 96 0 0 0|1329 2103 |0.07 0.14 0.13| 197|rcu_sched 0.1
2 1 96 0 0 0|1254 1890 |0.07 0.14 0.13| 191|salt-minion 0.1
1
2
输出一个csv文件
# dstat --output ~/test.csv

命令格式

1
dstat [-afv] [options..] [delay [count]]

命令选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Options Details
-c, - -cpu 开启cpu统计
-C 该选项跟cpu的编号(0~cpu核数-1,多个用都好隔开)如:0,3,total表示分别包含cpu0、cpu3和total
-d, - -disk 开启disk统计
-D 改选跟具体的设备名(多个用逗号隔开)如:total,hda,hdb表示分别统计total、hda、hdb设备块
-g, - -page 开启分页统计
-i, - -int 开启中断统计
-I 5,10
-l, - -load 开启负载均衡统计,分别是1m,5m,15m
-m, - -mem 开启内存统计,包括used,buffers,cache,free
-n, - -net 开启net统计,包括接受和发送
-N 该选项可以跟网络设备名多个用逗号隔开,如eth1,total
-p, - -proc 开启进程统计,包括runnable, uninterruptible, new
-r, - -io io开启请求统计,包括read requests, write requests
-s, - -swap 开启swap统计,包括used, free
-S 该选项可以跟具体的交换区,多个用逗号隔开如swap1,total
-t, - -time 启用时间和日期输出
-T, - -epoch 启用时间计数,从epoch到现在的秒数
-y, - -sys 开启系统统计,包括中断和上下文切换
- -aio 开启同步IO统计 (asynchronous I/O)
- - -fs 开启文件系统统计,包括 (open files, inodes)
- - -ipc 开启ipc统计,包括 (message queue, semaphores, shared memory)
- - -lock 开启文件所统计,包括 (posix, flock, read, write)
- - -raw 开启raw统计 (raw sockets)
- - -socket 开启sockets统计,包括 (total, tcp, udp, raw, ip-fragments)
- - -tcp 开启tcp统计,包括(listen, established, syn, time_wait, close)
- - -udp 开启udp统计 (listen, active)
- - -unix 开启unix统计(datagram, stream, listen, active)
- - -vm 开启vm统计 (hard pagefaults, soft pagefaults, allocated, free)
- - -stat 通过插件名称开启插件扩展,详见命令插件 :可能的内置插件为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
- - -list 列举内置插件扩展的名称
- -a, - -all 是默认值相当于 -cdngy (default)
- -f, - -full 相当于 -C, -D, -I, -N and -S
- -v, - -vmstat 相当于 -pmgdsc -D total
- - -bw, - -blackonwhite 在白色背景终端上改变显示颜色
- - -float 在屏幕上的输出强制显示为浮点值(即带小数)(相反的选项设置为 - -integer)
- - -integer 在屏幕上的输出强制显示为整数值,此为默认值(相反的选项设置为- -float)
- - -nocolor 禁用颜色(意味着选项 - -noupdate)
- - -noheaders 禁止重复输出header,默认会打印一屏幕输出一次header
- - -noupdate 当delay>1时禁止在过程中更新(即在时间间隔内不允许更新)
- - -output file 输出结果到cvs文件中

命令参数

1
2
3
参数名称 参数描述
delay 两次输出之间的时间间隔,默认是1s
count 报告输出的次数,默认是没有限制,一直输出知道ctrl+c

命令插件

虽然anyone可以自由的为dstat编写插件,但dstat附带大量的插件已经大大扩展其功能,下面是dstat附带插件的一个概述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
插件名称 插件描述
- -battery 电池电池百分比(需要ACPI)
- - -battery-remain 电池剩余小时、分钟(需要ACPI)
- - -cpufreq CPU频率百分比(需要ACPI)
- - -dbus dbus连接的数量(需要python-dbus)
- - -disk-util 显示某一时间磁盘的忙碌状况
- - -fan 风扇转速(需要ACPI)
- - -freespace 每个文件系统的磁盘使用情况
- - -gpfs gpfs读/写 I / O(需要mmpmon)
- - -gpfs-ops GPFS文件系统操作(需要mmpmon)
- - -helloworld dstat插件Hello world示例
- - -innodb-buffer 显示innodb缓冲区统计
- - -innodb-io 显示innodb I / O统计数据
- - -innodb-ops 显示innodb操作计数器
- - -lustre 显示lustreI / O吞吐量
- - -memcache-hits 显示memcache 的命中和未命中的数量
- - -mysql5-cmds 显示MySQL5命令统计
- - -mysql5-conn 显示MySQL5连接统计
- - -mysql5-io MySQL5 I / O统计数据
- - -mysql5-keys 显示MySQL5关键字统计
- - -mysql-io 显示MySQL I / O统计数据
- - -mysql-keys 显示MySQL关键字统计
- - -net-packets 显示接收和发送的数据包的数量
- - -nfs3 显示NFS v3客户端操作
- - -nfs3-ops 显示扩展NFS v3客户端操作
- - -nfsd3 显示NFS v3服务器操作
- - -nfsd3-ops 显示扩展NFS v3服务器操作
- - -ntp 显示NTP服务器的ntp时间
- - -postfix 显示后缀队列大小(需要后缀)
- - -power 显示电源使用量
- - -proc-count 显示处理器的总数
- - -rpc 显示rpc客户端调用统计
- - -rpcd 显示RPC服务器调用统计
- - -sendmail 显示sendmail队列大小(需要sendmail)
- - -snooze 显示每秒运算次数
- - -test 显示插件输出
- - -thermal 热系统的温度传感器
- - -top-bio 显示消耗块I/O最大的进程
- - -top-cpu 显示消耗CPU最大的进程
- - -top-cputime 显示使用CPU时间最大的进程(单位ms)
- - -top-cputime-avg 显示使用CPU时间平均最大的进程(单位ms)
- - -top-io 显示消耗I/O最大进程
- - -top-latency 显示总延迟最大的进程(单位ms)
- - -top-latency-avg 显示平均延时最大的进程(单位ms)
- - -top-mem 显示使用内存最大的进程
- - -top-oom 显示第一个被OOM结束的进程
- - -utmp 显示utmp连接的数量(需要python-utmp)
- - -vmk-hba 显示VMware ESX内核vmhba统计数
- - -vmk-int 显示VMware ESX内核中断数据
- - -vmk-nic 显示VMware ESX内核端口统计
- - -vz-io 显示每个OpenVZ请求CPU使用率
- - -vz-ubc 显示OpenVZ用户统计
- - -wifi 无线连接质量和信号噪声比

常用插件

1
2
3
4
5
6
7
8
插件名称 插件描述
- - -disk-util 显示某一时间磁盘的忙碌状况
- - -freespace 显示当前磁盘空间使用率
- - -proc-count 显示正在运行的程序数量
- - -top-bio 显示块I/O最大的进程
- - -top-cpu 显示CPU占用最大的进程
- - -top-io 显示正常I/O最大的进程
- - -top-mem 显示占用最多内存的进程

常见问题

  1. cpu分组中”wait”,如果一直处于高使用率,那说明系统存在一些其它问题。当CPU的状态处在”waits”时,那是因为它正在等待I/O设备(例如内存,磁盘或者网络)的响应而且还没有收到。
  2. CPU的使用情况是否正常:用户态和内核态的使用是否合理;总体占比是否合理;若不合理可以用dstat对应的插件(- -top-cpu)排查最耗CPU的进程,配合mpstat、top再去下钻一下分析线程,进一步到程序(比如java可以jstack)。
  3. 磁盘IO读写是否正常:读写是否偏大;若不正常可以配合插件- -disk-util、- -freespace、- -top-bio、- -top-io等进行排查,也可以配合iostat排查
  4. 内存是否正常:一般要配合交换区内存一起判断,若不正常可以配合插件- -top-mem,可能是开启的进程太多,或者第三方程序捣乱。
  5. 应用程序内存是否正常:配合业务表现比如请求响应慢、没反应等,在结合第三方程序监控(如java可以用jvm监控工具(jprofiler、jconsole、jvisualvm……)监控内存)此种情况和3还不太一样,一个jvm内存一个sys内存
  6. 分页指的是一种内存管理技术用于查找系统场景,一个较大的分页表明系统正在使用大量的交换空间,或者说内存非常分散,大多数情况下你都希望看到page in(换入)和page out(换出)的值都是0。
  7. 系统统计仅在有比较基线时才有意义。中断和上下文切换较高的统计值通常表示大量的进程造成拥塞,需要对CPU进行关注。服务器一般情况下都会运行运行一些程序,所以这项总是显示一些数值。
  8. 使用不同的插件可以快速排查有问题的进程然后配合其他工具下钻具体问题,当然这个需要建立在你对所有的插件都比较熟悉的基础之上,知道什么情况下使用什么插件。技巧:可以将常用的命令写成脚本,执行分析,这样就不用每次都敲了。

转自: Dstat使用