WLM 查询监控规则
在 Amazon Redshift 工作负载管理 (WLM) 中,查询监控规则为 WLM 查询定义基于指标的性能界限,并指定在查询超出这些界限时需要采取的操作。例如,对于短时间运行查询专用的队列,您可创建取消运行超过 60 秒的查询的规则。要跟踪设计不佳的查询,您可创建记录包含嵌套循环的查询的其他规则。
您将在工作负载管理 (WLM) 配置中定义查询监控规则。您最多可以为每个队列定义 25 个规则,而且所有队列的限制为 25 个规则。每个规则最多包括三个条件 (即,谓词) 和一个操作。谓词 包含指标、比较条件(=、< 或 >)和值。如果满足任何规则的所有谓词,则会触发该规则的操作。可能的规则操作有 log、hop 和 abort,如以下所讨论的。
某个给定队列中的规则只能应用于在该队列中运行的查询。各个规则彼此独立。
WLM 每 10 秒评估一次指标。如果在同一时段内触发了多条规则,WLM 会选择具有最严重操作的规则。如果两条规则的操作具有相同的严重性,WLM 会根据规则名称按字母顺序运行规则。如果操作为 hop 或 abort,则将记录操作且从队列中移出查询。如果操作为 log,则查询将继续在队列中运行。WLM 针对每个规则的每个查询仅启用一个 log 操作。如果队列中包含其他规则,这些规则将保持有效。如果操作为 hop 且将查询路由到其他队列,则将应用新队列的规则。有关对特定查询执行的查询监控和跟踪操作的更多信息,请参阅短查询加速中的示例集。
当满足规则的所有谓词时,WLM 会在 STL_WLM_RULE_ACTION 系统表中写入一行。此外,Amazon Redshift 会将当前运行的查询的查询指标记录到 STV_QUERY_METRICS。已完成的查询的指标存储在 STL_QUERY_METRICS 中。
定义查询监控规则
您创建作为您的 WLM 配置的一部分的查询监控规则,您可将该规则定义为您集群的参数组定义的一部分。
您可使用 AWS Management Console或以编程方式使用 JSON 来创建规则。
注意
如果您选择以编程方式创建规则,强烈建议您使用控制台生成包含在参数组定义中的 JSON。有关更多信息,请参阅《Amazon Redshift 管理指南》中的使用控制台创建或修改查询监控规则和使用 AWS CLI 配置参数值。
要定义查询监控规则,您要指定以下元素:
-
一个规则名称 – 规则名称必须在 WLM 配置内是唯一的。规则名称最多可包含 32 个字母数字字符或下划线,且不能包含空格或引号。您可以让每个队列有最多 25 个规则,并且所有队列的总限制为 25 个规则。
-
一个或多个谓词 – 您最多可以为每个规则设置三个谓词。如果满足任何规则的所有谓词,则会触发关联操作。谓词由指标名称、运算符(=、< 或 >)和值定义。示例是
query_cpu_time > 100000
。有关指标列表以及不同指标值的示例,请参阅本部分中后面的预置的 Amazon Redshift 的查询监控指标。 -
操作 – 如果触发了多个操作,则 WLM 会选择具有最严重操作的规则。可能的操作 (按严重性的升序顺序) 包括:
-
Log – 记录有关 STL_WLM_RULE_ACTION 系统表中查询的信息。在您想要仅写入日志记录时使用 Log 操作。WLM 针对每个规则的每个查询最多创建一个日志。log 操作后,其他规则将保持有效且 WLM 将继续监控查询。
-
Hop(仅适用于手动 WLM)– 记录操作,并让查询跳到下一个匹配的队列中。如果没有其他匹配的队列,则会取消查询。QMR 仅跳过 CREATE TABLE AS (CTAS )语句和只读查询,例如 SELECT 语句。有关更多信息,请参阅 WLM 查询队列跳过。
-
中止 – 记录操作并取消查询。QMR 不会中止 COPY 语句和维护操作,例如 ANALYZE 和 VACUUM。
-
更改优先级(仅适用于自动 WLM)– 更改查询的优先级。
-
要限制查询的运行时,我们建议您创建查询监控规则,而不是使用 WLM 超时。例如,您可以将 max_execution_time
设置为 50,000 毫秒,如以下 JSON 代码段所示。
"max_execution_time": 50000
但我们建议您定义一个等效的查询监控规则。下面的示例演示了将 query_execution_time
设置为 50 秒的查询监控规则:
"rules": [ { "rule_name": "rule_query_execution", "predicate": [ { "metric_name": "query_execution_time", "operator": ">", "value": 50 } ], "action": "abort" } ]
有关创建或修改查询监控规则的步骤,请参阅《Amazon Redshift 管理指南》中的使用控制台创建或修改查询监控规则和 wlm_json_configuration 参数中的属性。
您可以在以下主题中找到有关查询监控规则的更多信息:
预置的 Amazon Redshift 的查询监控指标
下表描述了查询监控规则中使用的指标。(这些指标与存储在 STV_QUERY_METRICS 和 STL_QUERY_METRICS 系统表中的指标不同。)
对于某个给定指标,将在查询级别或段级别跟踪性能阈值。有关段和步骤的更多信息,请参阅查询计划和执行工作流程。
注意
WLM 超时 参数与查询监控规则不同。
指标 | 名称 | 描述 |
---|---|---|
查询 CPU 时间 |
query_cpu_time
|
查询使用的 CPU 时间(以秒为单位)。CPU
time 与 Query execution time 不同。有效值为 0–999,999。 |
数据块读取 |
query_blocks_read
|
查询读取的 1 MB 数据块的数量。 有效值为 0–1,048,575。 |
扫描行数 |
scan_row_count
|
扫描步骤中行的数量。行计数是在筛选标记为删除的行(虚影行)之前和应用用户定义的查询筛选之前发出的行的总数。 有效值为 0–999,999,999,999,999。 |
查询执行时间 |
query_execution_time
|
执行查询所用的时间(以秒为单位)。执行时间不包括在队列中等待的时间。 有效值为 0–86,399。 |
查询队列时间 |
query_queue_time
|
在队列中等待所花的时间(以秒为单位)。 有效值为 0–86,399。 |
CPU 使用率 |
query_cpu_usage_percent
|
查询使用的 CPU 容量的百分比。 有效值为 0–6,399。 |
内存到磁盘 |
query_temp_blocks_to_disk
|
用于写入中间结果的临时磁盘空间(单位为 1 MB 数据块)。 有效值为 0–319,815,679。 |
CPU 偏斜 |
cpu_skew
|
任何切片的最大 CPU 使用率与所有切片的平均 CPU 使用率的比率。此指标在段级别进行定义。 有效值为 0–99。 |
I/O 偏斜 |
io_skew
|
任何切片的最大数据块读取 (I/O) 与所有切片的平均数据块读取的比率。此指标在段级别进行定义。 有效值为 0–99。 |
联接的行 |
join_row_count
|
联接步骤中处理的行数。 有效值为 0–999,999,999,999,999。 |
嵌套循环联接行数 |
nested_loop_join_row_count
|
嵌套循环联接中行的数量。 有效值为 0–999,999,999,999,999。 |
返回行数 |
return_row_count
|
查询返回的行数。 有效值为 0–999,999,999,999,999。 |
段执行时间 |
segment_execution_time
|
执行单个段所用的时间(以秒为单位)。为避免或减少采样错误,请在规则中包括 segment_execution_time
> 10 。有效值为 0–86,388。 |
Spectrum 扫描行数 |
spectrum_scan_row_count
|
Amazon S3 中由 Amazon Redshift Spectrum 查询扫描的数据的行数。 有效值为 0–999,999,999,999,999。 |
Spectrum 扫描大小 |
spectrum_scan_size_mb
|
Amazon S3 中由 Amazon Redshift Spectrum 查询扫描的数据的大小 (MB)。 有效值为 0–999,999,999,999,999。 |
查询优先级 |
query_priority
|
查询的优先级。 有效值为 |
注意
query_queue_time
谓词不支持跳转操作。也就是说,在满足query_queue_time
谓词时,将忽略定义了跳转的规则。-
较短的段执行时间可能会导致某些指标(例如
io_skew
和query_cpu_usage_percent
)出现采样错误。为避免或减少采样错误,请在规则中包括段执行时间。segment_execution_time > 10
是一个好起点。
SVL_QUERY_METRICS 视图显示已完成查询的指标。SVL_QUERY_METRICS_SUMMARY 视图显示已完成查询的指标的最大值。使用这些视图中的值帮助确定用于定义查询监控规则的阈值。
查询 Amazon Redshift Serverless 的监控指标
下表描述了为 Amazon Redshift Serverless 查询监控规则中使用的指标。
指标 | 名称 | 描述 |
---|---|---|
查询 CPU 时间 | max_query_cpu_time |
查询使用的 CPU 时间(以秒为单位)。CPU time 与 Query execution time 不同。有效值为 0–999,999。 |
数据块读取 |
max_query_blocks_read
|
查询读取的 1 MB 数据块的数量。 有效值为 0–1,048,575。 |
扫描行数 |
max_scan_row_count
|
扫描步骤中行的数量。行计数是在筛选标记为删除的行(虚影行)之前和应用用户定义的查询筛选之前发出的行的总数。 有效值为 0–999,999,999,999,999。 |
查询执行时间 | max_query_execution_time |
执行查询所用的时间(以秒为单位)。执行时间不包括在队列中等待的时间。如果查询超出设置的执行时间,Amazon Redshift Serverless 将停止查询。 有效值为 0–86,399。 |
查询队列时间 | max_query_queue_time |
在队列中等待所花的时间(以秒为单位)。 有效值为 0–86,399。 |
CPU 使用率 |
max_query_cpu_usage_percent
|
查询使用的 CPU 容量的百分比。 有效值为 0–6,399。 |
内存到磁盘 |
max_query_temp_blocks_to_disk
|
用于写入中间结果的临时磁盘空间(单位为 1 MB 数据块)。 有效值为 0–319,815,679。 |
联接的行 |
max_join_row_count
|
联接步骤中处理的行数。 有效值为 0–999,999,999,999,999。 |
嵌套循环联接行数 |
max_nested_loop_join_row_count
|
嵌套循环联接中行的数量。 有效值为 0–999,999,999,999,999。 |
注意
max_query_queue_time
谓词不支持跳转操作。也就是说,在满足max_query_queue_time
谓词时,将忽略定义了跳转的规则。-
较短的段执行时间可能会导致某些指标(例如
max_io_skew
和max_query_cpu_usage_percent
)出现采样错误。
查询监控规则模板
当您使用 Amazon Redshift 控制台添加规则时,可以选择从预定义的模板中创建规则。Amazon Redshift 将创建具有一组谓词的新规则,并使用默认值填充这些谓词。默认操作是 log。您可以修改这些谓词和操作以满足您的使用案例。
下表列出了可用的模板。
模板名称 | Predicates | 描述 |
---|---|---|
嵌套循环联接 |
nested_loop_join_row_count > 100
|
嵌套循环联接可能表示未完成的联接谓词,这通常会产生一个非常大的返回集(笛卡尔积)。请使用一个较小的行数以及早找到潜在的失控查询。 |
查询返回了大量的行 |
return_row_count > 1000000
|
如果您将队列指定为简单的短时间运行查询,则可包含查找返回较大行数的查询的规则。该模板使用 100 万个行的默认值。对于某些系统,您可能认为 100 万个行过大,或者在较大型系统中,100 万或更多个行可能过大。 |
与大量的行联接 |
join_row_count > 1000000000
|
涉及异常过大行数的联接步骤可能表示需要更严格的筛选条件。该模板使用 10 亿个行的默认值。对于旨在快速简单查询的临时(一次性)队列,您可使用较小的行数。 |
写入中间结果时占用大量的磁盘空间 |
query_temp_blocks_to_disk > 100000
|
如果当前正在执行的查询使用多个可用的系统 RAM,则查询执行引擎会将中间结果写入磁盘(溢出的内存)。通常,此条件是恶意查询的结果,通常也是使用大部分磁盘空间的查询。磁盘使用率的可接受阈值因集群节点类型和节点数而异。该模板使用 100000 个数据块或 100 GB 的默认值。对于小型集群,您可使用较小的数字。 |
I/O 偏斜高的查询运行时间长 | segment_execution_time > 120 –和–io_skew > 1.30 |
I/O 偏斜发生在一个节点切片具有的 I/O 比率要比其他切片的比率高得多的时候。作为起点,1.30 的偏斜(平均 1.3 倍)被认为较高。高 I/O 偏斜并不总是一个问题,但在与长时间运行的查询结合时,它可能表示分配方式或排序键存在问题。 |
查询监控规则的系统表和视图
当满足规则的所有谓词时,WLM 会在 STL_WLM_RULE_ACTION 系统表中写入一行。此行包含规则所触发查询的详细信息以及所导致的操作。
此外,Amazon Redshift 还将查询指标记录到以下系统表和视图中。
-
STV_QUERY_METRICS 表显示当前正在运行的查询的指标。
-
STL_QUERY_METRICS 表记录已完成的查询的指标。
-
SVL_QUERY_METRICS 视图显示已完成查询的指标。
-
SVL_QUERY_METRICS_SUMMARY 视图显示已完成查询的指标的最大值。