为什么我在 Amazon Redshift 领导节点上看到 CPU 使用率很高?

上次更新时间:2020 年 12 月 15 日

我的 Amazon Redshift 集群的领导节点的 CPU 利用率很高。为什么会发生这种情况?

简短描述

您的 Amazon Redshift 集群的领导节点会解析和开发执行计划,以执行数据库操作。领导节点还会执行查询的最终处理以及数据的合并或排序,然后再将数据返回给客户端。根据数据库操作的复杂程度或资源密集程度,集群的领导节点的 CPU 利用率可能会出现峰值。

特别是,您的领导节点的 CPU 利用率可能会出现峰值,原因如下:

  • 数据库连接增加
  • 查询编译和重新编译
  • 并发连接数量大
  • WLM 中运行的并发查询数量大
  • 仅领导节点功能和目录查询

注意:您无法检查占用领导节点的特定进程。使用 STV_RENETS 表检查在特定时间运行的查询。

解决方案

数据库连接增加

客户端服务器通过领导节点与 Amazon Redshift 集群进行通信。如果数据库连接数量不断增加,则为了处理这些连接,CPU 利用率会提高。检查 Amazon CloudWatch 指标,确保未超过 DatabaseConnections 限制。

查询编译和重新编译

Amazon Redshift 为每个查询执行计划生成和编译代码。查询编译和重新编译是资源密集型操作,可能会导致领导节点的 CPU 使用率提高。但是,查询编译或重新编译操作完成后,CPU 性能应恢复正常。

此外,Amazon Redshift 还会缓存编译的代码。提交查询后,Amazon Redshift 会在重新编译剩余区段的同时重新使用任何可用区段。因此,此过程可能会导致领导节点的 CPU 使用率提高。

注意:Amazon Redshift 集群重新启动后,之前查询的缓存仍可以保留。如果您的查询之前已被缓存,Amazon Redshift 将不会执行查询。应用补丁程序时,所有缓存都将被移除。

要检查每个查询段的编译时间(以秒为单位)和区段执行位置,请使用 SVL_COMPILE 系统视图:

select userid,xid,pid,query,segment,locus,starttime, endtime,
datediff(second,starttime,endtime) as TimetoCompile,compile from svl_compile;

并发连接数量大

连接越多可能导致 Amazon Redshift 集群的并发性提高和事务量增加。事务量的增加可能会导致领导节点的 CPU 利用率提高。

要检查并发连接,请运行以下查询:

select s.process as process_id,
c.remotehost || ':' || c.remoteport as remote_address,
s.user_name as username,
s.starttime as session_start_time,
s.db_name,
i.starttime as current_query_time,
i.text as query 
from stv_sessions s
left join pg_user u on u.usename = s.user_name
left join stl_connection_log c
on c.pid = s.process
and c.event = 'authenticated'
left join stv_inflight i 
          on u.usesysid = i.userid
          and s.process = i.pid
where username <> 'rdsdb'
order by session_start_time desc;

然后,使用 PG_TERMATE_BACKEND 关闭所有活动会话。

WLM 中运行的并发查询数量大

所有客户端连接都通过领导节点进行处理。在将数据返回到客户端服务器之前,Amazon Redshift 的领导节点会解析、优化和编译查询。领导节点还会将任务分配给计算节点,执行最终排序或聚合。在查询并发性高的情况下,在领导节点级别的 CPU 使用率可能会增加。此外,某些数据库操作只能在领导节点级别应用。例如,带有 LIMIT 子句的查询可能会占用较高的 CPU,因为在重新分配数据之前,该限制会应用于领导节点。

要确认并发查询数与 CPU 使用率之间是否存在关联,请查看 Amazon CloudWatch 中的 WLMRunningQueriesCPUutilization 指标。

然后,检查哪些查询占用较高的 CPU:

SELECT userid, query, xid, aborted,
ROUND(query_cpu_time::decimal,3),
query_execution_time,
segment_execution_time,
substring(querytxt,1,250)
FROM stl_query
JOIN
(SELECT query,
query_cpu_time,
query_execution_time,
segment_execution_time
FROM svl_query_metrics_summary
ORDER BY 2 DESC) a USING (query)
WHERE userid>1
AND starttime BETWEEN '2019-12-02 22:00:00' and '2019-12-05 23:59:59'
ORDER BY 5 DESC;

查看输出以确认领导节点处理哪些查询以及增加 CPU 使用率的任何其他异常值查询。

注意: 调优查询的查询性能是最佳做法。考虑提高领导节点容量并选择大型节点类型(而不是添加更多计算节点)。

仅领导节点功能和目录查询

Amazon Redshift 旨在实现领导节点上支持的某些 SQL 函数。如果存在具有领导节点功能的复杂查询和过载目录查询,则领导节点上的 CPU 利用率可能会出现峰值。有关详细信息,请参阅领导节点上支持的 SQL 函数

要确定引用目录表的步骤(这些步骤仅在领导节点上执行),请检查 EXPLAIN 计划:

explain select * from pg_class;
                           QUERY PLAN                          
----------------------------------------------------------------
 LD Seq Scan on pg_class  (cost=0.00..24.57 rows=557 width=243)

检查输出中的 LD 前缀。在此示例中,LD 前缀显示在“pg_class 上的 LD Seq 扫描 (cost=0.00..24.57 rows=557 width=243)”中。LD 前缀表示查询仅在领导节点上运行,这可能会导致 CPU 使用率出现峰值。</p


这篇文章对您有帮助吗?


您是否需要账单或技术支持?