[MySQL 5.6] Innodb page cleaner线程刷新策略

简介:

这部分内容是从http://mysqllover.com/?p=512 剥离出来,原文中为了保持整洁,将这些内容删除。

 

有以下几个参数会影响到Page cleaner的行为:

 

innodb_lru_scan_depth

innodb_adaptive_flushing_lwm

innodb_max_dirty_pages_pct_lwm

innodb_io_capacity_max

innodb_flushing_avg_loops

 

在函数page_cleaner_flush_pages_if_needed中会确定三个影响刷脏页行为的变量

1.    根据redo log计算比例(pct_for_lsn),当小于innodb_adaptive_flushing_lwm时,pct_for_lsn值为0,当小于异步刷redo的比例(log_sys->max_modified_age_async)时且关闭选项innodb_adaptive_flushing时,pct_for_lsn也为0,否则,计算:

((innodb_io_capacity_max/innodb_io_capacity)

*(lsn_age_factor * sqrt((double)lsn_age_factor)))/7.5

其中lsn_age_factor为当前的(redo比例*100)/max_modified_age_async

2.    根据脏页计算比例(pct_for_dirty),当innodb_max_dirty_pages_pct_lwm设置为0时,和以前的行为类似,如果脏页比例大于innodb_max_dirty_pages_pct时,pct_for_dirty设置为100,否则如果脏页比大于innodb_max_dirty_pages_pct_lwm,pct_for_dirty值为

(dirty_pct * 100)/( innodb_max_dirty_pages_pct+1)

3.    最近innodb_flushing_avg_loops次平均刷脏页的数量,同时还考虑上次统计时候的平均数量,再除以2

avg_page_rate= ((sum_pages / srv_flushing_avg_loops) + avg_page_rate) / 2

另外也会计算lsn的刷新速率

lsn_rate= (cur_lsn – prev_lsn) / srv_flushing_avg_loops;

lsn_avg_rate= (lsn_avg_rate + lsn_rate) / 2;

 

然后根据上述两个值计算要刷新的page数:

pct_total = ut_max(pct_for_dirty, pct_for_lsn);

n_pages = (PCT_IO(pct_total) + avg_page_rate) / 2;

if (n_pages > srv_max_io_capacity) {

n_pages =srv_max_io_capacity;

}

除了脏页的数量外,还要确定一个lsn下限值(lsn_limit),oldest_modification小于lsn_limit的block需要被刷新掉,其计算方式也受参数innodb_flushing_avg_loops影响:

每innodb_flushing_avg_loops次循环,计算

lsn_rate = (cur_lsn – prev_lsn) /srv_flushing_avg_loops;

lsn_avg_rate = (lsn_avg_rate + lsn_rate) / 2;

lsn_avg_rate表示LSN最近的平均推进速率

然后计算lsn_limit:

if (last_pages && cur_lsn – last_lsn >lsn_avg_rate / 2) {

age_factor= prev_pages / last_pages;

}

lsn_limit = oldest_lsn + lsn_avg_rate * (age_factor +1)

prev_pages表示上一次刷新时,试图刷的page数,last_pages表示上次实际刷新的page数,age_factor总是大于等于1的。

Oldest_lsn表示当前bp中的最老LSN.

 

在确定了需要刷新的page数及哪些Page需要被刷新后,就可以调用函数page_cleaner_do_flush_batch-> buf_flush_list做实际的操作了。

 

innodb_flush_log_at_timeout #每隔这么多秒刷一次日志,只有在innodb_flush_log_at_trx_commit=2时才生效.在master线程中判断,见函数srv_sync_log_buffer_in_background,在两个函数中会调用:

1.srv_master_do_active_tasks

2.srv_master_do_idle_tasks

从命名也可以理解,master线程在系统繁忙及空闲时,都会去做判断。在5.6的master线程函数srv_master_thread中,每sleep 1秒,会根据当前的系统负载是否繁忙去调用上面这两个函数,相比之前的函数,master线程函数要清爽很多了。每隔innodb_flush_log_at_timeout秒,会调用log_buffer_sync_in_background(TRUE)去刷日志。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
缓存 关系型数据库 MySQL
MySQL慢查询优化策略
MySQL慢查询优化是一个复杂的过程,需要根据具体的应用场景和数据特点进行。以上策略是提升数据库查询性能的有效途径,但最关键的是对系统进行持续的监控和分析,及时发现并解决性能瓶颈。通过实践这些策略,你可以显著提高MySQL数据库的性能,为用户提供更快的响应时间和更好的体验。
632 10
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
823 66
|
缓存 关系型数据库 MySQL
MySQL执行计划选择策略:揭秘查询优化的艺术
【10月更文挑战第15天】 在数据库性能优化中,选择最优的执行计划是提升查询效率的关键。MySQL作为一个强大的关系型数据库管理系统,提供了复杂的查询优化器来生成执行计划。本文将深入探讨如何选择合适的执行计划,以及为什么某些计划更优。
532 2
|
缓存 关系型数据库 MySQL
降低MySQL高CPU使用率的优化策略。
通过上述方法不断地迭代改进,在实际操作中需要根据具体场景做出相对合理判断。每一步改进都需谨慎评估其变动可能导致其他方面问题,在做任何变动前建议先在测试环境验证其效果后再部署到生产环境中去。
457 6
|
缓存 关系型数据库 MySQL
在MySQL中处理高并发和负载峰值的关键技术与策略
采用上述策略和技术时,每个环节都要进行细致的规划和测试,确保数据库系统既能满足高并发的要求,又要保持足够的灵活性来应对各种突发的流量峰值。实施时,合理评估和测试改动对系统性能的影响,避免单一措施可能引起的连锁反应。持续的系统监控和分析将对维护系统稳定性和进行未来规划提供重要信息。
576 15
|
缓存 关系型数据库 MySQL
MySQL数据库性能调优:实用技术与策略
通过秉持以上的策略实施具体的优化措施,可以确保MySQL数据库的高效稳定运行。务必结合具体情况,动态调整优化策略,才能充分发挥数据库的性能潜力。
885 0
|
关系型数据库 MySQL 大数据
大数据新视界--大数据大厂之MySQL 数据库课程设计:MySQL 数据库 SQL 语句调优的进阶策略与实际案例(2-2)
本文延续前篇,深入探讨 MySQL 数据库 SQL 语句调优进阶策略。包括优化索引使用,介绍多种索引类型及避免索引失效等;调整数据库参数,如缓冲池、连接数和日志参数;还有分区表、垂直拆分等其他优化方法。通过实际案例分析展示调优效果。回顾与数据库课程设计相关文章,强调全面认识 MySQL 数据库重要性。为读者提供综合调优指导,确保数据库高效运行。
|
监控 关系型数据库 MySQL
Aurora MySQL负载突增应对策略与优化方案
通过以上策略,企业可以有效应对 Aurora MySQL 的负载突增,确保数据库在高负载情况下依然保持高性能和稳定性。这些优化方案涵盖了从架构设计到具体配置和监控的各个方面,能够全面提升数据库的响应速度和处理能力。在实际应用中,应根据具体的业务需求和负载特征,灵活调整和应用这些优化策略。
384 22
|
关系型数据库 MySQL 中间件
MySQL 中如何实现分库分表?常见的分库分表策略有哪些?
在MySQL中,分库分表(Sharding)通过将数据分散到多个数据库或表中,以应对大量数据带来的性能和扩展性问题。常见策略包括:哈希分片(分布均匀,查询效率高)、范围分片(适合范围查询)、列表分片(适用于特定值查询)、复合分片(灵活性高)和动态分片(灵活应对负载变化)。每种策略各有优劣,需根据业务需求选择。常用工具如MyCAT、ShardingSphere和TDDL可简化实现过程。
|
SQL 关系型数据库 MySQL
MySQL中外键的使用及外键约束策略
这篇文章讨论了MySQL中使用外键的重要性,包括外键的概念、不使用外键可能导致的问题、如何设置外键约束以及不同的外键约束策略(如CASCADE和SET NULL),并通过示例演示了这些概念。
MySQL中外键的使用及外键约束策略

热门文章

最新文章

推荐镜像

更多