Amazon Redshift 查询超过了我设置的 WLM 超时

上次更新时间:2019 年 11 月 18 日

我为 Amazon Redshift 查询设置了 WLM 超时,但此时段过期后查询还在运行。为什么会发生这种情况?

简短描述

WLM 超时仅适用于执行阶段的查询。若 WLM 未在预期时间终止查询,通常是因为该查询处于执行以外的阶段。例如,查询可能等待被解析或重写,在锁定状态等待,等待 WLM 队列中的某个点,到达返回阶段,或跳到其他队列。

解决方法

当查询 STV_RECENTS 时,starttime 指的是该查询进入集群的时间,而不是它开始执行的时间。当查询在 STV_RECENTS 中处于 Running 状态时,它是系统中的实时查询。但在进入 STV_INFLIGHT 前,该查找不会使用计算节点资源。如需关于查询计划的更多信息,见查询计划和执行工作流程。要查看正在执行的查询的状态,查询 STV_INFLIGHT,而不是 STV_RECENTS:

select * from STV_INFLIGHT where query = your_query_id;

使用此查询以了解关于查询阶段的更多信息:

select * from SVL_QUERY_REPORT where query = your_query_id ORDER BY segment, step, slice;

使用此查询以了解查询的当前执行状态:

select * from STV_EXEC_STATE where query = your_query_id ORDER BY segment, step, slice;

以下是某查询运行时间长于 WLM 超时时段的部分常见原因:

查询处于“返回”阶段

有两个“返回”步骤。检查 STV_EXEC_STATE 以查看查询是否已进入其中一个返回阶段:

  • 从计算节点返回至领导节点
  • 从领导节点返回至客户端

正在回滚

如果某数据操作语言 (DML) 操作发生错误并回滚,则该操作表面上不会被终止,因为它正在回滚。您可以通过查询 STV_EXEC_STATE 以查看回滚。如需更多信息,见 STL_UNDONE

查询在执行前花时间排队

查询 STV_WLM_QUERY_STATE 以查看排队时间:

select * from STV_WLM_QUERY_STATE where query = your_query_id;

查询在锁定状态等待

如果查询在 STV_RECENTS 中可见,但在 STV_WLM_QUERY_STATE 中不可见,可能是因为该查询正在锁定状态等待,而未进入队列。使用与下述类似的查询检查进程被卡在哪个锁定状态等待:

select * from SVV_TRANSACTIONS
where granted='f'
and pid in (select pid from STV_RECENTS where query = stuck_query_id);

使用与下述类似的查询确定阻止查询的进程:

select b.* from SVV_TRANSACTIONS b, SVV_TRANSACTIONS w
where b.granted='t'
and w.granted = 'f'
and b.txn_db = w.txn_db
and b.relation = w.relation
and w.pid in (select pid from STV_RECENTS where query = stuck_query_id);

要了解关于阻止进程(如它目前正在运行的查询)的更多信息,运行与下述类似的查询:

select * from STL_QUERY where pid =  pid_of_blocking_process;
        
select * from SVL_STATEMENTTEXT where pid = pid_of_blocking_process;

要终止被卡住的查询,或终止阻止它运行的进程,运行与下述类似的查询。如需更多信息,见 PG_TERMINATE_BACKEND

select pg_terminate_backend(process_or_query_id);

查询跳到其他队列

如果某读取查询达到其当前 WLM 队列的超时限制,或者如果有指定跳转操作的查询监控规则,则该查询被推送到下一个 WLM 队列执行。要确认查询是否跳到下一个队列:

要防止查询跳到其他队列,配置 WLM 查询监控规则。如需关于队列跳转的更多信息,见 WLM 查询队列跳跃

网络或防火墙问题

如果 Amazon Redshift 服务器在与您的客户端通信时遇到问题,服务器可能会卡在 "return to client" 状态。检查与网络组件的冲突,如入站本地防火墙设置、出站安全组规则,或出站网络 ACL 规则。如需更多信息,见从 Amazon EC2 外部进行连接—防火墙超时问题

集群问题

集群本身的问题,如硬件问题,可能导致查询挂起。在这种情况下,集群处于 hardware-failure 状态。要恢复一个单节点集群,请从快照还原集群。在多节点集群中,故障节点会被自动替换。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助吗?