synch/mutex/innodb/temp_pool_manager_mutex
当会话等待获取用于管理会话临时表空间池的互斥锁时,会发生 synch/mutex/innodb/temp_pool_manager_mutex 等待事件。
支持的引擎版本
以下引擎版本支持此等待事件信息:
-
Aurora MySQL 版本 3
上下文
Aurora MySQL 3.x 版及更高版本使用 temp_pool_manager_mutex 控制同时访问临时表空间池的多个会话。Aurora MySQL 通过 Aurora 集群卷管理永久性数据的存储和临时文件的本地存储。当会话在 Aurora 集群卷上创建临时表时,需要临时表空间。
当会话首次请求临时表空间时,MySQL 会从共享池中分配会话临时表空间。对于以下表类型,一个会话一次最多可以容纳 2 个临时表空间:
用户创建的临时表
优化程序生成的内部临时表
默认 TempTable 引擎使用以下溢出机制来处理临时表:
-
在 RAM 中存储不超过
temptable_max_ram限制的表。 -
RAM 已满时移至本地存储上的内存映射文件。
-
当内存映射文件达到其
temptable_max_mmap限制时,使用共享集群卷。
在临时表超过 RAM 和本地存储限制后,MySQL 会使用磁盘上的表空间对其进行管理。
当会话需要磁盘上的临时表时,MySQL 会:
-
在池中查找可供重复使用的可用
INACTIVE表空间。 -
如果不存在
INACTIVE空间,则创建 10 个新的表空间。
当会话断开连接时,MySQL 会:
-
截断会话的临时表空间。
-
在池中将它们标记为非活动状态以供重复使用。
-
保持当前池大小,直到服务器重启。
-
重启后恢复到默认池大小(10 个表空间)。
等待次数增加的可能原因
导致发生此等待事件的常见情形:
在集群卷上创建内部临时表的并发会话。
在集群卷上创建用户临时表的并发会话。
使用活动表空间的会话突然终止。
在繁重的写入工作负载期间扩展表空间池。
访问
INFORMATION_SCHEMA.的并发查询。
操作
根据等待事件的原因,我们建议采取不同的操作。
监控和优化临时表使用情况
要监控和优化临时表的使用情况,请使用以下方法之一:
-
在性能详情中查看
Created_tmp_disk_tables计数器,以跟踪在整个 Aurora 集群中创建的磁盘上临时表。 -
在数据库中运行此命令以直接监控临时表的创建:
mysql> show status like '%created_tmp_disk%'。
注意
Aurora MySQL 读取器节点和写入器节点之间的临时表行为有所不同。有关更多信息,请参阅 Aurora MySQL 版本 3 中的新临时表行为。
确定创建临时表的查询后,请执行以下优化步骤:
-
使用
EXPLAIN检查查询执行计划并确定创建临时表的位置和原因。 -
尽可能修改查询以减少临时表的使用量。
如果仅靠查询优化并不能解决性能问题,请考虑调整以下配置参数:
-
temptable_max_ram- 控制临时表的 RAM 使用量上限。 -
temptable_max_mmap- 设置内存映射文件存储限制。 -
tmp_table_size- 启用 aurora_tmptable_enable_per_table_limit时适用(默认禁用)。
重要
请注意,无论配置设置如何,某些查询条件都将始终需要磁盘上的临时表。有关 TempTable 存储引擎的更多信息,请参阅 Use the TempTable storage engine on Amazon RDS for MySQL and Amazon Aurora MySQL
使用 INFORMATION_SCHEMA 审核查询
当您查询 INFORMATION_SCHEMA 表时,MySQL 会在集群卷上创建 InnoDB 临时表。每个会话都需要一个用于存放这些表的临时表空间,这可能会在高并发访问期间导致性能问题。
为提高性能,请执行以下操作:
-
尽可能使用
INFORMATION_SCHEMA代替PERFORMANCE_SCHEMA。 -
如果必须使用
INFORMATION_SCHEMA,请降低运行这些查询的频率。
增大 innodb_sync_array_size 参数
innodb_sync_array_size 参数控制 MySQL 中互斥锁/锁定等待数组的大小。1 的默认值适用于一般工作负载,但增大默认值可以减少高并发期间的线程争用。
当您的工作负载显示等待线程数量不断增加时:
-
监控工作负载中等待线程的数量。
-
将
innodb_sync_array_size设置为等于或大于实例的 vCPU 计数,以拆分线程协调结构并减少争用。
注意
要确定您的 RDS 实例上可用的 vCPU 数量,请参阅 Amazon RDS 实例类型
实施连接池
MySQL 会为每个创建临时表的会话分配一个专用的表空间。在数据库连接终止之前,此表空间一直处于活动状态。为了更有效地管理您的资源,请执行以下操作:
-
实现连接池以限制活动临时表空间的数量。
-
重复使用现有连接,而不是为每个操作创建新连接。