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