dstat 默认仅显示基础指标,需手动指定插件(如--top-cpu、--disk-util、--net-err)才能获取各核CPU、磁盘延迟、网络错误等深度诊断字段。

为什么直接运行 dstat 常常看不到想要的指标组合
默认不带参数执行 dstat 会轮询显示 CPU、磁盘、网络、分页和系统中断,但实际中常发现:CPU 显示的是总使用率而非各核明细,磁盘 I/O 缺少读写延迟(await)或队列长度(avgqu-sz),网络只显示字节数不带错误包统计。这是因为 dstat 默认启用的是基础插件集,且部分指标需显式开启对应子模块。
实操建议:
- 用
dstat --list查看当前可用插件,确认系统是否安装了disk、net、cpu等核心模块(某些精简版系统可能缺失dstat-net或dstat-disk) - 避免只依赖默认输出——它不包含
iowait细分、rxerr/s、txerr/s等关键诊断字段 - 若提示
Module not found: net,说明python3-dstat包未完整安装,需补装:sudo apt install dstat(Debian/Ubuntu)或sudo yum install dstat(RHEL/CentOS)
如何一次性显示 CPU 各核使用率 + 磁盘 I/O 延迟 + 网络错误包
要同时抓取这三个维度的深度指标,必须手动指定插件并控制字段顺序。默认的 -c -d -n 只给基础值,而真正用于排查性能瓶颈的是细分项。
实操建议:
- 用
dstat -c --top-cpu -d --top-io -n --top-net --disk-util --net-err组合:其中--top-cpu显示各核 busy/idle,--disk-util补上设备利用率(%util),--net-err输出rxerr/s和txerr/s -
--disk-util依赖/proc/diskstats,若在容器中运行可能不可见——此时应宿主机执行,或改用cat /sys/block/*/stat手动计算 - 注意字段宽度冲突:当终端列数不足时,
dstat会自动折叠列。可加--noheaders减少干扰,或用watch -n1 'dstat -c -d -n --disk-util --net-err | head -20'固定高度刷新
如何导出 CSV 供后续分析且不丢时间戳
dstat --output 默认生成的 CSV 没有时间列,只有相对秒数(从启动开始计时),这导致多段日志无法对齐。直接重定向 stdout 也会因 ANSI 控制符污染数据。
实操建议:
- 用
dstat -c -d -n --disk-util --net-err --output report.csv 1 60:其中1是采样间隔(秒),60是总行数,生成的 CSV 第一列为 Unix 时间戳(精确到秒),后续为各指标值 - 若需毫秒级时间戳,
dstat本身不支持;可改用date +%s.%N配合vmstat/iostat脚本拼接,但会失去统一视图 - 导出时避免后台运行(如
&),否则--output可能写入不全——务必前台执行至完成,或用timeout 60s dstat ... --output report.csv控制时长
为什么 dstat 在高负载下自身 CPU 占用突增
当系统 I/O 密集或进程数极多时,dstat 的 --top-cpu 和 --top-io 会频繁调用 ps 和 /proc 遍历,造成额外开销。这不是 bug,而是设计取舍:实时 top 类信息必然带来可观测性成本。
实操建议:
- 排查阶段临时禁用 top 类插件:
dstat -c -d -n --disk-util --net-err(去掉--top-cpu等),CPU 开销通常下降 70% 以上 - 若必须看 top 进程,改用单独命令:
pidstat -ru 1(CPU)、iotop -b -o -d 1(I/O),再与dstat基础指标交叉比对 - 留意
dstat版本差异:0.7.4+ 对/proc读取做了缓存优化,旧版(如 0.7.2)在 1000+ 进程场景下容易卡顿
真正难的不是凑出一串参数,而是理解每个字段背后的内核机制——比如 await 来自 /proc/diskstats 的 io_ticks 字段除以 I/O 次数,而 %util 实际是设备忙时间占比,并非真实吞吐瓶颈指标。这些细节不查源码或内核文档,光靠 --help 很难吃透。











