部署内存设置问题

在 linux 下部署集群时,启动时会得到这个提示。但是实际上我的可用(available)内存是大于预设内存的,只是 free 小于预设内存的。所以我想请教下,这个 memory_limit 的判断依据是什么?


比如下面这个内存用量(数值与上述部署无关的截图),memory_limit 是根据什么指标来判断的呢?

image

1 个赞

如果是设置的百分比内存参数,会按照你的total占比计算

我是用的固定值,比如: memory_limit: 10G / system_memory: 4G。我确认了下,按照程序可用内存来看,是够这个值的。但是它提示的内存不够,而且它提示的free 值也不知道是怎么计算出来的。和我 free -m 查看的结果不一样。

你的主机是8GB内存,你是把memory_limit:10GB 了吗?
扩下内存,OB不能按MYSQL的思路来。

不是哦,我主机内存是12G的。上面那个图是示例来的。这还不够吗?


在 8G 内存上设置 memory_limit: 7G, 它提示我不够。
在 12G 内存上设置 10G, 它提示我不够。
在 16G 内存上设置 10G,这个时候不提示了。

这是怎么计算的?我上面什么都没运行,linux 也只用了 700M而已,请问它是会受 available 影响吗?

你看过OB的内存分配原理吗?如图

我已经看过这个章节,但是我感觉这个无法解释我上面提到的这个问题。它没有解释它是如何判断 OS 内存的呢?它只是说从 memrory_limit 之后的内存划分处理。这个我没啥疑问的。


至于ce内存使用百分比还是固定值,这里我使用的固定值,所以我想它应该不会遵从百分比的计算策略。固定值内存的判断有哪个地方有说明吗?至少我从配置项上看不到这方面的详细说明。

我是遵照这个说明来进行总内存配置的。感觉应该完全满足内存需求的。但是会收到上述 WARN。

OceanBase 的内存管理机制会根据 system_memorymemory_reserved 等参数预留一部分内存,即使 Linux 的 available 内存看起来充足,也可能因为这些预留值导致 memory_limit 设置失败。在小内存环境下,可以通过降低 system_memorymemory_reserved 的值来适配。

1 个赞

好吧,其实我已经将所有内存配置项都看了一个遍,但是仍旧出现这个问题所以我比较奇怪,其实当我把OS内存调节的足够大(距离 memory_limit 差值足够大),这个时候不会出现 WARN,所以我就推测 ce 可能会计算一些我目前不知道的内存结构来进行判断检查,与你的说法基本一样。其实,我只是想知道能不能有一些明确的配置项能确定这个边界。

不过,影响其实也不大,至少我可以控制配置值来影响这个行为就不会出现这个提示。非常感谢~

1 个赞

obd 报错的时候,如果你能发一下 free -h ,你的疑问自然就有答案了。

在资源不足的机器上(假设你是测试环境)确实经常有这种问题。
可以运行这个命令释放一部分文件系统缓存。也许 obd 就不提示资源不足了(前提是你的资源是足的)
命令:sysctl -w vm.drop_caches=3

[root@server63 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            32G         15G        4.4G        1.9G         12G        5.8G
Swap:            0B          0B          0B
[root@server63 ~]# sysctl -w vm.drop_caches=3
vm.drop_caches = 3
[root@server63 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            32G         15G         14G        1.9G        2.2G         10G
Swap:            0B          0B          0B
1 个赞

我在不释放任何东西时, available 就已经超过了 memory_limit 了。这个时候给警告,才是我奇怪的原因。不是资源不够,而是资源看起来是够的,但是还是提示了。有点奇怪吧。

由此推断程序OBD看的是 free 部分内存,不看 available

学习一下

本来我是第一次反应是这样的,但是后来发现不对,比如:当OS内存 8G 的时候, free 2G,memory_limit 设置为6G。启动后警告是显示可用内存为 6G,预设内存为6G(就是 memory_limit =6G), 内存不足。这个可用内存为 6G 是怎么算出来的,有点迷迷的。


预设内存必须小于可用内存,所以出现这个告警是没问题的,但是这个可用内存的数值是咋算的? :thinking:

是free剩余内存空间,如果你的剩余空间不足的话,是会有问题的