Redshift WLM 配置:如何使用未分配的内存?

Redshift WLM config: how is unallocated memory used?

定义Redshift查询队列时,可以分配分配给每个队列的内存比例。因此,例如,如果您有 5 个队列,您可以为每个队列分配 20% 的内存。但是,您还允许分配内存,使其一部分保持未分配状态。

在本文档中: http://docs.aws.amazon.com/redshift/latest/dg/cm-c-defining-query-queues.html 它说, “任何未分配的内存都由 Amazon Redshift 管理,如果队列请求额外的内存进行处理,可以临时将其分配给队列。 例如,如果配置四个队列,则可以按以下方式分配内存:20%、30%、15%、15%。剩余的 20% 未分配并由服务管理。"

在文档的前面,它说, "If a specific query needs more memory than is allocated to a single query slot, you can increase the available memory by increasing the wlm_query_slot_count parameter. The following example sets wlm_query_slot_count to 10, performs a vacuum, and then resets wlm_query_slot_count to 1."

这与内存分配有关吗?是否可以使用查询槽计数调整来暂时消耗比整个队列正常允许的更多内存?

我想我的问题实际上是关于第一句话的这一部分,"Any unallocated memory is managed by Amazon Redshift and can be temporarily given to a queue if the queue requests additional memory for processing."

这是否意味着用户 运行 查询必须专门请求额外的内存?这是否意味着除非您提出这些特定请求,否则保留一些未分配的内存是没有用的?

wlm_query_slot_count和队列的内存分配这两个概念是不一样的。

例如,当您将集群的并发级别指定为 20 时,您将创建 20 个执行槽。如果这些较小的槽(与默认较大的 5 个槽相比)对于某些查询(例如 VACUUM 或更大的报告)来说太小了,您可以使用 wlm_query_slot_count 为这些特定查询提供多个槽而不是一个槽。

根据 CPU、IO 和 RAM 分配给各个插槽的资源不必统一,因为您可以为某些队列提供比其他队列更多的内存,因为发送到的查询这个队列需要更多内存。当您看到更多查询在计算期间 运行 内存不足时溢出到磁盘时,您可以知道需要更多内存。

对于您 运行ning 的每个查询,Redshift 将根据您正在访问的列以及您在这些列上应用的函数来估计内存需求(这是另一个很好的理由列定义尽可能窄)。如果 WLM 有未分配的内存,它可以将其中的一些分配给需要它的查询。

然而,当您创建此类队列定义时,您缺少集群灵活性,无法将资源分配给查询。例如,您可能会创建一个完全拥塞的队列,而其他队列则处于空闲状态并浪费集群资源。因此,请谨慎操作,并监控这些队列的使用情况,以验证您确实在提高集群优先级和性能,而不是对其造成伤害。

简短的回答是 - wlm_query_slot_count 和未分配内存内存管理是两个不同的正交事物。

将 wlm_query_slot_count 视为 Excel 中的单元格合并。如果您有 5 个单元格(一个队列中有 5 个槽位),则默认情况下每个文本只能占用 1 个单元格(1 个槽位)。通过为查询 显式设置 wlm_query_slot_count ,您是在告诉 Redshift 合并那段文本(查询)的单元格(槽)。因此,如果您将 wlm_query_slot_count 设置为 3,则此特定查询将占用 3 个槽位,就像决定将长文本分散到 Excel 中的 3 个合并单元格中一样。

从队列管理的角度来看,就好像有人已经占用了 3 个位置。所以只有 2 个 1-slot 查询被允许进入队列,其他人都必须等待。

在内存方面,queue整体上有固定的内存分配,在slot之间平均分配。所以如果整个队列有 100GB 的内存,5 个插槽,每个插槽将获得 20GB。在此队列中获得 3 个插槽的查询将获得 60GB。

并且 "unallocated memory management" 与之正交 - 无论插槽和队列如何,如果需要内存并且未分配,Redshift 可以自行决定将其提供给任何查询(我认为措辞"if the queue requests additional memory" 具有误导性),通常基于 plan/table 统计数据。