内存修剪

在某些工作负载下,glibc 会累积其分配区域中的大量可用内存。该内存消耗由常驻集大小 (RSS) 指示的物理内存,glibc 并不总是将物理内存返回给操作系统。glibc 对物理内存的高保留(glibc 内存膨胀)会对其他进程产生不利影响,并且在高工作负载下,有时会导致 Vertica 内存不足。

Vertica 提供了两个配置参数,让您可以控制 Vertica 检测和合并由 glibc 分配的大量可用内存的频率,然后将其返回给操作系统:

  • MemoryPollerTrimThreshold:设置内存轮询器开始检查是否修剪 glibc 所分配内存的阈值。

    内存轮询器将 MemoryPollerTrimThreshold(默认设置为 0.83)与以下表达式进行比较:

    RSS / available‑memory
    

    如果此表达式的计算结果大于 MemoryPollerTrimThreshold,则内存轮询器开始检查下一个阈值(在 MemoryPollerMallocBloatThreshold 中设置)是否存在 glibc 内存膨胀。

  • 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。

手动修剪内存

如果禁用自动修剪,您可以通过调用 Vertica 函数 MEMORY_TRIM 手动减少由 glibc 分配的内存。此函数调用 malloc_trim()