调查高 CPU 利用率

本页面介绍如何使用 CPU 利用率指标、图表以及其他自检工具调查数据库中的高 CPU 使用率。

确定系统或用户任务是否会导致 CPU 利用率过高

Cloud Console 为 Cloud Spanner 提供了多种监控工具,可让您查看实例最重要的指标的状态。其中一种图表是 CPU 利用率 - 高优先级。该图表显示了高优先级任务的 CPU 利用率与单区域和多区域实例的建议最大 CPU 利用率。任务有两种类型:用户任务(例如读取和写入),以及系统任务,如执行备份和压缩。

如需区分此图表中的任务类型,请执行以下操作:

  1. 点击图表上的更多图表选项图标。

  2. 选择在 Metrics Explorer 中查看

  3. 在 Metrics Explorer 中,将 is_system 添加到分组依据选项。此时,图表会显示按系统任务和用户任务细分的 CPU 用量。

图 1 显示了高优先级 CPU 利用率的图表示例。

高优先级 CPU 利用率的图表示例

图 1.Cloud Console 的 Monitoring 信息中心内的高优先级 CPU 利用率图表。

现在,假设您收到 Cloud Monitoring 发出的关于 CPU 使用率已显著增加的提醒。在 Cloud Console 中打开实例的 Monitoring 信息中心,并在 Metrics Explorer 中打开 CPU 利用率 - 高优先级图表来检查它。如图 1 所示,您可以看到高优先级 CPU 利用率增加,并且通过查看 is_system 的值,您确定高峰由用户任务引起。下一步是找出哪些用户操作会导致 CPU 使用率增加。

识别哪些用户操作会导致 CPU 利用率高峰

图 1 中的 CPU 利用率 - 高优先级图表显示,高优先级用户任务是 CPU 使用率较高的原因。

接下来,我们将通过使用 Cloud Monitoring Metrics Explorer 创建图表来检查 CPU 利用率(按操作类型)指标。此图表会显示按用户发起的高优先级操作细分的 CPU 利用率。

什么是用户发起的操作?

用户发起的操作是通过 API 请求启动的操作。Cloud Spanner 会将这些请求分成各操作类型或类别,然后我们可以在按操作类型分类的 CPU 利用率图表上将各项操作类型显示为一行。下表介绍了每种操作类型中包含的 API 方法。

操作 API 方法 说明
read_readonly 读取
StreamingRead
包括使用键查询和扫描从数据库中提取各行的读取操作。
read_readwrite 读取
StreamingRead
包括读写事务内的读取。
read_withpartitiontoken 读取
StreamingRead
包括使用一组分区令牌执行的读取操作。
executesql_select_readonly ExecuteSql
ExecuteStreamingSql
包含执行 Select SQL 语句。
executesql_select_readwrite ExecuteSql
ExecuteStreamingSql
包括在读写事务中执行 Select Select 语句。
executesql_select_withpartitiontoken ExecuteSql
ExecuteStreamingSql
使用一组分区令牌执行执行 Select 语句。
executesql_dml_readwrite ExecuteSql
ExecuteStreamingSql
ExecuteBatchDml
包括执行 DML SQL 语句。
executesql_dml_partitioned ExecuteSql
ExecuteStreamingSql
ExecuteBatchDml
包括执行分区 DML SQL 语句。
beginorcommit BeginTransaction
Commit
Rollback
包括开始、提交和回滚事务。
misc PartitionQuery
PartitionRead
GetSession
CreateSession
包括分区查询、分区读取、创建数据库、创建实例、会话相关操作、内部时效性服务操作等。

在 Metrics Explorer 中,按操作类型创建 CPU 利用率图表

  1. 在 Cloud Console 中,选择 Monitoring 或使用如下按钮:

    转至 Monitoring

  2. 在导航窗格中选择 Metrics Explorer
  3. Find resource type and metric(查找资源类型和指标)字段中,输入值 spanner.googleapis.com/instance/cpu/utilization_by_operation_type ,然后选择该框下方显示的行。
  4. 过滤字段中,输入值 instance_id,然后输入要检查的实例 ID,并点击>应用
  5. 分组依据字段中,从下拉列表中选择 category。该图表将显示按任务类型(或类别)分组的用户任务的 CPU 利用率。

以下是按操作类型分类的 CPU 利用率指标的示例图表。

按操作类型分类的 CPU 利用率图表示例

图 2:Metrics Explorer 中的按操作类型分类的 CPU 利用率图表。

每种操作类型(或类别)在折线图上绘制。图表下方的类别过滤器标识了每张图。您可以通过选中或取消选中相应类别的过滤条件来隐藏和显示各图。

因此,虽然前面部分中按优先级划分的 CPU 利用率指标有助于确定是用户任务还是系统任务导致 CPU 资源使用率增加,但通过按操作类型划分的 CPU 利用率,我们可以深入挖掘并了解这次 CPU 使用率增长背后用户发起的操作类型。

确定哪个用户请求导致 CPU 使用率增加

要确定哪个特定用户请求会导致 图 2executesql_select_readonly 操作类型图中的 CPU 利用率高峰的情况,我们将使用内置的自检统计信息表获取更多数据洞见。

以下表为指导,您可以根据导致高 CPU 使用率的操作类型确定要查询哪些统计信息表。

操作类型 查询 读取 事务
read_readonly
read_readwrite
read_withpartitiontoken
executesql_select_readonly
executesql_select_withpartitiontoken
executesql_select_readwrite
executesql_dml_readwrite
executesql_dml_partitioned
beginorcommit

例如,如果 read_withpartitiontoken 存在问题,请使用读取统计信息进行问题排查。

在我们的场景中,executsql_select_readonly 操作似乎是我们观察到的 CPU 使用率增加的原因。根据上表,我们应该查看查询统计信息,以了解哪些查询成本高、频繁运行或扫描大量数据。

为了查找过去一小时内 CPU 使用率最高的查询,我们对 query_stats_top_hour 统计信息表格运行以下查询。

SELECT text,
       execution_count AS count,
       avg_latency_seconds AS latency,
       avg_cpu_seconds AS cpu,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY total_cpu DESC;

输出将显示按 CPU 使用率排序的查询。我们确定 CPU 使用率最高的查询后,就可以尝试用以下选项对其进行调整。

  • 查看查询执行计划,确定任何可能导致高 CPU 利用率的低效。

  • 请检查您的查询,确保其符合 Cloud Spanner 的 SQL 最佳做法

  • 查看数据库架构设计并更新架构,以实现更高效的查询。

  • 为 Cloud Spanner 在一个时间段内执行查询的次数建立基准。使用此基准,您可以检测和调查偏离正常行为的所有意外偏差的原因。

如果您未设法查找 CPU 密集型查询,请向实例添加节点。 添加节点可以提供更多 CPU 资源,并使 Cloud Spanner 能够处理更大的工作负载。如需了解详情,请参阅添加节点

后续步骤