磁盘性能优化

核心知识点

1. 磁盘性能基础

1.1 磁盘性能指标

┌─────────────────────────────────────────────────────┐
│              磁盘性能指标                           │
├─────────────────────────────────────────────────────┤
│                                                     │
│   ┌─────────┐  ┌─────────┐  ┌─────────┐          │
│   │ 吞吐量  │  │ IOPS    │  │ 延迟    │          │
│   │         │  │         │  │         │          │
│   │ MB/s    │  │ 次数/秒  │  │ 毫秒    │          │
│   │ 读/写   │  │ 随机/顺序│  │ 平均/最大│          │
│   └─────────┘  └─────────┘  └─────────┘          │
│                                                     │
│   ┌─────────┐  ┌─────────┐  ┌─────────┐          │
│   │ 利用率  │  │ 队列长度 │  │ 等待时间│          │
│   │         │  │         │  │         │          │
│   │ %util   │  │ avgqu-sz │  │ await  │          │
│   │         │  │         │  │         │          │
│   └─────────┘  └─────────┘  └─────────┘          │
│                                                     │
└─────────────────────────────────────────────────────┘

1.2 磁盘 I/O 类型

┌─────────────────────────────────────────────────────┐
│              磁盘 I/O 类型                          │
├─────────────────────────────────────────────────────┤
│                                                     │
│   ┌─────────────────────────────────────────┐       │
│   │           顺序 I/O                     │       │
│   │  - 大文件读写                           │       │
│   │  - 数据库备份                           │       │
│   │  - 视频流媒体                           │       │
│   │  - 特点:高吞吐量,低延迟               │       │
│   └─────────────────────────────────────────┘       │
│                      │                              │
│   ┌─────────────────────────────────────────┐       │
│   │           随机 I/O                     │       │
│   │  - 数据库查询                           │       │
│   │  - 文件系统操作                         │       │
│   │  - 虚拟机磁盘                           │       │
│   │  - 特点:高 IOPS,高延迟               │       │
│   └─────────────────────────────────────────┘       │
│                      │                              │
│   ┌─────────────────────────────────────────┐       │
│   │           混合 I/O                     │       │
│   │  - Web 服务器                           │       │
│   │  - 应用服务器                           │       │
│   │  - 特点:平衡吞吐量和 IOPS             │       │
│   └─────────────────────────────────────────┘       │
│                                                     │
└─────────────────────────────────────────────────────┘

1.3 磁盘性能瓶颈

瓶颈类型 表现 原因
I/O 等待高 iowait 持续 > 20% 磁盘速度慢、并发 I/O 多
队列长度长 avgqu-sz > 1 I/O 请求堆积、磁盘饱和
延迟高 await > 10ms 磁盘性能不足、负载高
利用率高 %util > 80% 磁盘饱和、需要扩容
空间不足 磁盘使用率 > 90% 日志过多、数据增长

2. 磁盘监控工具

2.1 基础监控工具

# iostat - I/O 统计
iostat -x 1
iostat -x -k 1
iostat -d -x 1

# iotop - I/O 进程监控
iotop
iotop -o

# vmstat - 系统性能统计
vmstat 1
vmstat -d 1

# dstat - 综合监控
dstat
dstat -cd

2.2 磁盘使用监控

# df - 磁盘空间使用
df -h
df -i

# du - 目录空间使用
du -sh *
du -h --max-depth=1

# 查看磁盘分区
fdisk -l
lsblk

# 查看磁盘信息
hdparm -I /dev/sda
smartctl -a /dev/sda

2.3 I/O 性能监控

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

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

# 监控进程 I/O
pidstat -d 1

# 查看 I/O 等待
vmstat 1
top

2.4 磁盘健康监控

# 查看磁盘健康状态
smartctl -a /dev/sda
smartctl -H /dev/sda

# 查看磁盘温度
hddtemp /dev/sda

# 查看磁盘错误
dmesg | grep -i error

3. 磁盘优化方法

3.1 I/O 调度器优化

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

# 查看可用调度器
cat /sys/block/sda/queue/scheduler

# 设置调度器为 deadline(适合数据库)
echo deadline > /sys/block/sda/queue/scheduler

# 设置调度器为 cfq(适合桌面)
echo cfq > /sys/block/sda/queue/scheduler

# 设置调度器为 noop(适合 SSD)
echo noop > /sys/block/sda/queue/scheduler

# 永久设置
echo "echo deadline > /sys/block/sda/queue/scheduler" >> /etc/rc.local

3.2 文件系统优化

# 选择合适的文件系统
# ext4 - 通用文件系统
# xfs - 大文件、高性能
# btrfs - 快照、压缩
# zfs - 企业级功能

# 挂载选项优化
mount -o noatime,nodiratime /dev/sda1 /data
mount -o data=writeback /dev/sda1 /data
mount -o commit=30 /dev/sda1 /data

# 调整文件系统参数
tune2fs -o journal_data_writeback /dev/sda1
tune2fs -O ^has_journal /dev/sda1

# 定期整理文件系统
e4defrag /data
xfs_fsr /data

3.3 挂载选项优化

# 查看当前挂载选项
mount | grep /data

# 优化挂载选项
# noatime - 不更新访问时间
# nodiratime - 不更新目录访问时间
# data=writeback - 异步写入数据
# commit=30 - 30秒提交一次
# barrier=0 - 禁用屏障(SSD)

# 编辑 /etc/fstab
/dev/sda1 /data ext4 defaults,noatime,nodiratime,commit=30 0 2

# 重新挂载
mount -o remount /data

3.4 RAID 配置优化

# 创建 RAID 0(性能优先)
mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1

# 创建 RAID 1(冗余优先)
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1

# 创建 RAID 10(性能和冗余平衡)
mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# 配置 RAID 缓存
echo 1024 > /sys/block/md0/md/stripe_cache_size

# 查看 RAID 状态
cat /proc/mdstat
mdadm --detail /dev/md0

4. SSD 优化

4.1 SSD 特定优化

# 确认设备是 SSD
cat /sys/block/sda/queue/rotational
# 输出 0 表示 SSD

# 使用 noop 调度器
echo noop > /sys/block/sda/queue/scheduler

# 禁用 atime
mount -o noatime /dev/sda1 /data

# 启用 TRIM
fstrim -v /data
# 或在 /etc/fstab 中添加 discard 选项

# 查看是否支持 TRIM
hdparm -I /dev/sda | grep TRIM

4.2 SSD 监控

# 查看 SSD 健康状态
smartctl -a /dev/sda

# 查看 SSD 写入量
smartctl -A /dev/sda | grep "Total_LBAs_Written"

# 查看 SSD 剩余寿命
smartctl -A /dev/sda | grep "Media_Wearout_Indicator"

# 查看 SSD 温度
hddtemp /dev/sda

4.3 SSD 性能优化

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

# 调整 I/O 调度器
echo noop > /sys/block/sda/queue/scheduler

# 禁用 swap(避免写入)
swapoff -a

# 使用 tmpfs(内存文件系统)
mount -t tmpfs -o size=2G tmpfs /tmp

# 定期执行 TRIM
fstrim -v /data
# 添加到 cron
echo "0 3 * * * /usr/sbin/fstrim -v /data" >> /etc/crontab

5. 磁盘性能测试

5.1 顺序读写测试

# 使用 dd 测试顺序写入
dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct
dd if=/dev/zero of=testfile bs=1M count=1024 oflag=direct

# 使用 dd 测试顺序读取
dd if=testfile of=/dev/null bs=1M count=1024 iflag=direct

# 使用 fio 测试顺序读写
fio --name=seqwrite --ioengine=libaio --iodepth=16 \
    --rw=write --bs=1M --direct=1 --size=1G \
    --numjobs=4 --runtime=60 --group_reporting

fio --name=seqread --ioengine=libaio --iodepth=16 \
    --rw=read --bs=1M --direct=1 --size=1G \
    --numjobs=4 --runtime=60 --group_reporting

5.2 随机读写测试

# 使用 fio 测试随机读写
fio --name=randwrite --ioengine=libaio --iodepth=16 \
    --rw=randwrite --bs=4k --direct=1 --size=1G \
    --numjobs=4 --runtime=60 --group_reporting

fio --name=randread --ioengine=libaio --iodepth=16 \
    --rw=randread --bs=4k --direct=1 --size=1G \
    --numjobs=4 --runtime=60 --group_reporting

fio --name=randrw --ioengine=libaio --iodepth=16 \
    --rw=randrw --rwmixread=70 --bs=4k --direct=1 \
    --size=1G --numjobs=4 --runtime=60 --group_reporting

5.3 综合性能测试

# 使用 iozone 测试
iozone -a -s 1G -r 4k -i 0 -i 1 -i 2

# 使用 bonnie++ 测试
bonnie++ -d /data -s 2G -n 0 -m TEST -f -b

# 使用 sysbench 测试
sysbench fileio --file-total-size=1G prepare
sysbench fileio --file-total-size=1G --file-test-mode=rndrw \
    --max-time=300 --max-requests=0 run
sysbench fileio --file-total-size=1G cleanup

实用案例分析

案例 1:优化数据库磁盘 I/O

场景描述

数据库磁盘 I/O 等待时间长,影响性能。

操作步骤

# 1. 监控磁盘 I/O
iostat -x 1
iotop

# 2. 分析 I/O 模式
pidstat -d 1
strace -e trace=read,write,pread,pwrite -p <pid>

# 3. 优化 I/O 调度器
echo deadline > /sys/block/sda/queue/scheduler

# 4. 优化挂载选项
mount -o noatime,nodiratime,data=writeback /dev/sda1 /data

# 5. 调整 RAID 配置
# 使用 RAID 10 提高性能
mdadm --create /dev/md0 --level=10 --raid-devices=4 \
    /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

# 6. 使用 SSD
# 将热数据迁移到 SSD
# 使用 SSD 作为缓存

# 7. 优化数据库配置
# 调整缓冲池大小
# 调整 I/O 线程数

# 8. 验证优化效果
iostat -x 1
pidstat -d 1

案例 2:优化 Web 服务器磁盘性能

场景描述

Web 服务器磁盘 I/O 成为瓶颈。

操作步骤

# 1. 监控磁盘使用
iostat -x 1
df -h

# 2. 分析 I/O 模式
iotop
pidstat -d 1

# 3. 优化静态文件服务
# 使用 CDN
# 使用内存缓存
mount -t tmpfs -o size=1G tmpfs /var/www/static

# 4. 优化日志
# 减少日志级别
# 使用日志轮转
# 异步写入日志

# 5. 优化文件系统
echo deadline > /sys/block/sda/queue/scheduler
mount -o noatime /dev/sda1 /var/www

# 6. 使用 SSD
# 将热数据迁移到 SSD
# 使用 SSD 作为缓存

# 7. 优化应用
# 减少磁盘 I/O
# 使用缓存
# 批量处理

# 8. 验证优化效果
iostat -x 1
ab -n 1000 -c 10 http://localhost/

案例 3:优化虚拟机磁盘性能

场景描述

虚拟机磁盘 I/O 性能差。

操作步骤

# 1. 监控虚拟机磁盘 I/O
iostat -x 1
virsh domblklist <vm-name>

# 2. 优化虚拟磁盘格式
# 使用 raw 格式(性能最好)
# 使用 qcow2 格式(功能丰富)
# 使用 virtio 驱动

# 3. 优化 I/O 调度器
echo noop > /sys/block/vda/queue/scheduler

# 4. 使用 SSD
# 将虚拟机磁盘放在 SSD 上
# 使用 SSD 作为缓存

# 5. 优化虚拟机配置
# 增加虚拟 CPU
# 增加虚拟内存
# 使用 virtio 磁盘驱动

# 6. 使用多队列
# 启用 virtio-blk 多队列
# 调整队列深度

# 7. 优化主机 I/O
# 使用 RAID
# 使用 SSD
# 优化 I/O 调度器

# 8. 验证优化效果
iostat -x 1
fio --name=randrw --ioengine=libaio --iodepth=16 \
    --rw=randrw --rwmixread=70 --bs=4k --direct=1 \
    --size=1G --numjobs=4 --runtime=60 --group_reporting

最佳实践

  1. 选择合适的 I/O 调度器:根据工作负载选择。
# 数据库:deadline
echo deadline > /sys/block/sda/queue/scheduler

# SSD:noop
echo noop > /sys/block/sda/queue/scheduler
  1. 优化挂载选项:减少不必要的元数据更新。
mount -o noatime,nodiratime /dev/sda1 /data
  1. 使用 SSD:将热数据迁移到 SSD。

  2. 配置 RAID:使用 RAID 10 平衡性能和冗余。

  3. 定期整理文件系统:减少碎片。

e4defrag /data
  1. 监控磁盘性能:及时发现性能问题。

  2. 定期清理磁盘:释放空间。

  3. 使用缓存:减少磁盘 I/O。

总结

本教程详细介绍了 Linux 系统磁盘性能优化的方法和工具。通过实际案例,我们学习了如何识别磁盘性能瓶颈、优化 I/O 调度器、配置 RAID 以及使用 SSD 提升性能。掌握这些知识后,可以显著提升系统磁盘 I/O 性能和存储效率。

« 上一篇 内存性能优化 下一篇 » 网络性能优化