从零开始的自动化监控指南
目录导读
- 为什么需要脚本获取磁盘性能?
- 准备工作:核心命令与工具清单
- 实战脚本一:I/O吞吐与延迟检测(Shell+dd)
- 实战脚本二:磁盘健康状态自动化预警(smartctl+iostat)
- 实战脚本三:Web服务级性能报告生成(Python+psutil)
- 常见问题问答(QA)
- 总结与延伸建议
为什么需要脚本获取磁盘性能?
在运维或开发工作中,手动执行 df -h、iostat -x 1 等命令只能获得瞬时快照,当需要连续监控、自动报警、多机横向对比时,脚本才是真正的高效手段。
用脚本获取磁盘性能可以:

- 自动化采集:定时记录吞吐量、IOPS、响应时间等关键指标。
- 异常预警:当磁盘延迟超过阈值(如平均服务时间 > 50ms)时自动发送邮件或告警。
- 历史趋势分析:将数据写入CSV/数据库,生成可视化图表。
准备工作:核心命令与工具清单
在编写脚本前,需确保操作系统已安装以下工具(主要针对Linux/Unix环境,Windows可用PowerShell替代):
| 命令/工具 | 核心用途 | 安装检查(CentOS/Ubuntu) |
|---|---|---|
iostat |
实时设备I/O统计 | yum install sysstat / apt install sysstat |
smartctl |
磁盘健康检测(S.M.A.R.T) | yum install smartmontools / apt install smartmontools |
dd |
简单读写速度测试 | 系统内置 |
fio |
高级I/O基准测试(可选) | yum install fio 或编译安装 |
psutil |
Python库,跨平台性能采集 | pip install psutil |
特别注意:生产环境中使用 dd 或 fio 进行破坏性测试时,必须指定正确的设备路径(如 /dev/sda),且确保无重要数据被覆盖。
实战脚本一:I/O吞吐与延迟检测(Shell+dd)
此脚本适用于快速验证磁盘读写性能,尤其是云主机初始化后的基准测试。
#!/bin/bash # 文件名:disk_iobench.sh # 用途:测试指定磁盘的读写速度与IOPS(建议在空闲磁盘分区执行) DISK_PATH="/data/test_file" # 替换为你的测试目录 FILE_SIZE="1G" # 测试文件大小 BLOCK_SIZE="4k" # 块大小(影响延迟测试) # 1. 顺序写测试 echo "=== Sequential Write Test ===" dd if=/dev/zero of=$DISK_PATH bs=1M count=1024 conv=fdatasync 2>&1 | tail -1 # 2. 顺序读测试 echo "=== Sequential Read Test ===" echo 3 > /proc/sys/vm/drop_caches # 清空缓存确保测试准确性 dd if=$DISK_PATH of=/dev/null bs=1M count=1024 2>&1 | tail -1 # 3. 随机读写延迟测试(4K) echo "=== Random Write IOPS (4K) ===" dd if=/dev/zero of=$DISK_PATH bs=4k count=256000 oflag=direct 2>&1 | tail -1 # 清理测试文件 rm -f $DISK_PATH
执行结果解析:
- 若
dd输出中包含4 GB/s类似数据,说明磁盘理论顺序吞吐较高。 - 若
direct模式(跳过缓存)的4K写入IOPS低于 10000,可能为普通机械盘或云盘性能瓶颈。
脚本适用场景:
- 新服务器上线前快速校验磁盘能否达到云厂商SLA。
- 排查业务响应慢是否为磁盘I/O导致。
实战脚本二:磁盘健康状态自动化预警(smartctl+iostat)
对于长期运行的服务器,磁盘故障往往是“沉默的杀手”,本脚本结合S.M.A.R.T与实时I/O指标,实现主动监控。
#!/bin/bash
# 文件名:disk_health_watch.sh
# 功能:每30秒检查磁盘健康状态,异常时写入日志并发送邮件
DISK_LIST="sda sdb" # 按实际设备修改
LOG_FILE="/var/log/disk_health.log"
ALERT_EMAIL="admin@example.com"
while true; do
for disk in $DISK_LIST; do
# 检查S.M.A.R.T属性(重点关注5、187、188、197、198)
REALLOC_SECT=$(smartctl -A /dev/$disk | grep "Reallocated_Sector_Ct" | awk '{print $10}')
PENDING_SECT=$(smartctl -A /dev/$disk | grep "Current_Pending_Sector" | awk '{print $10}')
# 获取I/O等待时间(%iowait)
IOWAIT=$(iostat -c 1 2 | tail -1 | awk '{print $4}')
# 阈值判断
if [ "$REALLOC_SECT" -gt 10 ] || [ "$PENDING_SECT" -gt 5 ]; then
echo "[WARN] $(date) - $disk: Reallocated=$REALLOC_SECT, Pending=$PENDING_SECT" >> $LOG_FILE
# 可扩展发送邮件(需配置mailx)
# echo "Disk $disk health alert!" | mail -s "Server Disk Warning" $ALERT_EMAIL
fi
# 如果IOWAIT>30%且持续2次以上,输出警告
if [ "${IOWAIT%.*}" -gt 30 ]; then
echo "[IOWARN] $(date) - $disk: IOWAIT=$IOWAIT%" >> $LOG_FILE
fi
done
sleep 30
done
脚本优化建议:
- 实际生产环境中,建议用
inotify或systemd timer替代while sleep,避免进程残留。 - 邮件发送可使用
msmtp+mutt组合,或集成到企业微信机器人。
核心指标解读:
- Reallocated_Sector_Ct:已被重映射的坏扇区数,>0即需警惕。
- Current_Pending_Sector:待重映射的扇区数,若不下降则磁盘可能很快失效。
- %iowait:CPU等待磁盘I/O完成的时间比例,长期>30%表明磁盘成为瓶颈。
实战脚本三:Web服务级性能报告生成(Python+psutil)
如果你需要可视化报告(如Redis或MySQL等数据库的磁盘延迟影响),Python脚本能更好地处理多维度数据。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 文件名:disk_perf_report.py
# 功能:采集磁盘性能指标并输出为JSON,可用于Grafana或自建面板
import psutil
import time
import json
def get_disk_perf(interval=1):
"""采集指定时间间隔内的磁盘性能指标"""
# 初始计数器
disk_io_start = psutil.disk_io_counters(perdisk=True)
time.sleep(interval)
disk_io_end = psutil.disk_io_counters(perdisk=True)
result = {}
for device in disk_io_start:
start = disk_io_start[device]
end = disk_io_end[device]
# 计算每秒指标
read_bytes = (end.read_bytes - start.read_bytes) / interval
write_bytes = (end.write_bytes - start.write_bytes) / interval
read_count = (end.read_count - start.read_count) / interval # IOPS读
write_count = (end.write_count - start.write_count) / interval # IOPS写
read_time = (end.read_time - start.read_time) / interval # 总读耗时(ms)
write_time = (end.write_time - start.write_time) / interval # 总写耗时(ms)
# 平均I/O延迟(毫秒/次)
avg_r_latency = read_time / max(read_count, 1)
avg_w_latency = write_time / max(write_count, 1)
# 磁盘使用率(%util近似值,1秒内设备忙碌占比)
# 注意:需采样两次以上才能近似计算,此处简化
util = (end.busy_time - start.busy_time) / (interval * 1000) * 100
result[device] = {
"read_blk": round(read_bytes / 1024 / 1024, 2), # MB/s
"write_blk": round(write_bytes / 1024 / 1024, 2),
"read_iops": round(read_count, 2),
"write_iops": round(write_count, 2),
"avg_read_latency_ms": round(avg_r_latency, 1),
"avg_write_latency_ms": round(avg_w_latency, 1),
"util_percent": round(util, 1)
}
return result
if __name__ == "__main__":
perf = get_disk_perf(interval=2)
print(json.dumps(perf, indent=2))
输出示例:
{
"sda": {
"read_blk": 42.35,
"write_blk": 12.01,
"read_iops": 256.5,
"write_iops": 102.0,
"avg_read_latency_ms": 4.2,
"avg_write_latency_ms": 8.7,
"util_percent": 35.4
}
}
实用扩展:
- 将脚本通过
crontab每5分钟执行一次,追加结果到InfluxDB,用Grafana生成历史曲线。 - 若监控到
avg_write_latency_ms持续 >30ms,自动触发数据库连接池大小调整或告警。
常见问题问答(QA)
Q1:用脚本测磁盘性能会不会影响业务?
A:会,尤其 dd 的 direct 模式会绕过缓存,高负载测试可能拖慢IO,建议:
- 生产环境使用
iostat -x或psutil的被动采集,不主动创建负载。 - 若必须压测,选择凌晨低峰期,并限制测试时间(如
timeout 30)。
Q2:为什么 iostat 显示的 %util 不是100%时,应用却感觉卡顿?
A:%util 仅表示设备在采样周期内是否忙碌(忙即100%),无法反映单次I/O延迟。
- 当磁盘平均服务时间 >30ms 时,即使
%util=70%,业务也可能阻塞。 - 应重点关注
r_await和w_await(平均等待时间)。
Q3:脚本如何在Windows上运行?
A:使用PowerShell替代Shell:
# 获取磁盘性能计数器(类似iostat) Get-Counter "\PhysicalDisk(*)\Disk Reads/sec" -SampleInterval 1 -MaxSamples 3 Get-Counter "\PhysicalDisk(*)\Avg. Disk sec/Read" # 平均读延迟(秒) # 安装 smartmontools for Windows 后可用 smartctl
Q4:云服务器(如AWS EBS)是否能用smartctl?
A:不能,多数云盘(EBS、CBS、各类SSD云盘)通过虚拟化层暴露,S.M.A.R.T信息不准确或不可用,建议改用云服务商提供的云监控API(如AWS CloudWatch的 VolumeReadOps/VolumeWriteBytes)。
总结与延伸建议
通过脚本获取磁盘性能,本质是将低层系统命令转化为自动化、可重复、跨机器的监控能力。
- 短期定位:用
dd或fio脚本快速验证供应商承诺的IOPS。 - 长期运维:将
iostat+smartctl脚本集成到Prometheus或Zabbix,实现7x24小时监控。 - 进阶方向:学习
blktrace(块层追踪)分析单次I/O的详细路径,或使用bpftrace查看内核级磁盘瓶颈。
任何脚本的安全第一原则是在测试环境充分验证后再应用于生产系统。
(全文完)