适用版本
OceanBase 数据库 V3.x 版本。
问题描述
在对 OceanBase 集群维监控发现 OBServer 服务器 swap 使用空间不断上涨。OBServer 进程不断使用 swap 空间,已达 20g+。需要排查服务器 buffer/cache 可用内存足够的情况下,为什么 OBServer 进程不断使用 swap 空间。
环境与配置信息:
- OceanBase 数据库版本为:3.2.3-bp9-hotfix2。
- OBServer 节点 64c512g,操作系统为麒麟 v10sp3,鲲鹏 920 arm。 已开启 NUMA 并关闭透明大页,并配置了 swap 空间。
- OBServer 内存参数设置 memory_limit_percetage=90,操作系统内核参数 swappiness=0。
- swappiness=0 表示尽可能地使用物理内存,而不使用交换区,并不是禁用 swap。
问题原因
swap 使用率高,是因为在 NUMA 架构下,默认的内存分配是 localalloc 策略,优先是从本地 node 进行分配内存的,本地 node 内存不足时,如果开启了 swap,优先是交换内存到 swap,而不是向其他 node 申请内存。这是 localalloc 策略的劣势。
尤其是数据库系统服务器,对于这种系统来说,单一的进程在不同的时间段,对于内存的消耗是不一样的。比如进程刚开始申请内存的时候,本地 node 内存还有空余,且初始需要申请的内存可能不多,而当进程在运行的过程中,可能需要处理大量的数据导致该进程需要大量的内存,本地 node 的内存剩余也不多,此时因为是 localalloc 策略,从而导致 swap 的产生。
即便 swap 空间使用满了,也不会对 observer 有影响。开启 NUMA 后,CPU 和内存会做绑定,本地 node 进行分配内存的,本地内存不足时,如果开启了 swap,优先是交换内存到 swap,而不是向其他 node 申请内存,swap 满了还是可以向其它 node 申请的。
开启 NUMA 后,每个 CPU 可以使用的内存减少了,所以 swap 也用得比较多;关闭 NUMA 后,CPU 可以使用所有的 memory,所以没用上 swap。原理上这个现象是符合预期的。
解决方法
swap 空间频繁使用,对服务器性能会有影响。OceanBase 数据库标准交付服务器初始化时,要求关闭 swap 空间。