@论坛小助手


这内存机制是什么原理?如何调小啊?

@论坛小助手

1 个赞

根据您的问题和提供的信息,您遇到了内存不足的问题,并希望了解 OceanBase 数据库的内存机制以及如何调整内存配置以减少内存使用。以下是详细的解答:

1. 内存机制原理

根据文档库中的信息(片段 3 和片段 9),OceanBase 数据库的内存管理机制如下:

  • 内存加载与分配:OceanBase 数据库在启动时会加载几个 GB 的内存,并在运行过程中按需逐步申请内存,直到达到 memory_limit
  • 内存释放机制:一旦 OBServer 节点向操作系统申请了内存,通常不会将其释放回操作系统,而是维护在内存管理的使用列表或 Free List 中。
  • LSM-Tree 存储架构:OceanBase 使用 LSM-Tree 存储引擎,将增量数据存储在内存中的 MemTable 中,当内存使用量达到一定阈值时触发 Compaction,将数据转储到磁盘上的 SSTable 并释放活跃内存。

2. 如何调小内存配置

如果您遇到内存不足的问题,可以通过以下方法调整内存配置以减少内存使用:

方法一:调整 memory_limitsystem_memory

  • 错误原因:根据片段 7 和片段 10,内存不足可能是由于 memory_limitsystem_memory 配置不当导致的。
  • 解决方法
    • 使用 obd cluster edit-config <deploy name> 命令打开配置文件,调整 memory_limitsystem_memory 参数。
    • 确保 system_memory 的值小于 memory_limitmemory_limit_percentage * total_memory
    • 推荐范围:memory_limit/3 ≤ system_memory ≤ memory_limit/2

方法二:释放缓存内存

  • 如果存在可以释放的 cached 内存,您可以尝试使用以下命令释放缓存:
    sudo sysctl -w vm.drop_caches=1
    # 或
    sudo echo 1 > /proc/sys/vm/drop_caches
    

方法三:调整租户内存配置

  • 如果需要进一步优化租户内存使用,可以参考片段 5 中的步骤调整租户的 unit_config
    1. 登录 OceanBase 集群的 sys 租户,查询当前租户的 UNIT_CONFIG NAME
      obclient> SELECT NAME FROM DBA_OB_UNIT_CONFIGS;
      
    2. 根据需求修改租户的内存配置:
      obclient> ALTER RESOURCE UNIT test_unit MEMORY_SIZE = '8G';
      

方法四:调整 memory_chunk_cache_size

  • 根据片段 4,设置参数 memory_chunk_cache_size 可以让 OBServer 节点尝试将 Free List 超过该值的内存块还给操作系统,从而提高内存复用率。
  • 配置此参数需要结合具体场景分析,建议与 OceanBase 支持团队沟通后进行调整。

3. 总结

通过调整 memory_limitsystem_memory、释放缓存内存、优化租户内存配置或设置 memory_chunk_cache_size,您可以有效减少 OceanBase 数据库的内存使用。如果问题仍然存在,建议检查节点总内存是否满足最低要求(片段 7 中提到,部署 OceanBase 数据库 4.x 版本时,memory_limit 不低于 6G)。

希望以上信息对您有所帮助!如果仍有疑问,请随时联系 OceanBase 的人工答疑团队获取进一步支持。

具体信息可参考以下文档:

  1. ob_tenant500_mem_hold_percent_over_threshold OB 500 租户内存占用率超限
  2. ob_tenant500_mem_hold_over_threshold OB 500 租户的占用内存大小超限
  3. 产品 FAQ
  4. 在您开始前
  5. 主机规划
  6. 错误码
  7. 通过命令行部署 ODP
2 个赞

根据文档库中的信息,以下是关于 OceanBase 内存机制的原理以及如何调小内存配置的详细解答:

1. 内存机制原理

OceanBase 的内存管理主要依赖以下几个关键配置项:

  • memory_limit:定义了 OBServer 节点的最大可用内存。通常情况下,memory_limit/3 ≤ system_memory ≤ memory_limit/2
  • system_memory:定义了系统租户(sys 租户)的最小内存分配量,必须小于 memory_limitmemory_limit_percentage * total_memory
  • __min_full_resource_pool_mem:在生产模式下,该配置项不能低于规定值。

当部署 OceanBase 集群时,如果机器的可用内存不足,可能会导致启动失败或运行异常。例如,您提供的日志中显示 [WARN] OBD-2000: (Free: 10G, Need: 10G),这表明当前机器的可用内存不足以满足集群的需求。


2. 如何调小内存配置

根据您的问题和文档内容,可以通过以下方法调小内存配置以解决内存不足的问题:

方法一:命令行部署方式

使用 obd cluster edit-config <deploy name> 命令打开配置文件,调整以下参数:

  • 调小 memory_size:适用于租户内存不足的情况。例如:

    obd cluster edit-config myocp
    

    在配置文件中找到相关租户的内存配置项(如 ocp_meta_tenant->memory_sizeocp_monitor_tenant->memory_size),将其值调小。保存后执行命令行中输出的命令使修改生效。

  • 调小 system_memory:如果 system_memory 配置过大,可以将其值调小至合理范围(小于 memory_limit)。例如:

    obd cluster edit-config myocp
    

    修改 system_memory 的值为更小的数值(如从 4G 调整为 2G),然后保存并执行命令行中输出的命令。

方法二:图形化界面部署方式

如果您是通过 OCP 图形化界面部署的集群,可以按照以下步骤操作:

  1. 单击 上一步 返回到 集群配置 页面。
  2. 打开 更多配置,找到 system_memory 或租户相关的内存配置项(如 ocp_meta_tenant->memory_sizeocp_monitor_tenant->memory_size)。
  3. 将这些配置项的值调小至合理范围。
  4. 保存配置并重新启动集群。

3. 其他应急处理方法

如果调小内存配置后仍然无法解决问题,可以尝试以下方法:

  • 释放缓存:使用以下命令释放系统缓存,从而增加可用内存:
    sudo sysctl -w vm.drop_caches=1
    # 或
    sudo echo 1 > /proc/sys/vm/drop_caches
    
  • 重启 OBServer 节点:通过 OCP 界面重启指定节点,具体操作请参考 重启 OBServer 节点

4. 注意事项

  • 最低内存要求:根据 OceanBase 版本的不同,memory_limit 的最低值有所差异:
    • 部署 4.x 之前版本时,memory_limit 不能低于 8G。
    • 部署 4.x 版本时,memory_limit 不能低于 6G。
  • 生产模式限制:如果生产模式开启,则某些配置项(如 __min_full_resource_pool_memmemory_limit)不能低于规定值。

总结

根据您的日志和问题描述,建议优先通过 obd cluster edit-config 命令调小 memory_sizesystem_memory 的值,并确保机器的可用内存满足最低要求。如果仍有疑问,请提供更多上下文信息以便进一步分析。

更多信息请查看:

  1. ob_tenant500_mem_hold_percent_over_threshold OB 500 租户内存占用率超限
  2. ob_tenant500_mem_hold_over_threshold OB 500 租户的占用内存大小超限
  3. 错误码
  4. 系统内存不足/泄漏
1 个赞

继续,内存一共15G , memory_limit建议设置多少适合?

1 个赞

具体启动时候加载几个G的内存呢?

1 个赞

根据文档库中的信息,以下是关于 memory_limit 的建议设置以及 OceanBase 数据库在启动时加载内存的具体情况:

1. memory_limit 的建议设置

  • 总内存为 15G 的情况下:根据片段 9 中的描述,memory_limit 的默认值为 0,表示使用 memory_limit_percentage 来按比例分配内存。如果需要显式设置 memory_limit,建议将其设置为总内存的 60%-80%。
  • 推荐值:对于 15G 的机器,可以将 memory_limit 设置为 9G 到 12G(即 60%-80% 的范围)。例如:
    ALTER SYSTEM SET memory_limit='12G';
    

2. 启动时加载的内存大小

  • 初始加载量:OceanBase 数据库在启动时并不会立即占用所有配置的内存。它会先加载几个 GB 的内存,并在运行过程中逐步申请更多内存,直到达到 memory_limit
  • 具体加载量:根据片段 7 和片段 10 的描述,启动时实际使用的内存取决于以下几个因素:
    • system_memory:系统租户(sys 租户)的最小内存分配量。通常建议设置为 memory_limit/3memory_limit/2
    • 租户内存需求:其他租户的内存需求也会对启动时的内存使用产生影响。
    • 预留内存:为了保证系统的稳定性,OceanBase 会预留一部分内存供操作系统和其他进程使用。

示例计算

假设总内存为 15G,memory_limit 设置为 12G,system_memory 设置为 4G,则:

  • 系统租户(sys 租户)会占用约 4G 的内存。
  • 其他租户和缓存等组件会逐步占用剩余的 8G 内存。
  • 启动时的实际内存使用量可能会略高于 system_memory,但通常不会超过 memory_limit 的一半。

3. 总结

  • memory_limit 建议值:对于 15G 的机器,建议将 memory_limit 设置为 9G 到 12G。
  • 启动时加载的内存大小:启动时实际加载的内存大小主要由 system_memory 和租户内存需求决定,通常不会超过 memory_limit 的一半。

希望以上信息对您有所帮助!如果仍有疑问,请随时联系 OceanBase 的人工答疑团队获取进一步支持。

检索到的文档如下:

  1. memory_limit_percentage
  2. memory_limit
  3. 内存相关参数
  4. 产品 FAQ
  5. memstore_limit_percentage

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

1 个赞

楼主可以参考一下这个地址,如果没有启动ob server 就可以参照本地址修改memory_limit 参数
[ERROR] OBD-2000错误,修改demo的配置文件中的"memory_limit"不生效 - 社区问答- OceanBase社区-分布式数据库

机器15G的话,memory_limit分配10G,system_memory分配2G,除去sys租户内存,可供业务租户新建分配内存大约还有5G

总结一下我修改内存的小白经历:
使用 ocp界面修改参数后10g改为8G, obd cluster restart myocp 参数没生效,ocp显示的和参数文件config.yaml 数值的不一致。
然后呢 obd cluster stop myocp +obd cluster sart myocp 重新加载参数 也是报错need 10G(这里应该是因为config.yaml文件没改成功导致的)
后来直接vi /home/admin/.obd/cluster/myocp/config.yaml 这个文件的 指令 成功了。关于重新启动是否加载配置文件也是个知识点,希望以后能掌握牢实这个知识点吧