数据库IO性能优化思考

2026年6月24日 13点热度 0人点赞 0条评论

一、数据与WAL分离

务必将WAL日志(pg_wal目录)放在独立的物理磁盘或高性能分区,隔离数据文件写入压力,对提升性能至关重要

二、文件系统优化

文件系统选择:优先选择 XFS,尤其是在大文件和高并发的数据库场景下,实测4K随机写性能比 ext4 提升约 25%。
文件系统4K对齐:创建时使用 mkfs.xfs -f -s size=4096 /dev/sdX 确保 4KiB 对齐,这在很多虚拟化环境中效果显著。
挂载参数优化:如果数据库是 MySQL/PostgreSQL,且使用 XFS 文件系统,可在挂载选项增加参数提升日志子系统吞吐量:
mount -t xfs -o remount,noatime,nodiratime,logbufs=8,logbsize=256k,inode64,commit=60 /dev/sdX /mnt/db
noatime,nodiratime:关闭访问时间记录,减少大量微小写 IO(高并发必备)
commit=60:延长文件系统刷盘间隔(默认 5 秒,降低频繁 fsync)
async:异步写,数据先落页缓存,再后台刷盘,大幅降低即时 IO 压力
ext4:barrier=0:关闭 ext4 写屏障(硬件有 RAID 卡 + 电池 BBU 才建议开,断电无风险)
xfs:logbufs=8,logbsize=256k 放大日志缓冲区,减少元数据刷盘

三、“磁盘 IO 调度算法”优化

Linux 不同内核 / 磁盘推荐调度器:
SSD 固态硬盘:推荐 mq-deadline / none(新版本内核)
HDD 机械硬盘:推荐 mq-deadline(老内核 deadline)
严禁 SSD 使用 cfq(完全不适合,队列堆积严重)

1、临时修改

查看当前调度器:cat /sys/block/sda/queue/scheduler
SSD 设置 mq-deadline:echo mq-deadline > /sys/block/sda/queue/scheduler
老SSD/高速盘设置 none:echo none > /sys/block/sda/queue/scheduler

2、永久生效

编辑内核启动参数 /etc/default/grub,添加:elevator=mq-deadline
然后更新 grub,并重启服务器:grub2-mkconfig -o /boot/grub2/grub.cfg

四、“块设备队列参数”优化

针对 IO 队列堆积,util 高的情况,可对快设备队列参数进行优化。
并发高时默认队列深度太小,请求排队:

  1. 调大队列深度(SSD建议 1024~2048,HDD 256~512)
    echo 1024 > /sys/block/sda/queue/nr_requests
  2. 预读大小(顺序IO调大,随机IO调小)
    随机IO(数据库/小文件):16384
    顺序IO(备份/日志):65536
    echo 16384 > /sys/block/sda/queue/read_ahead_kb
    ---以上临时生效,需持久化可使用 udev 规则

liking

这个人很懒,什么都没留下

文章评论