Cloud SQL for MySQL 性能捕获功能可帮助您诊断和解决 MySQL 数据库中因系统需求不断变化而导致的复杂且瞬时的性能问题。随着应用工作负载的扩缩和周围基础设施的日益复杂,数据库面临的需求也越来越高且难以预测。这些外部系统压力可能会导致数据库运行速度减慢或停滞。
当数据库的性能下降时,标准指标可能不足以在更大的基础设施环境中识别根本原因。 性能捕获功能通过在检测到问题时捕获数据库的详细时间点快照来解决此问题。 您可以使用可配置的触发器在发生瞬时问题时拍摄系统级快照。触发器还可以检测长时间运行的事务,这些事务可能是性能问题的根本原因。您可以将触发器配置为自动结束长时间运行的事务。
应用场景示例
本部分列出了在为实例启用性能捕获功能后,如何使用该功能的应用场景示例。
| 使用场景 | 触发条件 | 诊断分析 |
|---|---|---|
| 因撤消日志累积而导致系统级运行速度减慢 | 历史记录列表长度 | 识别 InnoDB 清除进程何时因长时间运行的读取或大型数据操纵语言 (DML) 操作而落后。延迟可能会导致存储压力增加和性能下降。 |
| 由内部引擎争用导致的数据库停滞 | 信号量等待 | 有助于诊断无响应的数据库。 此触发器可以检测 InnoDB 存储引擎中的互斥锁或读写锁争用,例如自适应哈希索引 (AHI) 或缓冲池争用。 |
| 应用级锁争用或未编制索引的查询 | 事务锁等待 | 当大量事务处于 LOCK WAIT 状态时触发,指向行级争用或长时间运行的空闲事务。 |
| 由复杂的排序或聚合导致的实例过载 | 高 CPU 利用率 | 捕获高 容器 CPU 使用率期间的状态,通常 由低效查询 或大规模并发峰值导致。 |
| 内存不足 (OOM) 重启的风险 | 内存用量较高 | 有助于您在每个线程的缓冲区过大或内存泄漏导致实例崩溃之前诊断这些问题。 |
| 流量突然激增或客户端应用出现瓶颈 | 运行中的线程 | 实例负载的一般指标,有助于识别并发活跃连接的突然激增。 |
| 由于写入工作负载过重而导致副本上的数据过时 | 落后于源实例的秒数 | 监控只读副本上的复制延迟,以帮助诊断从主实例同步数据时的延迟。 |
| 长时间运行的查询阻止清除 | 长时间运行的事务 | 识别已打开时间过长且可能持有关键锁的事务。 此外,您 还可以自动结束长时间运行的事务。 |
性能数据的捕获方式
性能捕获功能作为基于代理的服务运行,用于监控您的实例。启用性能捕获功能后, Cloud SQL 实例会执行以下操作来捕获性能数据:
代理会探测您的实例配置,以读取您定义的基于阈值的触发器。然后,代理会以可配置的时间间隔
probingIntervalSeconds探测实例的指标,默认设置为 30 秒。如果检测到问题并且触发器的阈值已超出,则代理会继续将实例的实时状态与您的规则进行比较。为防止因临时峰值而出现误报,代理会触发完整性能捕获。仅当在连续探测配置的
probeThreshold(默认为3)期间满足条件时,才会触发捕获。 此连续阈值可防止因瞬时峰值而触发捕获。例如,如果代理检测到连续三次探测的线程数都较高,则可能会触发性能捕获。
如果配置了多个触发条件,则 Cloud SQL 会在满足任何条件时启动捕获。
触发捕获后,性能捕获功能会连接到数据库并运行一系列诊断命令,以捕获详细快照。
捕获的信息会格式化为日志条目,并直接发送到 Cloud SQL 实例的项目 Cloud Logging,位于名为
mysql-performance-capture.log的特定日志流下。
冷却期和自适应退避期
为防止过度记录日志和系统开销过大,性能捕获功能会在捕获后实施冷却期。
标准冷却期
成功捕获后,性能捕获功能会启动 30 分钟的标准冷却期 。在此期间,即使实例处于长时间的问题状态,代理也不会触发新的捕获。
自适应冷却期和退避
如果实例因同一违规行为而反复触发捕获,则性能捕获功能会使用自适应冷却期退避机制 。 此机制有助于限制日志记录量和错误配置的阈值的费用。
在此机制下:
- 冷却期会延长至 24 小时 。
- 性能捕获功能会进入睡眠模式 ,暂停所有触发器 检查和诊断捕获。
- 实例每天只能进行一次性能捕获。
性能捕获触发器
本部分列出了可用于 MySQL 性能捕获的触发器。除非另有说明,否则表中列出的所有触发器都使用探测配置值 probingIntervalSeconds 和 probeThreshold 来验证持续的触发条件。
| 触发器 条件 名称 | API 名称 | 说明 | 默认 值 | 配置 范围 |
|---|---|---|---|---|
| 高 CPU 利用率 |
cpuUtilizationThresholdPercent
|
当数据库实例的整体 CPU 利用率持续超过此百分比时,触发捕获。 这有助于检测实例过载,通常由具有大量排序和聚合的低效查询、索引不足或并发过高导致。为避免因轻微峰值而触发捕获,请将默认值配置为实例的较高百分比范围。 | 0 (已停用)
|
0,或 10-99 (%) |
| 内存使用率 较高 |
memoryUsageThresholdPercent
|
当数据库容器的内存用量持续超过实例分配内存的此百分比时,触发捕获。此触发器有助于诊断潜在的内存不足问题、内存泄漏或低效的内存配置。为避免捕获轻微峰值,请将默认值设置为实例范围的较高值。 | 0 (已停用)
|
0,或 10-99 (%) |
| 临时文件 使用率较高 |
无法配置。此触发器会自动为 MySQL 8.0 及更高版本启用。 | 当 MySQL 进程创建的临时文件导致磁盘使用量显著增加时,自动触发捕获。
通常,临时文件会被删除,但仍由 MySQL 进程保持打开状态。 此触发器的阈值使用差异阈值的渐进式升级模型。它从 100 GB 开始,在每次冷却期后依次翻倍,达到 200 GB、400 GB,最高可达 1.6 TB。通过使用渐进式升级模型,只有当临时文件使用量的差异大幅增加时,才会发生性能捕获。 |
已启用 | 不适用 |
| 历史记录列表 长度 |
historyListLengthThresholdCount
|
当 InnoDB 历史记录列表 (HLL) 增长超过配置的值时,触发捕获。持续较高的 HLL 表明 InnoDB 清除进程无法跟上,并且未清除的事务数正在增加,通常是由于长时间运行的事务导致的。此高数值可能会导致存储消耗增加和性能问题。 此阈值取决于工作负载。即使 HLL 持续较高,某些实例也可以正常运行。不过,您仍然可以使用此触发器来突出显示潜在问题,例如长时间运行的读取、大型数据操纵语言 (DML) 语句或清除线程瓶颈。 |
0 (已停用)
|
0,或 10000-10000000
|
| 长时间运行的 事务 |
transactionDurationThreshold
|
如果事务运行时间超过配置的秒数,则会记录该事务。此触发器有助于识别可能长时间持有锁或长时间消耗资源的操作。 在 probingIntervalSeconds 配置(默认 30 秒)中指定的每个时间间隔后,系统会对超出 transactionDurationThreshold 的事务进行评估。不过,为管理日志
量,系统最多每
冷却期
(30 分钟)
向
Cloud Logging 发送一次这些
长时间运行的事务的详细信息,最多发送 10 个事务。对于前 10 个事务,每个日志条目中都包含来自 INFORMATION_SCHEMA.INNODB_TRX 的完整查询文本,最多 1024 字节。 |
3600 (秒)
|
60 或更多
|
| 副本 SQL/IO 线程错误 |
无法配置。 此触发器默认在所有副本实例上自动启用,无法停用。 | 如果副本实例上的复制 SQL 线程或 IO 线程遇到任何错误并停止,则立即触发捕获。此触发器对于维护副本完整性和识别复制失败至关重要。 此触发器不使用任何探测配置设置(例如 probingIntervalseconds 或 probeThreshold)来验证性能捕获条件。 |
已启用 | 不适用 |
| 运行中的线程 | runningThreadsThreshold
|
当基于 threads_running 状态变量运行的活跃线程数超过指定值时,触发捕获。例如,您可以将阈值配置为:如果活跃运行线程数超过 100,则运行性能捕获。性能捕获需要此触发器。如果您未明确配置此触发器,则默认值将根据属于实例的 vCPU 数量计算得出。 |
MIN(600,
cpuCount * 20)
|
10 或更多
|
| 落后于 源实例的秒数 |
secondsBehindSourceThreshold
|
当只读副本实例上的复制延迟(以秒为单位)超过指定值时,触发捕获。 您可以使用此触发器来监控和诊断复制延迟。 此触发器会自动为副本实例启用。如果您未明确配置触发器,则默认值为 900 秒。我们建议您将值配置为较高值,以避免过度捕获和频繁冷却。 | 900 (秒)
|
1 或更多
|
| 信号量等待 | semaphoreWaitThresholdCount
|
当等待内部 InnoDB 信号量的线程数超过此触发器的配置值时,触发捕获。此高级指标表示 InnoDB 存储引擎本身内的争用,使用互斥锁或读写锁。
通常观察到的争用包括自适应哈希索引 (AHI) 争用、缓冲池争用和磁盘 IO 争用。 此外,如果任何单个信号量的最长等待时间超过 200 秒,无论此触发器的配置值如何,都会触发捕获。 |
0 (已停用)
|
0,或 10-10000
|
| 事务 锁等待 |
transactionLockWaitThresholdCount
|
当处于 LOCK WAIT 状态的事务数超过配置的计数时,触发捕获。在繁忙的系统中,少量事务处于锁等待状态可能是正常的,但持续大量的锁等待是应用级锁争用、未编制索引的 DML、长时间空闲的事务和高并发行争用的有力指标,这些问题会严重降低性能和吞吐量。 |
0 (已停用)
|
0,或 10-10000
|
价格
性能捕获功能在所有 Cloud SQL 区域均可用,无需额外费用。标准费用仅适用于底层数据库资源。 性能捕获功能将日志存储在 Cloud Logging 中,这可能会产生额外的 Cloud Logging 存储费用。
如需详细了解在 Logging 中存储日志的价格, 请参阅 价格。
限制
- 您必须启用 Query Insights 才能使用性能捕获功能。 如果您停用 Query Insights,则性能捕获功能也会停用。
- 性能捕获功能仅适用于 Cloud SQL for MySQL 5.7 及更高版本。