我的 Amazon Redshift 查询设置了 WLM 超时,但该时间到期后,查询仍在运行。为什么?

WLM 超时仅适用于执行阶段的查询。如果在规定的时间限制内 WLM 看似无法终止查询,出现故障的原因通常是查询在非执行阶段花费了一些时间。例如,查询可能等待被解析或重写、等待锁定、等待 WLM 队列中的位置、恰遇返回阶段或者跳转到另一个队列。

查询 STV_RECENTS 时,starttime 是查询进入群集的时间,而不是开始执行查询的时间。如果查询在 STV_RECENTS 中处于正在运行状态,则表明其在系统中活动,但未使用任何计算节点资源,直到查询进入 STV_INFLIGHT 状态。有关查询计划的更多信息,请参阅查询计划和执行工作流程。要查看正在执行的查询的状态,请查询 STV_INFLIGHT 而不是 STV_RECENTS:

select * from STV_INFLIGHT where query = <queryid>;

使用以下查询可了解有关查询阶段的更多信息:

select * from SVL_QUERY_REPORT where query = <queryid> ORDER BY segment, step, slice;

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

select * from STV_EXEC_STATE where query = <queryid> 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 = <queryid>;

查询正在等待锁定

如果查询在 STV_RECENTS 中可见,但在 STV_WLM_QUERY_STATE 中不可见,可能是该查询正在等待锁定,而尚未进入队列。使用如下查询可查找卡住的进程正在等待的任何锁定:

select * from SVV_TRANSACTIONS

where granted='f'

and pid in (select pid from STV_RECENTS where query = );

使用如下查询可帮助识别阻塞进程:

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 = );

要查找有关可能的阻塞 PID (例如,当前正在运行的查询) 的更多信息,请运行如下查询:

select * from STL_QUERY where pid = ;

select * from SVL_STATEMENTTEXT where pid = ;

要终止卡住的查询,或者终止您怀疑正在阻塞查询的进程,请运行如下查询:

select pg_terminate_backend(pid);

查询已跳转到另一个队列

如果读取查询达到其当前 WLM 队列的超时限制或者某个查询监控规则指定了跳转操作,则系统会将该查询推送到下一个 WLM 队列执行。您可以确认该查询是否已跳转,方法是在查询正在运行时使用 STV_WLM_QUERY_STATE,或者在查询执行完毕后使用 STL_WLM_QUERY。要阻止查询跳转到另一个队列,可以配置 WLM 查询监控规则以中止 WLM 队列中的操作。有关查询队列跳转的更多信息,请参阅 WLM 查询队列跳转

联网或防火墙问题

如果 Amazon Redshift 服务器与客户端的通信存在问题,该服务器可能会卡在如上所述的“返回客户端”状态。检查与联网组件是否存在会阻止流量流向服务器的冲突,包括本地入站防火墙设置、出站安全组规则或者出站网络 ACL 规则。有关更多信息,请参阅从 Amazon EC2 外部进行连接 - 防火墙超时问题

群集存在问题

群集本身存在问题 (例如硬件问题) 可能会导致查询挂起,不过这很少见。在 Amazon Redshift 控制台中检查群集状态是否为硬件-故障状态。如果群集处于该状态并且是单节点群集,请从快照恢复群集。对于多节点群集,应自动更换故障节点。


此页面对您有帮助吗? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS 支持中心

发布时间:2017 年 4 月 11 日

更新时间:2018 年 2 月 26 日