问题说明
linux服务器突然非常的卡,查看cpu和内存使用量还有富裕,所以开始排查磁盘IO问题
根据网上搜集的资料,生成了shell脚本,它可能找到是哪个磁盘出的问题是哪个线程引起的
找到正在跑的 flush-8:xx 线程
映射到对应 /dev/sdX
检查 I/O、内存脏页、SMART、dmesg
#!/bin/bash
# 自动诊断 kworker flush 占用 CPU 高的问题
echo "=== 1. 检查正在运行的 flush 线程 ==="
ps -eo pid,comm,args,pcpu --sort=-pcpu | grep flush | grep -v grep
# 自动提取 flush-8:XX
FLUSH_TASK=$(ps -eo args | grep "flush-8:" | grep -v grep | head -n1)
if [ -z "$FLUSH_TASK" ]; then
echo "未找到 flush-8:xx 线程,退出。"
exit 0
fi
MINOR=$(echo $FLUSH_TASK | sed -n 's/.*flush-8:\([0-9]\+\).*/\1/p')
MAJOR=8
DEVNUM="$MAJOR:$MINOR"
# 通过 /proc/partitions 找出设备名
DEVICE=$(awk -v d="$DEVNUM" '{if ($1":"$2 == d) print $4}' /proc/partitions)
if [ -z "$DEVICE" ]; then
echo "未能识别设备号 $DEVNUM 对应的设备。"
exit 1
fi
echo "识别到 flush 线程对应设备: /dev/$DEVICE"
echo -e "\n=== 2. 磁盘 I/O 使用情况 (iostat) ==="
if command -v iostat >
/dev/null 2>
&
1; then
iostat -x 1 3 | grep $DEVICE
else
echo "未找到 iostat,请安装 sysstat 包 (apt install sysstat 或 yum install sysstat)"
fi
echo -e "\n=== 3. 实时 I/O 占用进程 (iotop) ==="
if command -v iotop >
/dev/null 2>
&
1; then
sudo iotop -ao -n 3 | head -20
else
echo "未找到 iotop,请安装 iotop 包 (apt install iotop 或 yum install iotop)"
fi
echo -e "\n=== 4. 内存脏页情况 (/proc/meminfo) ==="
grep -E "Dirty|Writeback" /proc/meminfo
echo -e "\n=== 5. 磁盘 SMART 健康检查 (/dev/$DEVICE) ==="
if command -v smartctl >
/dev/null 2>
&
1; then
sudo smartctl -H /dev/$DEVICE
else
echo "未找到 smartctl,请安装 smartmontools 包 (apt install smartmontools 或 yum install smartmontools)"
fi
echo -e "\n=== 6. 最近的内核日志 (dmesg) ==="
dmesg -T | grep -i "$DEVICE" | tail -20
echo -e "\n诊断完成。重点查看 I/O、脏页、SMART、dmesg 是否异常。"