刷盘方式是什么
该参数决定 InnoDB 读写数据文件时是否绕开操作系统页缓存。Linux 上的常见取值为 fsync(默认,数据先经页缓存)与 O_DIRECT(直接写盘,避免同一份数据在内存里存两份)。它对 IO 与内存占用的影响很大,但没有普适最优值,必须结合实际存储压测。
基本信息
| 参数名 | innodb_flush_method |
|---|---|
| Linux 典型值 | fsync(默认)、O_DIRECT、O_DIRECT_NO_FSYNC |
| 平台差异 | 各操作系统实现与可选值不同,参数含义不一致 |
| 重启生效 | 该参数属于非动态参数,修改后需要重启实例 |
| 影响范围 | 数据文件的读写路径;重做日志的刷盘策略另由其他参数控制 |
典型使用场景
- 大内存实例内存吃紧:双份缓存导致内存利用率下降时可试直接读写
- 本地固态盘部署:直接 IO 常能减少系统缓存带来的额外开销
- 云盘部署:供应商对直接 IO 的实现差异大,必须实测而非套用经验值
- 读写混合负载:日志与数据混跑时未必要改成直接 IO,先做基准对比
- 变更验证:用同一负载对比参数前后的 IO 行为与延迟分布
查看与对比验证
查看与对比验证
mysql -e "SHOW VARIABLES LIKE 'innodb_flush_method';" # 查看当前取值
# 配置文件修改后需重启实例
# [mysqld]
# innodb_flush_method = O_DIRECT
# 用 fio 观察同一块盘在直接 IO 下的行为(低峰执行,注意数据安全)
fio --name=randread --rw=randread --bs=16k --iodepth=64 \
--size=4G --filename=/data/testfile --runtime=60 --time_based --direct=0
fio --name=randread_odirect --rw=randread --bs=16k --iodepth=64 \
--size=4G --filename=/data/testfile --runtime=60 --time_based --direct=1取值对照
| 取值 | 行为 | 适用 |
|---|---|---|
| fsync | 数据经系统缓存,提交时同步落盘 | 通用默认,行为最可预期 |
| O_DIRECT | 绕过系统缓存直接读写数据文件 | 大内存或做过实测的环境 |
| O_DIRECT_NO_FSYNC | 直接读写且减少部分同步调用 | 需要通过压测验证收益 |
| 其他平台取值 | 各系统实现不同 | 不要照搬 Linux 的经验值 |
改成直接读写后,数据文件不再占用系统缓存,这部分内存会释放给其他用途,但读写路径的延迟分布可能变化。
这是需要重启的非动态参数:变更要在维护窗口进行,并准备好回退方案与验证脚本。