怎么在Linux利用Shell脚本配合Iostat监控部署期间的磁盘负载波动并生成报告

陌杰君_7207

陌杰君_7207

2026-05-21

446人浏览

原创

答案是:用Shell脚本控制iostat采样节奏、过滤设备、聚合关键指标并检测波动,生成可读报告。脚本支持自定义设备与持续时间,输出%util、IOPS、吞吐量、await等统计及波动事件,无需额外依赖,适用于部署监控场景。

怎么在linux利用shell脚本配合iostat监控部署期间的磁盘负载波动并生成报告

在部署期间实时监控磁盘 I/O 负载,关键不是“一直跑 iostat”,而是用 Shell 脚本控制采样节奏、聚合数据、识别波动特征,并输出可读报告。下面是一套轻量、可靠、无需额外依赖的实现方式。

一、明确监控目标和采样策略

iostat 默认输出是瞬时快照,直接重定向会混杂设备名、标题行和多轮数据,不利于分析。需做到:

  • 固定采样间隔(如每 2 秒一次),持续采集 5–10 分钟(覆盖典型部署窗口)
  • 只抓关键指标:%util(设备忙时百分比)、r/s + w/s(IOPS)、rkB/s + wkB/s(吞吐量)、await(平均等待毫秒)
  • 过滤掉 loop、zram 等非物理设备,聚焦 sda/nvme0n1 等主磁盘
  • 自动记录部署开始/结束时间戳,便于对齐操作日志

二、编写核心监控脚本(含波动检测)

保存为 disk-monitor.sh,赋予执行权限:chmod +x disk-monitor.sh

#!/bin/bash
DEVICE="${1:-sda}"      # 可传入设备名,如 nvme0n1;默认 sda
DURATION=${2:-300}     # 总监控时长(秒),默认 5 分钟
INTERVAL=2             # 每次采样间隔(秒)
LOGFILE="iostat_$(date +%s).log"
REPORT="report_$(date +%s).txt"
<p>echo "▶ 开始监控 $DEVICE,持续 $DURATION 秒($INTERVAL 秒/次)..." | tee "$REPORT"
echo "部署开始时间: $(date)" | tee -a "$REPORT"
echo "日志文件: $LOGFILE" | tee -a "$REPORT"</p><h1>仅输出 CSV 格式数据(无标题、无空行),便于后续处理</h1><p>iostat -dx $INTERVAL $((DURATION/INTERVAL)) | \
awk -v dev="$DEVICE" '
$1 == dev { 
printf "%s,%s,%s,%s,%s,%s\n", 
strftime("%H:%M:%S"), $2, $3, $4, $10, $14 
}
' > "$LOGFILE"</p><p>echo -e "\n▶ 数据采集完成,生成分析报告..." | tee -a "$REPORT"</p><h1>计算基础统计(最大 %util、平均 await、IOPS 峰值等)</h1><p>if [ -s "$LOGFILE" ]; then
UTIL_MAX=$(awk -F, '{print $6}' "$LOGFILE" | sort -nr | head -1 | cut -d. -f1)
AWAIT_AVG=$(awk -F, '{sum+=$5; cnt++} END {printf "%.1f", sum/cnt}' "$LOGFILE")
IOPS_PEAK=$(awk -F, '{$3+$4 > max {max = $3+$4}} END {print int(max)}' "$LOGFILE")</p><p>echo -e "\n? 关键指标摘要:" | tee -a "$REPORT"
echo "   • 最高磁盘利用率: ${UTIL_MAX:-0}%(临界阈值建议 ≤85%)" | tee -a "$REPORT"
echo "   • 平均 I/O 等待时间: ${AWAIT_AVG:-0} ms(>15ms 表示存在延迟压力)" | tee -a "$REPORT"
echo "   • 峰值 IOPS: ${IOPS_PEAK:-0} ops/s" | tee -a "$REPORT"</p><h1>检测明显波动:连续 3 次 %util > 70%,且比前 3 次均值高 2 倍 → 视为“部署写入爆发”</h1><p>FLUCTUATION=$(awk -F, -v thresh=70 '
{ util[NR] = $6; time[NR] = $1 }
NR > 3 {
prev_avg = (util[NR-3]+util[NR-2]+util[NR-1])/3
if (util[NR] > thresh && util[NR] > prev_avg*2) {
print "⚠ 在 " time[NR] " 发现 I/O 波动:util=" util[NR] "%(前3次均值=" prev_avg ")"; exit
}
}
' "$LOGFILE")</p><p>if [ -n "$FLUCTUATION" ]; then
echo -e "\n? 波动事件:" | tee -a "$REPORT"
echo "   $FLUCTUATION" | tee -a "$REPORT"
else
echo -e "\n✅ 未检测到显著 I/O 波动(基于连续阈值触发规则)" | tee -a "$REPORT"
fi</p><p>echo -e "\n? 原始采样数据(时间, r/s, w/s, rkB/s, await, %util):" | tee -a "$REPORT"
head -5 "$LOGFILE" | sed 's/,/ /g' | awk '{printf "   %s %s %s %s %s %s\n", $1,$2,$3,$4,$5,$6}' | tee -a "$REPORT"
echo "   ...(共 $(wc -l </p><p>echo -e "\n✅ 报告生成完毕:$REPORT" | tee -a "$REPORT"
</p>

三、部署时一键调用并关联上下文

不要脱离部署流程单独运行。推荐在部署脚本中嵌入:

Linux Security Scanner
Linux Security Scanner

Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...

下载
  • 部署前启动监控(后台运行,记录 PID)
  • 部署命令执行后,自动 kill 监控进程并生成报告
  • 把报告路径写入部署日志,方便回溯

示例片段:

# 部署脚本 deploy.sh 中加入
./disk-monitor.sh nvme0n1 600 &  # 监控 10 分钟,后台运行
MONITOR_PID=$!
<h1>执行实际部署(如 docker-compose up、ansible-playbook 等)</h1><p>ansible-playbook deploy.yml</p><p>kill $MONITOR_PID 2>/dev/null
wait $MONITOR_PID 2>/dev/null</p><p>echo "? 部署完成,I/O 报告已生成,详见上一条输出" >> deploy.log
</p>

四、进阶建议(按需启用)

不强求一步到位,但可逐步增强:

  • 绘图辅助:用 gnuplot 或 Python(pandas+matplotlib)读取 CSV 画 %util 时间曲线,一眼识别毛刺
  • 阈值告警:若 %util 连续 5 次 >90%,发送邮件或写入 syslog(logger -t disk-alert "High util on $DEVICE")
  • 多设备对比:修改脚本支持传入多个设备(./disk-monitor.sh sda nvme0n1),分别统计并横向对比
  • 与 top/ps 关联:在波动时刻用 pidstat -d 1 3 快速定位高 I/O 进程

这套方法不依赖数据库或 Web 界面,纯 Shell + iostat,适合 CI/CD 环境、离线服务器或资源受限节点。重点在于用结构化采样替代人工观察,用简单规则替代复杂模型——真正解决“部署时磁盘是不是扛住了”这个具体问题。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux shell脚本

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4430

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3713

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

3013

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

7450

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

7082

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

4033

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

3525

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3759

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习