synch/mutex/innodb/temp_pool_manager_mutex - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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 存储引擎的更多信息,请参阅 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 实例类型中的 vCPU 规格。

实施连接池

MySQL 会为每个创建临时表的会话分配一个专用的表空间。在数据库连接终止之前,此表空间一直处于活动状态。为了更有效地管理您的资源,请执行以下操作:

  • 实现连接池以限制活动临时表空间的数量。

  • 重复使用现有连接,而不是为每个操作创建新连接。