MySQL性能抖动
当内存数据页跟磁盘数据页内容不一致的时,称这个内存页为“脏页”。内存数据写入磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。
平时执行很快的更新操作,就是在写内存和日志,而MySQL偶尔抖一下,可能是在刷脏页。
刷脏页的时机
- redo log 写满了,数据库停止所有更新操作,将 check point 往前推进
- 内存不够用,淘汰数据页时,如何数据页是脏页,需要将脏页写到磁盘
- 后台定时刷脏页
- MySQL 正常关闭时,将脏页写到磁盘
以下情况会影响性能:
- 第一种情况,日志写满,更新全部堵住,写性能跌为0
- 第二种情况,一个查询要淘汰的脏页个数太多,回导致查询时间变长
InnoDB 脏页控制策略
磁盘性能 innodb_io_capacit
fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
脏页比例上限 innodb_max_dirty_pages_pct
,默认 75%。
InnoDB 根据脏页比例和 redo log 空闲比例计算出两个值,取其中最大值,结合磁盘性能控制刷脏页速度。
innodb_flush_neighbors 刷脏页的连坐机制(SSD磁盘建议关闭)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统