`
丁林.tb
  • 浏览: 799243 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

InnoDB中Adaptive hash index存在问题、Percona改进及一个bug

阅读更多

背景
  Adaptive hash index  (AHI) 是InnoDB中用于加速索引查找的一个结构。InnoDB本身不支持hash索引,所有的索引检索都走B树查询。AHI可以认为是“索引的索引”。当对一个页面的访问次数满足一定条件后,将这个页面的地址存在一个hash表中,下次查询可以直接访问到页面,不需要走B树查询。

问题
  天下没有免费的午餐,在加速查询的同时,AHI与其他缓存结构一样,也面临维护的问题。作为一个全局结构,在更新时必然有一个全局锁操作(btr_search_latch),一个查询里面可能会对其作多次加x_lock操作。

 

Percona的改进
    如同Buffer Pool可以用多个instance减少锁冲突,Percona也用类似的策略来处理AHI的锁问题。由于本身就是Hash结构,这个处理既自然又方便。所有的数据节点都必然属于一个索引,AHI就用索引id来作分区的key(block->index->id).计算规则为(index_id % btr_search_index_num), 这个 btr_search_index_num 就是 Percona中引入的只读参数 innodb_adaptive_hash_index_partitions。
  全局的btr_search_latch则分为btr_search_index_num 份,AHI中每个block中新增一个成员指向 btr_search_latch_part[i].

 

淘汰流程
  缓存结构必然还涉及一个淘汰流程,大致逻辑如下:
  a)x_lock(block->btr_search_latch);
  b)从hash表中删除这个page信息
  c)x_unlock

  但因为并非所有的page都在AHI中, 若所有的页面操作都作这个处理,则会导致很多额外的锁冲突(x_lock排他),因此需要一个“预判断“的流程。
  简单的判断流程是
  a) s_lock(block->btr_search_latch);
  b) 判断block->index是否为空
  c) 若为空则unlock后直接返回(说明没有在AHI中)
  ….
  (后续流程不表)

 

预判流程逻辑
  这个预判断流程在 btr_search_index_num =1时是没有问题的,但当btr_search_index_num>1时,由于block->btr_search_latch是可变的,也就说存在一种状态,在线程A访问这个锁的时候,线程B刚好把某个page替换掉,甚至于会将这个block用于缓存另外一个page。这样线程A就”锁错了“
  由于存在这种中间状态,在Percona现在的实现上面是通过double-check,在加锁之后作了若干判断,若出现上述的情况,则重试。代码在函数(btr_search_drop_page_hash_index)中

retry:
          if (btr_search_index_num > 1) {
                rw_lock_t*      btr_search_latch;

                /* FIXME: This may be optimistic implementation still. */
                btr_search_latch = (rw_lock_t*)(block->btr_search_latch);
                if (UNIV_LIKELY(!btr_search_latch)) {
                        if (block->index) {
                                goto retry;
                        }   
                        return;
                }   
                rw_lock_s_lock(btr_search_latch);
                if (UNIV_LIKELY(btr_search_latch != block->btr_search_latch)) {
                        rw_lock_s_unlock(btr_search_latch);
                        goto retry;
                }   
                if (UNIV_LIKELY(!block->index)) {
                        rw_lock_s_unlock(btr_search_latch);  //(*)
                        goto retry;
                }   
                index = block->index;
                ut_a(btr_search_latch == btr_search_get_latch(index->id));
         }

 

其中行(*)也是一种中间状态,表示这个block刚刚淘汰掉。因为这些状态被认为是出现在其他线程在AHI中作淘汰操作时出现的,因此多次重试可以认为是等待其他线程完成。

 

BUG描述
但在实现上却漏考虑了一个背景,就是虽然innodb_adaptive_hash_index_partitions是只读变量,但AHI确是可以动态开关的。当用户调用 set global innodb_adaptive_hash_index=off时,会将所有的block.index清空。虽然AHI被关闭后,不会再有“淘汰”的逻辑,但page从LRU list中被淘汰的时候,还是必须得调用btr_search_drop_page_hash_index的,上面的代码逻辑仍会走到(*)行。在这个线程中就出现了死循环,从客户端看,就是查询线程等待。


复现步骤
  1、设置my.cnf中
    innodb_adaptive_hash_index_partitions=8
    innodb_buffer_pool_size=32M
 
  2、souce ahi_loop.txt;
  
 现象是客户端出现等待,即使客户端取消该查询,但仍然占用一个cpu(死循环),若多次重试,CPU IDLE会跌为0

 

简单修改是在关闭AHI的时候,将block->index设置为NULL的同时,加一句 block->btr_search_latch = NULL;

1
1
分享到:
评论

相关推荐

    percona-data-recovery-tool-for-innodb-0.5.tar.tar

    percona-data-recovery-tool-for-innodb-0.5.tar.tar

    mysql 5.7 Percona Server

    MySQL 5.7 Percona Server 是一个针对 MySQL 数据库服务器的增强版本,旨在提供更高效、更稳定且功能丰富的数据库管理解决方案。Percona 公司是 MySQL 社区的重要贡献者,他们对 MySQL 进行了优化,尤其注重在高并发...

    介绍 Percona 服务器 XtraDB 和 Xtrabackup

    XtraBackup是Percona开发的一个开源备份工具,是对InnoDB官方热备份工具的一个重新实现。它不仅可以备份InnoDB表,还能够备份MyISAM和Archive存储引擎的表。此外,XtraBackup支持备份MySQL、Percona Server以及...

    MYSQL percona server manual

    Percona Server的特性之一是Percona XtraDB,这是一个InnoDB存储引擎的增强版本,它设计用以在现代硬件上更好地扩展,并包含了许多高性能环境中有用的其他特性。 Percona XtraDB完全向后兼容,因此可以作为标准...

    Percona 服务器与 XtraDB 存储引擎

    这些限制促使了后续版本中对 InnoDB 的持续改进,最终促成了 XtraDB 的诞生,为用户提供了一个更为强大和灵活的存储引擎选择。 综上所述,Percona Server 和 XtraDB 存储引擎结合了 MySQL 的成熟技术和 Percona 的...

    percona手册

    Percona Server 是一个 MySQL 的高性能分支版本,由 Percona 公司开发维护。它在 MySQL 基础上增加了许多性能优化和管理功能,旨在提供更高效稳定的数据存储服务。本文将对 Percona Server 5.5 版本的手册进行深入...

    mysql percona server 官方手册

    Percona XtraDB是InnoDB存储引擎的一个增强版本,它包括一些改进以提升性能和可扩展性。Percona Server 5.6版本使用的就是XtraDB存储引擎,它包含了多项改进,例如增强的并发控制和更大的缓冲池管理。 ### 特性比较...

    percona-toolkit 2.2安装包

    Percona Toolkit 2.2 是一个强大的开源工具集,专为MySQL数据库管理和优化设计。它由Percona公司提供,该公司是MySQL和MongoDB服务领域的领导者。这个安装包包含了多个实用工具,可以帮助数据库管理员进行性能调优、...

    mysql innodb恢复数据工具.rar

    这是我从网上找到的mysql/mariadb对innodb表进行数据恢复的工具,实现从innodb的数据库文件中恢复数据,用于实现下面情况:1、直接下载了innodb数据库的文件,而不是导出其数据,想恢复数据时(需要有完整的文件,...

    zabbix_percona模板

    Percona是MySQL的一个高性能分支,尤其在大数据量、高并发的场景下表现出色。本文将详细介绍如何利用Zabbix的"zabbix_percona模板"来有效地监控Percona数据库。 一、模板介绍 "zabbix_percona模板"是一款专为Zabbix...

    InnoDB 中文参考手册

    MySQL 的企业级解决方案,高实用性以及强健的数据完整性 MySQL 事务,行级锁定,热备份以及外键支持 - - 无需损失 MySQL 的高速性能 ...InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。

    percona-server-Percona-Server-8.0.32-24.tar.gz

    这个压缩包"percona-server-Percona-Server-8.0.32-24.tar.gz"包含了Percona Server的8.0.32-24版本,这是一个基于MySQL 8.0的重大改进版。 Percona Server的核心特点在于其增强的性能和可扩展性。它采用了XtraDB...

    percona toolkit安装包(rpm)3.0.13 linux

    这里提到的是Percona Toolkit的3.0.13版本,这是一个稳定且功能丰富的版本。 首先,我们来详细了解一下Percona Toolkit的主要组件及其用途: 1. **pt-online-schema-change**:这个工具允许你在不停止MySQL服务的...

    MySQL内核:InnoDB存储引擎 卷1.pdf.zip

    7. **自适应哈希索引(Adaptive Hash Index)**:InnoDB会根据查询模式自动创建哈希索引,提升热点数据的查询速度。 8. **空间索引(Spatial Index)**:InnoDB支持空间索引,可以处理地理空间数据,适用于GIS应用...

    percona xtrabackup英文原版参考手册

    文档包含了一个详细的索引和表格,方便用户快速查找相关信息。 Percona XtraBackup的特点包括: 1. 快速可靠的备份完成。 2. 在备份过程中保持事务处理的连续性。 3. 节省磁盘空间和网络带宽。 4. 自动备份验证。 ...

    InnoDB源码解析

    InnoDB是一个提供了ACID事务支持的存储引擎,它在MySQL中被广泛使用,特别是在事务性数据库系统中。InnoDB为表提供了行级锁定和外键约束的特性,并且通过MVCC(多版本并发控制)机制支持高并发读写操作。 2. InnoDB...

    percona插件.zip

    Percona是MySQL数据库生态系统中的一个关键角色,以其高性能、高可用性和优化工具而闻名。Percona插件通常指的是Percona Monitoring and Management (PMM)的一部分,这是一个全面的开源解决方案,用于监控和管理...

    Percona XtraBackup 8.0.13 文档

    总之,Percona XtraBackup 8.0.13是一个针对MySQL数据库的备份解决方案,它提供了强大的功能,并且随着MySQL技术的演进,它也不断地更新和调整以保证兼容性和最佳实践。在使用此工具时,用户需要特别注意备份兼容性...

    percona-toolkit-3.0.4

    3. **pt-query-digest**: 这是一个强大的查询分析工具,可以从日志文件中收集慢查询,并对其进行排序、分析和报告,帮助DBA识别并优化性能瓶颈。 4. **pt-upgrade**: 检查MySQL服务器上的表是否能在较新版本的MySQL...

Global site tag (gtag.js) - Google Analytics