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
|
如果事务运行时间超过配置的时长(以秒为单位),则系统会记录该事务。此触发器有助于识别可能长时间持有锁或长时间消耗资源的操作。 超过 transactionDurationThreshold 的事务会在 probingIntervalSeconds 配置中指定的每个时间间隔(默认 30 秒)后进行评估。不过,为了管理日志量,这些长时间运行的事务中最多有 10 个事务的详细信息会发送到 Cloud Logging,每个冷却期(30 分钟)最多发送一次。前 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 及更高版本。