内存修剪
在某些工作负载下,glibc 会累积其分配区域中的大量可用内存。该内存消耗由常驻集大小 (RSS) 指示的物理内存,glibc 并不总是将物理内存返回给操作系统。glibc 对物理内存的高保留(glibc 内存膨胀)会对其他进程产生不利影响,并且在高工作负载下,有时会导致 Vertica 内存不足。
Vertica 提供了两个配置参数,让您可以控制 Vertica 检测和合并由 glibc 分配的大量可用内存的频率,然后将其返回给操作系统:
-
MemoryPollerTrimThreshold
:设置内存轮询器开始检查是否修剪glibc
所分配内存的阈值。内存轮询器将
MemoryPollerTrimThreshold
(默认设置为 0.83)与以下表达式进行比较:RSS / available‑memory
如果此表达式的计算结果大于
MemoryPollerTrimThreshold
,则内存轮询器开始检查下一个阈值(在MemoryPollerMallocBloatThreshold
中设置)是否存在 glibc 内存膨胀。注意
在存在非典型的超高 Vertica RSS 值的高内存计算机上,请考虑为MemoryPollerTrimThreshold
设置更高的设置。要关闭自动修剪,请将此参数设置为 0。 -
MemoryPollerMallocBloatThreshold
:设置 glibc 内存膨胀的阈值。内存轮询器将调用 glibc 函数
malloc_info()
,以获取 malloc 中的空闲内存量。然后它将MemoryPollerMallocBloatThreshold
(默认设置为 0.3)与以下表达式进行比较:free‑memory‑in‑malloc / RSS
如果此表达式的计算结果大于
MemoryPollerMallocBloatThreshold
,内存轮询器将调用 glibc 函数malloc_trim()
。此函数从 malloc 中回收空闲内存,并将其返回给操作系统。调用malloc_trim()
的详细信息将写入系统表MEMORY_EVENTS
。例如,当满足以下条件时,内存轮询器调用
malloc_trim()
:-
MemoryPollerMallocBloatThreshold
设置为 0.5。 -
malloc_info()
返回 malloc 中的 15GB 可用内存。 -
RSS 为 30GB。
注意
如果MemoryPollerTrimThreshold
设置为 0(禁用),则忽略此参数。 -
手动修剪内存
如果禁用自动修剪,您可以通过调用 Vertica 函数
MEMORY_TRIM
手动减少由 glibc 分配的内存。此函数调用 malloc_trim()
。