性能·磁盘 / 命令文档

Linux IO等待与不可中断进程

$ io 9 个章节 Linux 命令详解

概述

深入理解IO等待CPU与不可中断进程的关联关系及优化策略

核心概念 关联关系 诊断工具 解决方案 实战演示

IO等待CPU (iowait)

定义:CPU在等待I/O操作完成期间的空闲时间百分比

本质:系统中有任务在等待磁盘、网络等I/O操作,但CPU无法继续处理这些任务

# 查看iowait
                    %Cpu(s):  2.3 us,  1.1 sy,  0.0 ni, 89.2 id, 7.4 wa, 0.0 hi, 0.0 si, 0.0 st
                    # wa = 7.4% 表示IO等待占用7.4%的CPU时间

不可中断进程 (D状态进程)

定义:处于不可中断睡眠状态的进程,通常在等待I/O操作完成

特征:无法被信号中断,包括SIGKILL信号

# 查看D状态进程
                    ps aux | awk '$8 ~ /^D/ { print $0 }'
                    # 或使用top查看STAT列中的D状态

正常阈值

iowait: < 10%

D状态进程: < 5个

警告阈值

iowait: 10-30%

D状态进程: 5-20个

危险阈值

iowait: > 30%

D状态进程: > 20个

深度关联关系分析

关键理解:因果关系 不可中断进程是因,IO等待CPU是果 当大量进程因I/O操作进入D状态时,CPU只能等待,从而产生高iowait

应用程序发起I/O请求

进程调用系统调用(如read、write)访问磁盘或网络

应用 → 系统调用 → 内核 → 设备驱动 → 硬件设备

进程进入不可中断睡眠状态

内核将进程状态设置为D(TASK_UNINTERRUPTIBLE),进程无法被调度

STAT列显示:
                        D    - 不可中断睡眠(通常是I/O等待)
                        R    - 运行或就绪
                        S    - 可中断睡眠

CPU调度器发现无可运行进程

所有就绪队列中的进程都在等待I/O,CPU进入空闲状态

运行队列为空 → CPU空闲 → 统计为iowait时间

iowait指标升高

系统统计显示高iowait百分比,反映I/O瓶颈严重程度

数量关系模型

线性关系:D状态进程数量 ∝ iowait百分比

饱和效应:当所有CPU核心都在等待I/O时,iowait接近100%

# 实时监控关联关系
                    while true; do
                      echo "$(date): D进程=$(ps -eo stat | grep -c '^D') iowait=$(top -bn1 | grep '%Cpu' | awk '{print $10}')"
                      sleep 5
                    done

专业诊断工具箱

实时监控工具

# htop - 可视化进程监控
                    htop -d 1
                    # iotop - I/O活动监控
                    iotop -o -d 1
                    # vmstat - 系统统计
                    vmstat 1 10

深度分析工具

# iostat - 详细I/O统计
                    iostat -x 1
                    # 查看具体D状态进程
                    ps axo pid,ppid,stat,comm | grep " D "
                    # 进程状态统计
                    ps -eo stat | sort | uniq -c

高级诊断脚本

# 一键诊断脚本
                    #!/bin/bash
                    echo "=== IO等待诊断报告 ==="
                    echo "当前时间: $(date)"
                    echo "D状态进程数: $(ps -eo stat | grep -c '^D')"
                    echo "当前iowait: $(top -bn1 | grep '%Cpu' | awk '{print $10}' | sed 's/wa,//')"
                    echo "负载平均值: $(uptime | awk '{print $10,$11,$12}')"
                    echo "=== 问题进程详情 ==="
                    ps axo pid,ppid,stat,pcpu,pmem,comm | grep " D " | head -10

关键性能指标 (KPI)

磁盘I/O指标

• 平均队列长度 (avgqu-sz)

• 服务时间 (svctm)

• 利用率 (%util)

系统负载指标

• 1分钟负载平均值

• 5分钟负载平均值

• 15分钟负载平均值

进程状态指标

• 运行进程数 (procs_running)

• 阻塞进程数 (procs_blocked)

• 总进程数

系统性解决方案

应急响应策略 发现高iowait和大量D状态进程时,不要立即重启系统! 应该先收集诊断信息,定位根本原因。

立即诊断与定位

# 快速诊断命令组合
                        dstat -tcdngy 5    # 综合监控
                        iotop -aoP         # I/O热点进程
                        lsof | grep -E "(REG|DIR)" | head -20  # 文件操作

识别问题进程

# 找出I/O密集型进程
                        pidstat -d 1 5    # 进程I/O统计
                        ps -eo pid,stat,comm,wchan | grep " D "  # D状态进程调用栈

优化策略实施

短期策略:

# 调整I/O调度器
                        echo mq-deadline > /sys/block/sda/queue/scheduler
                        # 增加I/O队列深度
                        echo 32 > /sys/block/sda/queue/nr_requests

长期策略:

升级存储设备(SSD替换HDD)

优化应用程序I/O模式

增加内存缓存

实施读写分离

系统级优化

# 内核参数优化
                        # /etc/sysctl.conf
                        vm.dirty_ratio = 15
                        vm.dirty_background_ratio = 5
                        vm.dirty_expire_centisecs = 1500
                        vm.dirty_writeback_centisecs = 500

监控与预防

# 设置监控阈值告警
                        #!/bin/bash
                        IOWAIT_THRESHOLD=20
                        D_PROC_THRESHOLD=10
                        while true; do
                          IOWAIT=$(top -bn1 | grep '%Cpu' | awk '{print $10}' | sed 's/wa,//' | cut -d'.' -f1)
                          D_COUNT=$(ps -eo stat | grep -c '^D')
                          if [[ $IOWAIT -gt $IOWAIT_THRESHOLD ]] || [[ $D_COUNT -gt $D_PROC_THRESHOLD ]]; then
                            echo "ALERT: 高IO等待检测到!iowait=${IOWAIT}% D进程=${D_COUNT}"
                          fi
                          sleep 60
                        done

实战检查清单

日常监控检查项:

每5分钟检查一次iowait指标

监控D状态进程数量趋势

关注磁盘使用率和队列长度

定期检查应用程序日志

监控系统负载平均值

故障排除步骤:

确认问题范围和影响

收集系统性能数据

识别热点进程和资源

实施临时缓解措施

制定长期解决方案

建立监控和预警机制

同分类 · 其他命令文档