Linux 磁盘“空间 vs 性能”问题怎么解决

先说结论:单纯“加磁盘空间”不一定能提升性能。要分清是“容量不足”还是“性能瓶颈”。

  • 容量问题(磁盘或 inode 快满) → 清理/扩容通常能立刻缓解,满载也可能导致性能恶化。
  • 性能瓶颈(高时延/低带宽/IOPS不足) → 需要定位瓶颈点,再决定是加更快的盘/更高规格云盘、做 RAID/条带化、系统与应用优化等。

下面给你一套“快速判断 → 原因定位 → 对策”的做法。

一、快速判断(3 分钟出结论)

把下面命令在业务低峰跑 60 秒,先看“是否是空间问题、是否磁盘已饱和、是谁在刷盘”:

# 1) 空间与 inode
df -hT
df -i

# 2) 设备是否饱和(看 %util、等待/时延)
iostat -xz 1 60

# 3) 进程谁在搞 I/O
pidstat -d 1 60 | sed -n '1,200p'
sudo iotop -oPa -d 1 -n 10

# 4) 磁盘/卷/文件系统与调度器
lsblk -o NAME,TYPE,SIZE,MODEL,ROTA,MOUNTPOINT,FSTYPE
cat /sys/block/*/queue/scheduler 2>/dev/null | cat
mount | egrep ' ext4| xfs| btrfs'

# 5) 健康与错误
sudo smartctl -a /dev/sdX    # SATA/SAS
sudo nvme smart-log /dev/nvme0  # NVMe
dmesg | egrep -i 'I/O error|blk|nvme|timed out|reset'

判断要点:

  • 空间/索引节点:使用率 > 80–90% 或 df -i 接近 100% → 先清理或扩容。
  • 饱和:iostat -xz%util≈100%r_await/w_await/aqu-sz 高 → 设备满负载。
  • 不是饱和但慢:可能是负载模式/配置不佳(小随机 I/O、多 fsync、缓存/回写设置等)。
  • 有错误/温度/降速:先处理硬件健康问题。

二、该不该“加空间”?

  • 该加的场景
    • 文件系统或 inode 快满:保持至少 10–20% 余量。空间紧张会导致碎片、元数据拥塞、写放大,实际性能变差。
    • 云盘接近配额上限(配额与性能耦合的云厂商/卷类型)。
  • 不一定有用的场景
    • 明确是 IOPS/带宽瓶颈,单块盘饱和:仅增加同盘的容量不会提高性能(除非换成更高规格或做条带化/更多并行盘)。

三、常见症状 → 对策速查

  • 症状:%util≈100%r_await/w_await 高,aqu-sz 持续增长
    • 对策(优先级从易到难)
      • 业务侧:降低高峰并发/批量,合并小 I/O,异步/批处理,增大顺序 I/O 的块大小。
      • 系统侧:将热日志/临时目录拆到独立盘;调度器 SSD 用 none/mq-deadline;合适的 readahead(顺序读:blockdev --setra 4096 /dev/sdX 测试)。
      • 存储侧:换更快介质(HDD→SSD→NVMe)、做条带化(RAID0/10、LVM -i 多条带)、升级云盘规格(更高 IOPS/吞吐上限)。
  • 症状:写延迟“周期性尖刺”,iowait 升高但 %util 不满
    • 对策:回写与日志调优
      • 内核回写:sysctl -w vm.dirty_background_ratio=5 vm.dirty_ratio=20(或用 bytes 变体更精准)。
      • 文件系统:noatime/relatime,适度拉长 commit=(ext4),数据库/消息队列将 WAL/redo 放在独立低延迟盘。
      • 避免 discard 实时 TRIM,改用周期性 fstrim.timer
  • 症状:随机小读写慢、IOPS 上不去
    • 对策:提高并行度(合理 iodepth/线程数),应用侧批量/合并;采用 SSD/NVMe;在阵列上条带化(合适 chunk/stripe 与文件系统对齐)。
  • 症状:读多、页缓存命中低
    • 对策:加内存提升 page cache;为顺序读增大 readahead;冷热数据分层(热数据上 SSD)。
  • 症状:空间接近耗尽或 inode 用完
    • 对策:清理/归档/冷数据外移;扩大文件系统/卷;小文件海量场景考虑打包、对象存储或合适的文件系统参数。
  • 症状:云盘性能异常波动
    • 对策:检查 IOPS/吞吐上限与“突发余额”;升级到可配 IOPS/吞吐的卷类型(如 AWS gp3 指定 IOPS/MB/s);多卷 RAID0 取并行。
  • 症状:硬件报错/降速/过热
    • 对策:先备份;依据 SMART/NVMe 日志更换设备或调整散热/供电;核查线缆与控制器。

四、系统与文件系统实用优化项(谨慎逐项验证)

  • I/O 调度器(SSD/NVMe 推荐):
    cat /sys/block/nvme0n1/queue/scheduler,切换为 nonemq-deadline 并复测。
  • 预读(顺序读负载):
    blockdev --getra /dev/sdXblockdev --setra 4096 /dev/sdX(单位 512B 扇区)。
  • 挂载参数:
    relatime(默认),对大量元数据访问可尝试 noatime;SSD 启用定期 fstrim 而非 discard
  • 回写策略:
    vm.dirty_*(ratio 或 bytes 版),避免突然的大规模同步写。
  • 分层/条带与对齐:
    RAID/LVM 设置合适的 chunk/stripe,确保与文件系统对齐;对数据库类顺序写推荐较大 chunk(如 256K)。
  • 文件系统选择与参数:
    XFS 在大文件/高并发写上通常更稳;ext4 可调 commit=journal_async_commit(需评估一致性要求)。
  • 进程限速与隔离:
    利用 cgroup blkio/IO 子系统给批处理限速,避免与在线业务争抢。

五、验证改进是否有效(基准与实测)

  • 基线测量(绕过页缓存,更接近设备能力):
fio --name=4k-randread --filename=/data/fio.test --size=8G \
    --bs=4k --rw=randread --iodepth=32 --numjobs=4 \
    --ioengine=libaio --direct=1 --time_based --runtime=60 --group_reporting
  • 观察 IOPS/BWclat 的平均与 P99/P99.9。逐一变更(如 readahead、调度器、并行度、RAID)后复测对比。

六、什么时候“加磁盘空间”,什么时候“加性能”

  • 加空间(扩容现有卷/盘):当文件系统或 inode 接近满导致性能下降或无法写入。
  • 加性能(更快/更多的盘,或升级云盘 IOPS/吞吐):当 %util 高、时延高,明确是设备性能瓶颈。多盘并行(RAID0/10 或 LVM 条带)能线性提升 IOPS/带宽。
  • 两者都要:既接近满又性能不足时,分层与条带化同时进行,热数据上快盘,冷数据外移。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐