ubuntu如何提高磁盘读写速度
小樊
39
2025-12-07 10:32:10
Ubuntu 磁盘读写性能优化实操指南
一 基线测量与定位瓶颈
- 使用 fio 建立可复现的基准,区分缓存与裸盘性能:
- 随机读:fio -name=randread -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdX
- 随机写:fio -name=randwrite -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdX
- 顺序读/写:将 rw=read/write 即可;关注指标 IOPS、吞吐量、延迟(lat、slat、clat)、bw。
- 用 iostat -x 2 3 观察设备负载与排队:
- 若 await 远高于 svctm,说明队列等待长;%util 接近 100% 表示设备长期饱和,应优先扩容或更换更快介质/优化负载分布。
二 硬件与存储架构优化
- 介质升级:优先使用 SSD/NVMe 替代 HDD,可显著改善 IOPS 与延迟。
- 阵列与隔离:按负载选择 RAID(提升吞吐/冗余),并将 日志、数据库 等高 I/O 负载与业务数据做 磁盘级隔离,避免相互干扰。
三 文件系统与挂载选项
- 选型建议:通用场景选 ext4;大文件/高并发可选 XFS(支持更大分区与文件数量,但不可收缩)。
- 创建时优化示例:
- ext4:sudo mkfs.ext4 -b 4096 -E lazy_itable_init=1 /dev/sdX1
- XFS:sudo mkfs.xfs -b size=4k -l size=128m /dev/sdX1
- 挂载选项:优先加入 noatime(必要时 nodiratime)以减少元数据写;日志模式可用 data=writeback(权衡一致性,谨慎用于关键数据)。
- SSD 专项:
- 启用 TRIM:先确认内核与设备支持(hdparm -I /dev/sdX | grep “TRIM supported”),在 /etc/fstab 对应挂载项加入 discard(如:/dev/sdX1 / ext4 defaults,noatime,discard 0 1)。
- 不建议在断电风险场景关闭 ext4 日志(tune2fs -O ^has_journal),会显著增加崩溃时数据损坏概率。
四 内核与块层调优
- I/O 调度器:
- SSD/虚拟机 常用 noop(或 mq-deadline);数据库 常用 deadline。查看/设置:cat /sys/block/sdX/queue/scheduler;echo noop > /sys/block/sdX/queue/scheduler(按设备设置)。
- 预读与队列:
- 顺序读较多时增大预读:echo 8192 > /sys/block/sdX/queue/read_ahead_kb;或用 blockdev --setra 8192 /dev/sdX(注意单位差异)。
- 适度增大队列长度:echo 128–256 > /sys/block/sdX/queue/nr_requests(吞吐↑、延迟可能↑)。
- 虚拟内存与缓存:
- 减少换出倾向:/etc/sysctl.conf 中设置 vm.swappiness=1–10(桌面/内存充足可更低;禁用请评估休眠需求)。
- 调整目录项/索引节点回收倾向:vm.vfs_cache_pressure(默认 100,数值越大越易回收,按需微调)。
- 脏页刷写(示例值,按负载微调):vm.dirty_background_ratio=10;vm.dirty_ratio=20;vm.dirty_expire_centisecs=3000;vm.dirty_writeback_centisecs=500。
五 应用与运维实践
- 应用侧优化:优先 追加写 替代随机写;充分利用 页缓存;高频小文件/随机访问可用 mmap;需要同步写时尽量 合并写 而非频繁 O_SYNC/fsync;多应用争用磁盘时用 cgroups I/O 限流/分级,关键进程用 ionice 提升 I/O 优先级。
- 临时/可丢弃数据:将 /tmp、/var/tmp、/var/log 放入 tmpfs(如:tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0),降低 SSD 磨损并提升速度(注意内存占用)。
- 变更生效与回滚:/etc/fstab 修改后用 mount -o remount 验证;内核参数用 sysctl -p 生效;重要参数建议先备份并在低峰期变更,变更前后用 fio/iostat 对比效果。