背景
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;
相关推荐
percona-data-recovery-tool-for-innodb-0.5.tar.tar
MySQL 5.7 Percona Server 是一个针对 MySQL 数据库服务器的增强版本,旨在提供更高效、更稳定且功能丰富的数据库管理解决方案。Percona 公司是 MySQL 社区的重要贡献者,他们对 MySQL 进行了优化,尤其注重在高并发...
XtraBackup是Percona开发的一个开源备份工具,是对InnoDB官方热备份工具的一个重新实现。它不仅可以备份InnoDB表,还能够备份MyISAM和Archive存储引擎的表。此外,XtraBackup支持备份MySQL、Percona Server以及...
Percona Server的特性之一是Percona XtraDB,这是一个InnoDB存储引擎的增强版本,它设计用以在现代硬件上更好地扩展,并包含了许多高性能环境中有用的其他特性。 Percona XtraDB完全向后兼容,因此可以作为标准...
这些限制促使了后续版本中对 InnoDB 的持续改进,最终促成了 XtraDB 的诞生,为用户提供了一个更为强大和灵活的存储引擎选择。 综上所述,Percona Server 和 XtraDB 存储引擎结合了 MySQL 的成熟技术和 Percona 的...
Percona Server 是一个 MySQL 的高性能分支版本,由 Percona 公司开发维护。它在 MySQL 基础上增加了许多性能优化和管理功能,旨在提供更高效稳定的数据存储服务。本文将对 Percona Server 5.5 版本的手册进行深入...
Percona XtraDB是InnoDB存储引擎的一个增强版本,它包括一些改进以提升性能和可扩展性。Percona Server 5.6版本使用的就是XtraDB存储引擎,它包含了多项改进,例如增强的并发控制和更大的缓冲池管理。 ### 特性比较...
Percona Toolkit 2.2 是一个强大的开源工具集,专为MySQL数据库管理和优化设计。它由Percona公司提供,该公司是MySQL和MongoDB服务领域的领导者。这个安装包包含了多个实用工具,可以帮助数据库管理员进行性能调优、...
这是我从网上找到的mysql/mariadb对innodb表进行数据恢复的工具,实现从innodb的数据库文件中恢复数据,用于实现下面情况:1、直接下载了innodb数据库的文件,而不是导出其数据,想恢复数据时(需要有完整的文件,...
Percona是MySQL的一个高性能分支,尤其在大数据量、高并发的场景下表现出色。本文将详细介绍如何利用Zabbix的"zabbix_percona模板"来有效地监控Percona数据库。 一、模板介绍 "zabbix_percona模板"是一款专为Zabbix...
MySQL 的企业级解决方案,高实用性以及强健的数据完整性 MySQL 事务,行级锁定,热备份以及外键支持 - - 无需损失 MySQL 的高速性能 ...InnoDB 是 MySQL 上第一个提供外键约束(FOREIGN KEY constraints)的表引擎。
这个压缩包"percona-server-Percona-Server-8.0.32-24.tar.gz"包含了Percona Server的8.0.32-24版本,这是一个基于MySQL 8.0的重大改进版。 Percona Server的核心特点在于其增强的性能和可扩展性。它采用了XtraDB...
这里提到的是Percona Toolkit的3.0.13版本,这是一个稳定且功能丰富的版本。 首先,我们来详细了解一下Percona Toolkit的主要组件及其用途: 1. **pt-online-schema-change**:这个工具允许你在不停止MySQL服务的...
7. **自适应哈希索引(Adaptive Hash Index)**:InnoDB会根据查询模式自动创建哈希索引,提升热点数据的查询速度。 8. **空间索引(Spatial Index)**:InnoDB支持空间索引,可以处理地理空间数据,适用于GIS应用...
文档包含了一个详细的索引和表格,方便用户快速查找相关信息。 Percona XtraBackup的特点包括: 1. 快速可靠的备份完成。 2. 在备份过程中保持事务处理的连续性。 3. 节省磁盘空间和网络带宽。 4. 自动备份验证。 ...
InnoDB是一个提供了ACID事务支持的存储引擎,它在MySQL中被广泛使用,特别是在事务性数据库系统中。InnoDB为表提供了行级锁定和外键约束的特性,并且通过MVCC(多版本并发控制)机制支持高并发读写操作。 2. InnoDB...
Percona是MySQL数据库生态系统中的一个关键角色,以其高性能、高可用性和优化工具而闻名。Percona插件通常指的是Percona Monitoring and Management (PMM)的一部分,这是一个全面的开源解决方案,用于监控和管理...
总之,Percona XtraBackup 8.0.13是一个针对MySQL数据库的备份解决方案,它提供了强大的功能,并且随着MySQL技术的演进,它也不断地更新和调整以保证兼容性和最佳实践。在使用此工具时,用户需要特别注意备份兼容性...
3. **pt-query-digest**: 这是一个强大的查询分析工具,可以从日志文件中收集慢查询,并对其进行排序、分析和报告,帮助DBA识别并优化性能瓶颈。 4. **pt-upgrade**: 检查MySQL服务器上的表是否能在较新版本的MySQL...