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

2 分钟阅读
0

我的 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 使用率出现峰值。


AWS 官方
AWS 官方已更新 2 年前