性能·磁盘 / 命令文档

Linux I/O性能优化

$ io 33 个章节 Linux 命令详解

概述

掌握核心技术与运维实践

核心组件

VFS层 - 虚拟文件系统接口统一

页缓存 - 内存中的数据缓冲区

块设备层 - 块设备抽象与调度

设备驱动 - 硬件接口实现

I/O路径

应用程序 → 系统调用 → VFS → 
文件系统 → 块设备层 → I/O调度器 → 
设备驱动 → 硬件设备

同步vs异步I/O

同步I/O - 进程等待I/O完成

异步I/O - 进程继续执行,I/O完成时通知

缓冲vs直接I/O

缓冲I/O - 使用页缓存提升性能

直接I/O (O_DIRECT) - 绕过页缓存直接访问

关键理解:选择正确的I/O模式是性能优化的第一步,需要根据应用场景和数据访问模式来决定。

硬件层面

存储介质类型(HDD、SSD、NVMe)

RAID配置与级别选择

控制器缓存与写入策略

网络存储延迟(NFS、iSCSI)

软件层面

文件系统类型与参数配置

I/O调度器选择

内核缓存策略

应用程序I/O模式

调度器类型

noop - 最简单,适用于SSD和虚拟化环境

deadline - 保证请求在指定时间内处理完成

cfq - 完全公平队列,适用于桌面环境

mq-deadline - 多队列版本,适用于高性能存储

调优命令

# 查看当前调度器
cat /sys/block/sda/queue/scheduler

# 设置调度器
echo mq-deadline > /sys/block/sda/queue/scheduler

# 永久设置 (添加到内核启动参数)
elevator=mq-deadline

ext4优化参数

# 挂载时优化选项
mount -o noatime,data=writeback,barrier=0 /dev/sda1 /data

# /etc/fstab 配置
/dev/sda1 /data ext4 noatime,data=writeback,barrier=0 0 0

XFS优化参数

# XFS特有优化
mount -o noatime,largeio,inode64,swalloc /dev/sda1 /data

# 创建时优化
mkfs.xfs -f -d agcount=16 -l size=128m /dev/sda1
注意:barrier=0 会提升性能但降低数据安全性,只在有UPS保护的环境中使用。

关键参数设置

# /etc/sysctl.conf 添加以下参数

# 虚拟内存管理
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.dirty_writeback_centisecs = 100
vm.dirty_expire_centisecs = 200

# 换页行为
vm.swappiness = 1
vm.vfs_cache_pressure = 50

# I/O相关
kernel.sched_min_granularity_ns = 10000000
kernel.sched_wakeup_granularity_ns = 15000000

队列深度优化

# 调整I/O队列深度
echo 32 > /sys/block/sda/queue/nr_requests

# SSD优化设置
echo 0 > /sys/block/sda/queue/rotational
echo 1 > /sys/block/sda/queue/iosched/fifo_batch

I/O模式优化

批量操作 - 减少系统调用次数

顺序访问 - 利用预读机制

内存映射 - mmap减少数据拷贝

异步I/O - 提高并发处理能力

缓存策略

# 应用程序使用直接I/O示例
int fd = open(filename, O_DIRECT | O_RDWR);

# 预读设置
echo 4096 > /sys/block/sda/queue/read_ahead_kb

# 页面缓存管理
echo 3 > /proc/sys/vm/drop_caches  # 清理缓存(仅测试用)
最佳实践:根据工作负载特点选择合适的I/O策略,数据库应用通常受益于直接I/O,而Web服务器更适合页缓存。

IOPS与带宽

IOPS - 每秒I/O操作数,衡量随机访问能力

吞吐量 - 每秒传输数据量,衡量顺序访问能力

延迟 - I/O请求响应时间,影响用户体验

队列深度 - 等待处理的I/O请求数量

利用率指标

%util - 设备利用率百分比

avgqu-sz - 平均队列长度

await - 平均等待时间

svctm - 平均服务时间

iostat - I/O统计

# 实时监控磁盘I/O
iostat -x 1

# 监控特定设备
iostat -x 1 sda

# 详细输出解释
Device    r/s   w/s    rkB/s    wkB/s  await  %util
sda      10.2  23.5   156.8    94.2   8.5    45.2

iotop - 进程I/O监控

# 显示I/O活跃进程
iotop -o

# 按进程累计I/O排序
iotop -a

# 监控特定进程
iotop -p PID

sar - 系统活动报告

# I/O传输速率
sar -b 1 10

# 设备利用率
sar -d 1 10

# 历史数据查看
sar -d -f /var/log/sa/sa15

blktrace - 块层追踪

# 启动块层追踪
blktrace -d /dev/sda -o trace

# 解析追踪数据
blkparse trace.blktrace.0

# 生成I/O模式报告
btt trace.blktrace.0

perf - 性能分析

# I/O相关性能事件监控
perf stat -e block:block_rq_issue,block:block_rq_complete \
          -p PID sleep 10

# 查看I/O热点函数
perf record -e block:block_rq_issue -g
perf report

性能基准参考值

SSD: IOPS > 10,000, 延迟 < 1ms

HDD: IOPS ~100-200, 延迟 ~10ms

%util > 80%: 存储成为瓶颈

await > 20ms: 需要优化

性能问题诊断步骤

确定症状 - 应用响应慢还是系统负载高

检查基础指标 - 使用top、vmstat、iostat

定位瓶颈设备 - 识别高利用率磁盘

分析I/O模式 - 随机vs顺序,读vs写

检查应用行为 - 使用strace、lsof

验证优化效果 - 对比优化前后指标

诊断要点:不要仅看单一指标,需要结合系统整体状况进行综合分析。高IOPS不一定代表性能好,还要看延迟和错误率。

存储规划原则

分离原则 - 系统盘、数据盘、日志盘分离

性能匹配 - 根据应用需求选择存储类型

容量规划 - 预留30%以上空间

冗余设计 - RAID或分布式存储保证可用性

配置标准化

#!/bin/bash
# 生产环境I/O优化脚本

# 设置I/O调度器
for disk in /sys/block/sd*; do
    echo mq-deadline > $disk/queue/scheduler
    echo 0 > $disk/queue/rotational  # SSD设置
done

# 内核参数优化
cat >> /etc/sysctl.conf << EOF
vm.dirty_ratio = 10
vm.dirty_background_ratio = 3
vm.swappiness = 1
EOF

sysctl -p

关键告警指标

磁盘利用率 > 85% - 预警级别

平均响应时间 > 50ms - 告警级别

队列深度 > 10 - 性能瓶颈指示

I/O错误率 > 0.1% - 硬件故障预警

监控脚本示例

#!/bin/bash
# I/O性能监控脚本

THRESHOLD_UTIL=85
THRESHOLD_AWAIT=50

iostat -x 1 1 | awk -v util=$THRESHOLD_UTIL -v await=$THRESHOLD_AWAIT '
/^[s|h|v]d/ {
    if ($10 > util) {
        print "WARNING: Device "$1" utilization: "$10"%"
    }
    if ($10 > await) {
        print "WARNING: Device "$1" await: "$10"ms"
    }
}'

空间监控与清理

# 查找大文件
find /var -type f -size +100M -exec ls -lh {} \; | sort -k5 -hr

# 清理日志文件
find /var/log -name "*.log" -mtime +30 -delete

# 磁盘使用情况分析
du -sh /* | sort -hr
ncdu /var  # 交互式磁盘使用分析

LVM管理最佳实践

# 在线扩容
lvextend -L +50G /dev/vg0/lv_data
resize2fs /dev/vg0/lv_data  # ext4
xfs_growfs /mount/point     # xfs

# 快照备份
lvcreate -L 10G -s -n snap_data /dev/vg0/lv_data
运维警告:在生产环境进行I/O优化时,必须先在测试环境验证,并制定回滚计划。某些优化可能影响数据一致性。

I/O hang 处理流程

确认状态 - 检查进程D状态数量

定位设备 - 查看哪个存储设备无响应

检查硬件 - 查看存储控制器状态

应急措施 - 必要时重启服务或系统

# 检查D状态进程
ps aux | awk '{if($8=="D") print $0}'

# 查看I/O等待详情
cat /proc/loadavg
vmstat 1

# 强制卸载文件系统 (紧急情况)
umount -l /mount/point  # lazy umount

性能突发处理

临时降低应用并发数

启用I/O限制 (cgroup)

清理页面缓存释放内存

检查是否有异常进程大量I/O

运维经验:建立完整的监控基线很重要,这样才能快速识别异常情况。平时多收集正常状态下的性能数据。

基准测试工具

# fio - 灵活的I/O测试工具
fio --name=random-rw --ioengine=libaio --iodepth=16 \
    --rw=randrw --bs=4k --direct=1 --size=1G \
    --numjobs=4 --runtime=60 --group_reporting

# dd测试 (简单但不够准确)
dd if=/dev/zero of=testfile bs=1M count=1000 oflag=direct

# hdparm测试读性能
hdparm -tT /dev/sda

测试场景设计

随机小文件读写 - 模拟数据库负载

顺序大文件传输 - 模拟备份恢复

混合负载测试 - 模拟真实应用场景

压力测试 - 验证极限性能表现

测试结果评估标准

延迟稳定性: 99%分位数延迟 < 平均延迟的3倍

IOPS线性度: 队列深度增加,IOPS应相应提升

CPU效率: 每1000 IOPS的CPU使用率 < 10%

同分类 · 其他命令文档