当我激活性能详情时,我的数据库实例显示大量平均活动会话 (AAS) 正在同步 (SYNCH) 等待事件状态下等待。我想提高我的数据库实例的性能。
简短描述
性能详情中的 MySQL SYNCH 等待事件发生在多个数据库会话同时访问相同的受保护对象或内存结构时。在 Amazon Relational Database Service (Amazon RDS) for MySQL、Amazon RDS for MariaDB 和 Amazon Aurora MySQL 兼容版中,以下对象受到保护:
- 二进制日志源实例中的活动二进制日志文件,包含每次只允许一个会话对其进行读取或写入的互斥锁。
- 受保护的数据字典,用于数据控制语言 (DCL) 或数据定义语言 (DDL) 语句的写入操作。
- 自适应哈希索引,包含每次只允许一个会话对其进行读取或写入的互斥锁。
- 打开的表缓存,只允许一个会话在该缓存中添加或删除表。
- InnoDB 缓冲池中的每个数据库块,每次只有一个会话可以修改内存中块的内容。
解决方法
确保数据库实例有足够的 CPU 资源来管理工作负载
大量等待 SYNCH 事件的会话会导致 CPU 使用率过高。当使用率达到 100% 时,正在等待的会话数量会增加。要解决此问题,请增加数据库实例的大小,以便有足够的 CPU 来处理额外的工作负载。
由于 SYNCH 事件通常不会持续很长时间,因此 Amazon CloudWatch 指标 CPUUtilization 可能无法正确显示峰值使用率。该指标仅具有 60 秒粒度。要检查峰值使用率,请使用 Amazon RDS 控制台的增强监控中的一秒粒度计数器。
增加 MySQL 互斥锁或锁定等待阵列
MySQL 使用内部数据结构来协调线程,默认阵列大小为 1。此配置适用于单 CPU 计算机,但在拥有多个 CPU 的计算机上可能会导致问题。如果您的工作负载有大量等待线程,请增加阵列大小。修改 MySQL 的 innodb_sync_array_size 参数,使其等于或大于 CPU 的数量。有关详细信息,请参阅 MySQL 网站上的 innodb_sync_array_size。
**注意:**MySQL 仅在数据库启动时使用 innodb_sync_array_size 参数。
减少并发
通常,并行性可以提高吞吐量。但是,当大量会话运行相同或类似的活动时,这些会话必须有权访问相同的受保护对象。会话数量越多,您在等待时使用的 CPU 就越多。
要解决此问题,请将活动分散到不同的时间,或按顺序计划这些活动。您还可以将多个操作捆绑到单个语句中,例如多行插入。
根据等待事件对问题进行故障排除
根据您收到的等待事件执行以下故障排除操作。
synch/rwlock/innodb/dict sys RW lock 或 synch/rwlock/innodb/dict_operation_lock
当您同时调用大量并发 DCL 或 DDL 时,将会发生这些事件。要解决这些问题,请减少应用程序在常规应用程序活动期间对 DDL 的依赖。
synch/cond/sql/MDL_context::COND_wait_status
当大量 SQL(包括 SELECT)访问 DCL 或 DDL 正在修改的表时,将会发生此事件。要解决此问题,请勿在常规应用程序活动期间对高流量表运行 DDL 语句。
synch/mutex/sql/LOCK_open 或 synch/mutex/sql/LOCK_table_cache
当您的会话打开的表数量超过表定义缓存或表打开缓存的大小时,将会发生这些事件。要解决此问题,请增加缓存的大小。有关详细信息,请参阅 MySQL 网站上的 10.4.3.1 How MySQL opens and closes tables。
synch/mutex/sql/LOG
当数据库运行大量当前日志记录方法不支持的语句时,将会发生此事件。如果您使用的是 TABLE 输出方法,请改用 FILE。如果您使用的是常规日志,请改用 Aurora 中的高级审计。如果您将 long_query_time 参数设置为 0 或小于 1 的值,请增加该值。
synch/mutex/innodb/buf_pool_mutex、synch/mutex/innodb/aurora_lock_thread_slot_futex 或 synch/rwlock/innodb/index_tree_rw_lock
当大量相似的数据操作语言 (DML) 语句同时访问同一个数据库对象时,将会发生这些事件。要解决此问题,请使用多行语句和分区将工作负载分散到不同的数据库对象上。
synch/mutex/innodb/aurora_lock_thread_slot_futex
当一个会话锁定某行以进行更新,然后另一个会话尝试更新该行时,将会发生此事件。根据您收到的其他等待事件对此问题进行故障排除。查找并响应导致此等待事件的 SQL 语句,或者查找并响应阻止会话。
synch/cond/sql/MYSQL_BIN_LOG::COND_done、synch/mutex/sql/MYSQL_BIN_LOG::LOCK_commit 或 synch/mutex/sql/MYSQL_BIN_LOG::LOCK_log
当您激活二进制日志记录,且存在以下情况时,将会发生这些事件:提交吞吐量较高、正在提交大量事务或大量副本正在读取二进制日志。要解决此问题,请使用多行语句或将多个语句组合到单个事务中。
有关 Aurora MySQL 兼容版等待事件的详细信息,请参阅使用等待事件优化 Aurora MySQL 和 Aurora MySQL 等待事件。
最佳做法是将数据库升级到与 8.0 或更高版本兼容的主要版本。如果可能,请使用多行语句,或者将多个语句组合到单个事务中。在 Aurora 中,使用 Aurora Global Database 而非二进制日志复制,或者使用 aurora_binlog 参数。
相关信息
在 Amazon RDS 上使用性能详情监控数据库负载
Amazon RDS 的参数组