【发布时间】:2022-07-19 17:15:46
【问题描述】:
我在使用openGauss数据库的MOT特性时,numa_node节点满了,很长时间没有释放。我怎样才能手动释放它?有什么快速的方法吗?
【问题讨论】:
标签: open-gauss
我在使用openGauss数据库的MOT特性时,numa_node节点满了,很长时间没有释放。我怎样才能手动释放它?有什么快速的方法吗?
【问题讨论】:
标签: open-gauss
这个问题很有趣,虽然答案很简短,但需要解释一下。
简答:
VACUUM FULL [MOT_table1];
仅当 MOT 表大小显着减小(可能是周期性地)并且预计在不久的将来不会增长到原来的大小时,这才有用。说明: openGauss MOT具有高度优化的内存管理,欢迎阅读这里关于它的NUMA awareness allocation and affinity和关于MOT Memory Planning的信息。
首先,为了方便快速操作和高效利用NUMA节点,MOT为每个表的行和每个索引的节点分配一个指定的内存池。每个这样的池由 2 MB 卡盘组成。指定的 API 从本地 NUMA 节点、来自所有节点的页面或以循环方式分配这些块,其中每个块都分配在下一个节点上。默认情况下,共享数据池以循环方式分配以平衡访问,而不是在不同的 NUMA 节点之间拆分行。但是,线程专用内存是从本地节点分配的。还必须验证一个线程始终在同一个 NUMA 节点中运行。
其次,MOT 设计期望数据增长,因此一旦将内存块添加到内存池并使用(插入数据),那么在删除行时,内部内存部分将标记为空闲并准备好重新使用,并且不会释放回操作系统。
手动激活的 VACUUM 命令可以优化内存块内和内存块之间的行分布,将它们移动到密集的内存块中,并将剩余的内存块释放给操作系统。
【讨论】: