[MySQL 5.6] 5.6 新参数innodb_lru_scan_depth 浅析

innodb_lru_scan_depth是5.6新增加的参数,根据官方文档描述,它会影响page cleaner线程每次刷脏页的数量,这是一个每1秒 loop一次的线程。

在Innodb内部,这个参数对应变量为srv_LRU_scan_depth

grep了一把,有几个地方会涉及到这个参数

1.buf/buf0lru.cc 

buf_LRU_free_from_unzip_LRU_list

在扫描bp->unzip_LRU时保证扫描深度不超过srv_LRU_scan_depth,以从其中释放一个压缩块的非压缩页。

在5.5中,则有一个计算公式

    distance = 100 + (n_iterations

              * UT_LIST_GET_LEN(buf_pool->unzip_LRU)) / 5;

n_iterations越大,表示扫描了多次(或者说一次请求空闲块进入这个函数的次数),值不超过5.

buf_LRU_free_from_common_LRU_list

与上述情况类似,但扫描的是bp->LRU。

这两个函数主要用于从LRU获取空闲块(例如free list已空),均有一个参数scan_all,当为true时,表示扫描全部LRU链表,这时候srv_LRU_scan_depth就不起作用了。

我们知道获取空闲块的入口函数是buf_LRU_get_free_block,之前也做过5.5关于这个函数的分析(见http://mysqllover.com/?p=387

 在5.6中,如果free list为空,则

>如果有flush在发生,等待完成并重试

>如果buf_pool->try_LRU_scan为true,则扫描srv_LRU_scan_depth深度的LRU,成功则返回空闲快

>如果上一步失败,iteration=1,扫描整个LRU链表

>如果上一步失败,iteration>1,依然扫描整个LRU链表,但sleep 100000us

2.buf/buf0flu.cc:

这里主要是page cleaner线程调用

buf_flush_page_cleaner_thread  //page cleaner线程入口

|—>buf_flush_LRU_tail 

             |–>扫描LRU,调用srv_LRU_scan_depth/PAGE_CLEANER_LRU_BATCH_CHUNK_SIZE()次buf_flush_LRU函数,每次尝试去处理100个block.划分成chunk的目的是防止用户线程在请求空闲块时等待时间太长

             buf_flush_LRU-> buf_do_LRU_batch 

                 buf_free_from_unzip_LRU_list_batch

                     从buf_pool->unzip_LRU上把非压缩frame移到bp->free上,如果bp->free的长度大于等于srv_LRU_scan_depth会跳出

                 buf_flush_LRU_list_batch

                     和上面的类似,但是从bp->LRU上扫描

   

可见srv_LRU_scan_depth会控制从LRU上清理block并将其放到free list上的扫描深度,不光影响page cleaner线程,也会影响用户线程;

从其作用可以看出,当系统的IO比较空闲的时候,可以适当将这个参数设大,当IO吃紧时,需要适当减小

related bug:

http://bugs.mysql.com/bug.php?id=68481

http://bugs.mysql.com/bug.php?id=68497

related blog:

http://mysqlha.blogspot.com/2013/02/mysql-56-io-bound-update-only-workloads.html

时间: 2024-10-31 04:55:44

[MySQL 5.6] 5.6 新参数innodb_lru_scan_depth 浅析的相关文章

[MySQL 5.6] 5.6新参数 (完全版)

以下列出了MySQL 5.6的一些新参数 || 老参数新功能,有一些的说明只是参照的文档,还没有从代码求证. 这些参数的分类也显示了5.6在不同层面的改进(or regression?) 不定期更新Ing- ///////////////////////////////////////// Server 层参数 Table cache table_open_cache_instances#对table cache进行划分,减少table cache的锁竞争 Meta data lock meta

[MySQL 5.6] MySQL5.6新参数

以下罗列了我所感兴趣的MySQL5.6新参数,不定期更新本文,完善参数的说明,先大概列一下,做简单说明,以后在一个个补上 ///////////////////////////////////////////////  #mysqld table_open_cache_instances #对table cache进行划分,减少锁竞争 metadata_locks_hash_instances # 对server层的metalock hash进行划分, metadata_locks_cache_

[MySQL 5.6] 5.6新参数slave_rows_search_algorithms

我们知道,MySQL有一个老问题,当表上无主键时,那么对于在该表上做的DML,如果是以ROW模式复制,则每一个行记录前镜像在备库都可能产生一次全表扫描(或者二级索引扫描),大多数情况下,这种开销都是非常不可接受的,并且产生大量的延迟. 在MySQL5.6中提供了一个新的参数:slave_rows_search_algorithms, 可以部分解决无主键表导致的复制延迟问题,其基本思路是对于在一个ROWS EVENT中的所有前镜像收集起来,然后在一次扫描全表时,判断HASH中的每一条记录进行更新.

MySQL 8.0.2复制新特性抢鲜看

MySQL 8 正在变得原来越好,而且这也在我们MySQL复制研发团队引起了一阵热潮.我们一直致力于全面提升MySQL复制,通过引入新的和一些有趣的功能.此外,我们还听取了社区的建议和反馈.因此,我们很荣幸能够与你一同见证最新版本(MySQL 8.0.2)的里程碑式的发布,为此我们总结了其中的一些值得注意的变化.跟随我们下面的博客,我们将会分享这些新功能的一些见解. MySQL 8 is shaping up quite nicely. And we are having a blast in

MYSQL性能优化-安装时优化参数配置提高服务性能

安装时优化参数配置提高服务性能 在Linux下安装Mysql采用默认配置安装的Mysql却未必是工作在最佳性能状态的,需要对其进行优化.一般认为在 Mysql的配置文件中,下列系统参数是比较关键的: (1) interactive_timeout : 服务器在关闭它前在一个交互连接上等待行动的秒数.一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户. 默认数值是28800,我把它改为7200. (2) back_log : 要

Go语言1.3版本的go 命令增加很多新参数

Google自家编译型语言Go语言于昨日更新1.3版本 正式版,主要内容是更精确的垃圾回收机制,有效的解决了以前GC回收问题.Go语言是谷歌在2009年发布的一款编译型语言,可以在不损失性能的前提下降低代码复杂率,曾获得TIOBE网站2009年度奖,该奖项奖项授予在2009年市场份额增长最多的编程语言. 其设计是让软件充分发挥多核心处理器同步多工的优点,并可解决面向对象程序设计的麻烦.它具有现代的程序语言特色,如垃圾回收,帮助程序设计师处理琐碎但重要的内存管理问题.Go的速度也非常快,几乎和C或

java-在android中关于onCreate方法新参数问题

问题描述 在android中关于onCreate方法新参数问题 android中onCreate方法新参数(persistableBundle persistentState)是让Activity拥有持久化能力,如何理解这个持久化能力呢? 解决方案 一般我们会搭配两个方法来使用: public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) public void onRestoreI

MySQL性能优化之max_connections配置参数浅析_Mysql

MySQL的max_connections参数用来设置最大连接(用户)数.每个连接MySQL的用户均算作一个连接,max_connections的默认值为100.本文将讲解此参数的详细作用与性能影响. 与max_connections有关的特性 MySQL无论如何都会保留一个用于管理员(SUPER)登陆的连接,用于管理员连接数据库进行维护操作,即使当前连接数已经达到了max_connections.因此MySQL的实际最大可连接数为max_connections+1: 这个参数实际起作用的最大值

MySQL内核月报 2014.08-MySQL· 参数故事·timed_mutexes

提要 MySQL 5.5.39 Release版本正式从源码里删除了全局参数timed_mutexes.timed_mutexes原本用来控制是否对Innodb引擎的mutex wait进行计时统计,以方便进行性能诊断.为什么要删除这个参数呢? 下面介绍下相关背景: Innodb的同步锁机制 Innodb封装了mutex和rw_lock结构来保护内存的变量和结构,进行多线程同步,考虑可移植性, mutex使用lock_word或者OS mutex来保证原子操作,并使用event条件变量进行阻塞和