8.mysql为什么会抖一下2022-02-20

主要有四个原因:mysql的内存满了、redo log日志满了、空闲时间、重启数据库。

一、分析以下四种原因对性能的影响

这种影响在实际线上环境主要是内存和redo log 日志对性能的影响。

1.InnoDB用缓冲池(pool buffer)管理内存,缓冲池中内存页有哪三种状态?

(1)没有使用
(2)使用了有脏内存页(脏内存页:内存的数据和磁盘数据不一致的内存页)
(3)使用了是干净页

2.简单说说在内存满了的时候会怎么处理?

当内存满了时,如果内存中有查询的数据页,就直接返回;没有的话就要淘汰掉最久不使用的数据页,被淘汰的数据页如果是脏页,还会把脏页持久化的磁盘后,空出的内存才能使用。

flush一个脏页时是否使用连坐机制怎么设置?
innodb_flush_neighbors = 1 时会使用连坐机制,一般是机械磁盘使用,连坐意思就是当有数据页是脏页需要持久化后,会判断相邻的数据页是否为脏页,持久化的操作会连续下去,直到没有脏页为止。
innodb_flush_neighbors = 0 时,不会触发连坐机制,一般时ssd固态硬盘使用,因为IOPS(io每秒输入输出量)并不是瓶颈。

二、flush脏页的策略

1.innodb_io_capacity

innodb_io_capacity是InnoDB刷脏页的速度。

引擎怎么控速度的?
引擎怎么控速度主要需要考虑两个因素:一是脏页的比例,二是磁盘的io效率。
选出F1(N)和F2(M)的较大值记录为R

flush速度 = innodb_io_capacity * R%

2.怎么得到脏页比例和磁盘io?

innodb_max_dirty_pages_pct:是脏页比例的上限,默认值是75%。InnoDB会根据当前脏页的比例N,根据函数算法的得到F1(N);

innoDB 每次写入的日志都有一个序号,当前写入的序号跟 checkpoint 对应的序号之间的差值M,根据函数算法的得到F2(M);

三、思考题

一个内存配置为 128GB、innodb_io_capacity 设置为 20000 的大规格实例,正常会建议你将 redo log 设置成 4 个 1GB 的文件。但如果你在配置的时候不慎将 redo log 设置成了 1 个 100M 的文件,会发生什么情况呢?又为什么会出现这样的情况呢?

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容