本实验基于天翼云服务器,部分信息可能与物理环境不一致
工具定位
dstat 把 CPU/内存/磁盘/网络等多类指标聚合在一屏,适合企业现场快速做全局趋势观察与对齐时间线。
企业级排障地图(系统资源/硬件)
先做基线,再做归因,最后做证据链:
- • 基线:负载/CPU/内存/IO/网络五大件是否异常
- • 归因:是进程问题、内核问题,还是硬件/虚拟化资源约束
- • 证据:把关键指标、命令输出、时间窗固化到事故记录
推荐最短闭环:
- 1. top/htop 定位 Top 进程与资源方向
- 2. vmstat/mpstat/pidstat/iostat 找到瓶颈维度
- 3. lsof/ss 确认 FD/连接等资源是否膨胀
- 4. perf(必要时)做 CPU 火焰图/采样证据
以下是 dstat 企业级完全教程,涵盖从基础监控到生产环境性能分析的完整体系。
第一章:基础概念与定位
1.1 dstat 是什么
dstat (Dynamic System Tool) 是 vmstat/iostat/netstat/ifstat 的现代化替代品,由 Python 编写,特点:
- • 全屏替代:一个命令查看所有资源(CPU/磁盘/网络/内存/进程)
- • 模块化设计:40+ 插件支持(MySQL、Redis、NFS、GPFS 等)
- • CSV 导出:原生支持数据导出用于后续分析(Gragana、Excel)
1.2 与传统工具对比
| | |
vmstat | | |
iostat | | |
netstat | | |
sar | | |
htop | | |
第二章:安装与基础语法
2.1 安装方法
# RHEL/CentOS/Fedora
sudo yum install dstat
# 或 dnf
sudo dnf install dstat
# Debian/Ubuntu
sudo apt-get install dstat
# Arch Linux
sudo pacman -S dstat
# macOS (Homebrew)
brew install dstat # 注:macOS 部分功能受限
# 源码安装(获取最新插件)
git clone https://github.com/dagwieers/dstat.git
cd dstat && sudocp dstat /usr/local/bin/
2.2 基本语法结构
dstat [options] [delay] [count]
示例:
# 每秒刷新,共 10 次
[root@myhost ~]# dstat 1 10
You did not select any stats, using -cdngy by default.
----total-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read writ| recv send| in out | int csw
0 0 99 0 0| 0 0 | 871B 2420B| 0 0 | 183 207
...
# 每 5 秒刷新,无限运行
[root@myhost ~]# dstat 5
You did not select any stats, using -cdngy by default.
----total-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read writ| recv send| in out | int csw
0 0 100 0 0| 0 4096B| 133B 408B| 0 0 | 103 144
0 0 100 0 0| 0 6554B| 191B 415B| 0 0 | 96 149
0 0 100 0 0| 0 2048B| 196B 383B| 0 0 | 130 168 ^C
第三章:核心参数详解与实战
3.1 基础监控维度(单字母参数)
-c, --cpu(CPU 统计)
[root@myhost ~]# dstat -c 1 5
----total-usage----
usr sys idl wai stl
0 0 100 0 0
0 0 100 0 0
0 0 99 0 0
1 0 100 0 0
0 0 100 0 0
输出列解释:
- •
sys:内核空间 CPU 占比(系统调用、驱动) - •
wai:关键指标 - I/O 等待百分比(磁盘瓶颈信号)
企业场景:wai > 10% 持续 1 分钟 → 磁盘性能告警
-d, --disk(磁盘吞吐)
[root@myhost ~]# dstat -d 2
-dsk/total-
read writ
0 0
0 0
0 0
0 0
0 0
0 0
0 2048B
0 0
0 0
0 16k^C
输出列:
结合 -D 指定设备:
# 仅监控 vda
[root@myhost ~]# fdisk -l
Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc4f7316d
Device Boot Start End Sectors Size Id Type
/dev/vda1 * 2048 2099199 2097152 1G 83 Linux
/dev/vda2 2099200 83886079 81786880 39G 83 Linux
[root@myhost ~]# dstat -d -D vda 1
--dsk/vda--
read writ
0 4092B
0 16k
0 0
0 0
0 0
0 0
0 0
0 4096B^C
-n, --net(网络吞吐)
[root@myhost ~]# dstat -n 1
-net/total-
recv send
120B 218B
278B 1408B
2622B 2602B
330B 2450B
674B 614B
944B 811B
337B 461B
1895B 1672B^C
输出列:
指定网卡:
# 仅监控 eth0
[root@myhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether fa:16:3e:90:e9:04 brd ff:ff:ff:ff:ff:ff
altname enp0s3
altname ens3
inet 192.168.1.28/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0
valid_lft 311014704sec preferred_lft 311014704sec
inet6 fe80::f816:3eff:fe90:e904/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 3a:86:b4:49:c9:6b brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
[root@myhost ~]# dstat -n -N eth0 1
--net/eth0-
recv send
574B 610B
60B 138B
142B 228B
150B 200B
60B 146B
537B 672B
1691B 3661B^C
-m, --mem(内存使用)
[root@myhost ~]# dstat -m
------memory-usage-----
used free buf cach
1165M 7864M 611M 5818M
1165M 7864M 611M 5818M
1159M 7870M 611M 5818M
1165M 7864M 611M 5818M
1161M 7869M 611M 5818M
1161M 7869M 611M 5818M^C
输出列:
- •
avail:可用内存(Linux 3.14+,不含缓存)
-s, --swap(交换分区)
[root@myhost ~]# dstat -s
---total---
used free
关键指标:used > 0 且持续增长 → 内存不足告警
-y, --sys(系统级事件)
[root@myhost ~]# dstat -y
---system--
int csw
168 199
130 174
75 127
129 184
128 157
133 160 ^C
包含:
- •
int:中断数/秒(context switches)
性能分析:高 csw(>100k)+ 高 sys CPU → 进程调度过载
3.2 高级插件系统(双横线参数)
dstat 的强大之处在于 40+ 内置插件:
磁盘利用率(--disk-util)
[root@myhost ~]# dstat --disk-util
vda-
util
0
0
0
0
0
0^C
显示 %util(设备繁忙百分比),类似 iostat -x 的 %util。
TCP/UDP 统计(--tcp, --udp)
[root@myhost ~]# dstat --tcp
------tcp-sockets-------
lis act syn tim clo
3 5 0 4 1
3 5 0 4 1
3 5 0 4 1
3 5 0 4 1
3 5 0 4 1 ^C
监控:
Socket 统计(--socket)
[root@myhost ~]# dstat --socket
--------sockets---------
tot tcp udp raw frg
167 10 2 0 0
166 10 2 0 0
166 10 2 0 0
166 10 2 0 0
166 10 2 0 0
166 10 2 0 0
166 10 2 0 0
166 10 2 0 0 ^C
显示:
进程 Top 监控(资源消耗大户)
# CPU 占用最高的进程
[root@myhost ~]# dstat --top-cpu 1
-most-expensive-
cpu process
python3 1.0^C
# 内存占用最高的进程
[root@myhost ~]# dstat --top-mem 1
--most-expensive--
memory process
node 501
node 501
node 501^C
# I/O 读写最高的进程(需 root)
[root@myhost ~]# sudo dstat --top-io 1
-----most-expensive-----
I/O process
python3 44902 136.9
sshd 84884 14430
postgres 186.4 0
python3 45284 61.96
sshd 164.7 26328^C
# 延迟最高的进程(可运行但等待 CPU)
[root@myhost ~]# dstat --top-latency 1
--highest-total--
latency process
lsmd 0.00
kworker/0:0- 0.00
sshd
kworker/1:0- 0.00
kworker/1:0- 0.00
node 0.00^C
MySQL 监控(需权限)
dstat --mysql5-cmds # 每秒命令数(SELECT/INSERT/UPDATE)
dstat --mysql5-conn # 连接数
第四章:组合监控与生产实战
4.1 全能监控面板(经典组合)
[root@myhost ~]# sudo dstat -cdngy --disk-util --tcp 1
----total-usage---- -dsk/total- -net/total- ---paging-- ---system-- vda- ------tcp-sockets-------
usr sys idl wai stl| read writ| recv send| in out | int csw |util|lis act syn tim clo
| | | | | | 3 7 1 5 1
0 0 99 0 0| 0 0 | 60B 1153B| 0 0 | 93 140 | 0| 3 7 1 5 1
0 0 100 0 0| 0 40k| 60B 410B| 0 0 | 95 148 |0.10| 3 7 1 5 1
0 0 99 0 0| 0 0 | 60B 418B| 0 0 | 84 139 | 0| 3 7 1 4 1
0 0 100 0 0| 0 0 | 60B 410B| 0 0 | 87 147 | 0| 3 7 1 4 1
0 0 100 0 0| 0 0 | 60B 410B| 0 0 | 82 139 | 0| 3 7 1 4 1
解释:
4.2 数据库压测场景(OLTP 基准)
# 监控 MySQL 压测时的资源
sudo dstat -c --top-cpu -d --disk-util -n --mysql5-cmds --mysql5-io 1
观察要点:
- 1.
wai 上升 + disk-util 接近 100% → 磁盘 I/O 瓶颈 - 2.
mysql 的 sel(select)突增 → 缓存失效或慢查询 - 3.
recv 网络降为零但 send 高 → 应用层阻塞
4.3 网络带宽峰值检测
# 精确到网卡 + 总带宽统计 + TCP 状态
[root@myhost ~]# dstat -n -N eth0,total --tcp 1
--net/eth0---net/total- ------tcp-sockets-------
recv send: recv send|lis act syn tim clo
: | 3 9 1 5 1
120B 633B: 120B 633B| 3 9 1 5 1
120B 400B: 120B 400B| 3 8 1 5 1
585B 1789B: 585B 1789B| 3 8 1 5 2
1926B 1484B:1926B 1484B| 3 8 1 5 2 ^C
企业案例:网络传输异常排查
# 监控 60 秒,导出 CSV 用于 Wireshark 时间对齐
[root@myhost ~]# dstat -n --tcp --output network_stats.csv 1 60
-net/total- ------tcp-sockets-------
recv send|lis act syn tim clo
| 3 9 1 4 1
120B 529B| 3 9 1 4 1
60B 242B| 3 9 1 4 1
367B 479B| 3 8 1 4 2
60B 242B| 3 8 1 4 2
626B 697B| 3 9 1 5 1
60B 242B| 3 9 1 5 1
60B 242B| 3 9 1 5 1 ^C
4.4 内存泄漏排查方案
[root@myhost ~]# dstat -m --top-mem -s --vm 1
------memory-usage----- --most-expensive-- ---total--- -----virtual-memory----
used free buf cach| memory process | used free|majpf minpf alloc free
1161M 7868M 611M 5818M|node 501| |
1160M 7869M 611M 5818M|node 501| | 0 85 96 647
1159M 7870M 611M 5818M|node 501| | 0 47 52 324
1159M 7870M 611M 5818M|node 501| | 0 14 15 0
1159M 7870M 611M 5818M|node 501| | 0 5 5 0
1159M 7870M 611M 5818M|node 501| | 0 9 9 0 ^C
关键指标组合:
- •
--top-mem 显示特定进程 RSS 持续增长
第五章:输出处理与自动化
5.1 CSV 导出与可视化
# 后台静默记录(适合 7x24 监控)
nohup dstat -cdngy --output /var/log/dstat_$(date +%Y%m%d).csv 5 > /dev/null 2>&1 &
# 实时查看文件增长
tail -f /var/log/dstat_20240127.csv
Excel/Python 分析:
import pandas as pd
df = pd.read_csv('dstat_output.csv', skiprows=5) # 跳过头信息
df.plot(x='time', y=['usr', 'sys', 'wai'], figsize=(12,6))
5.2 告警脚本集成
#!/bin/bash
# io_alert.sh - I/O 等待告警
dstat -c 1 3 | tail -1 | awk '{if ($4 > 20) print "ALERT: CPU I/O Wait " $4 "%"}' | whileread msg; do
echo"$(date): $msg" >> /var/log/io_alert.log
# 发送企业微信/钉钉
curl -s "https://oapi.dingtalk.com/robot/send?access_token=xxx" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$msg\"}}"
done
5.3 与 systemd 集成(持续监控)
# /etc/systemd/system/dstat-monitor.service
[Unit]
Description=System Resource Monitor
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/dstat -cdngy --output /var/lib/dstat/system.csv 5
Restart=always
StandardOutput=null
[Install]
WantedBy=multi-user.target
第六章:企业级最佳实践
6.1 性能基准建立
# 业务低峰期基线(保存 24 小时)
dstat -cdngy --disk-util --tcp --output baseline.csv 60 1440
# 业务高峰期对比
dstat -cdngy --disk-util --tcp --output peak.csv 10 360
6.2 容器环境注意事项
在 Docker/K8s 中运行时:
- • 限制:
dstat 读取的是宿主机 /proc,容器内可能看到宿主机全部资源 - • 解决:使用
cgroups-aware 版本或结合 docker stats
6.3 替代方案对比决策
| | |
| htop | |
| sar | |
| pidstat -d | |
| dstat | 高 |
| cAdvisor | |
6.4 参数速查表
| |
| dstat -cdngy 5 |
| sudo dstat -c -d --disk-util --top-io --top-cpu 1 |
| dstat -n --tcp --socket 1 |
| dstat -m --vm --top-mem 1 |
| dstat -d --disk-util --disk-tps 1 |
附录:常见问题排查
Q: dstat 显示的单位不统一(B/k/M 跳变)
解决:使用 --bits 强制位显示,或 -m(兆字节模式)固定单位
Q: --top-io 无输出
原因:需要 root 权限读取 /proc/*/io
解决:sudo dstat --top-io
Q: 如何监控特定进程?
dstat 本身不支持 PID 过滤,需配合 pidstat 或 iotop -p <PID>
Q: 输出列对齐错乱
解决:使用 --nocolor 配合管道给 column -t,或减少插件数量
总结:dstat 是 Linux 系统诊断的瑞士军刀,特别适合快速定位性能瓶颈和建立资源基线。在现代可观测性体系中,建议将 dstat 作为轻量级现场诊断工具使用,而将长期监控交给 Prometheus/Grafana 体系。