冻结内存和阻塞算子

问题一:
当MemStore的内存使用率到达freeze_trigger_percentage设置的阀值,就无法向MemStore里写入数据?此时需要对内存进行冻结之后,才能向MemStore里写入数据?

问题二:
ob_sql_work_area_percentage 表示SQL阻塞算子工作区内存占用上限。 不懂,啥子是“阻塞算子”? 怎么理解这个“阻塞算子”?

@论坛小助手

根据文档库中的信息,我将分别解答您的两个问题。

问题一:MemStore 内存冻结与写入

当 MemStore 的内存使用率到达 freeze_trigger_percentage 设置的阈值时,并不是完全无法向 MemStore 写入数据。

  • 触发转储(冻结)机制:当租户的 MemStore 内存使用量达到 freeze_trigger_percentage * memstore_limit 时,系统会自动触发转储的前置动作——冻结。这里的 memstore_limit 是指租户内存中可用于 MemStore 写入的比例,计算公式为 memstore_limit = 租户内存 * memstore_limit_percentage

  • 转储后释放内存:触发冻结后,系统会调度转储操作,转储完成后,系统会释放占用的 MemStore 内存,从而允许后续的写入或更新操作继续进行。

因此,在达到 freeze_trigger_percentage 阈值时,系统会启动转储流程以释放内存,而不是直接禁止写入。具体配置可以通过以下命令调整:

ALTER SYSTEM SET freeze_trigger_percentage = 20;

问题二:SQL 阻塞算子工作区内存

关于 ob_sql_work_area_percentage 和“阻塞算子”的解释:

  • 阻塞算子的概念:在 SQL 查询执行过程中,某些操作需要对中间结果进行排序、分组等处理,这些操作被称为阻塞性算子(Blocking Operator)。常见的阻塞性算子包括 SORT(排序)、GROUP BY(分组)、UNION 等。这类算子的特点是在处理过程中可能会占用大量内存来存储中间结果集。

  • 工作区内存的作用:为了支持这些阻塞性算子的操作,OceanBase 提供了工作区内存(Work Area Memory),用于存放这些中间结果。ob_sql_work_area_percentage 就是用来控制这部分内存占租户总可用内存的比例,默认值为 5%。

  • 调整工作区内存:如果请求并发量较大,且每个请求占用的工作区内存较多,可能会导致工作区内存不足的问题。此时可以通过适当调大 ob_sql_work_area_percentage 来规避该问题。例如:

    SET GLOBAL ob_sql_work_area_percentage = 10;
    

通过上述设置,可以增加分配给阻塞性算子的工作区内存量,从而提高查询性能并减少内存不足的情况。

希望以上解答能够帮助您理解这两个概念。如果您还有其他疑问,请随时提问!

详情请参考:

  1. 租户内部内存管理
  2. 在您开始前
  3. freeze_trigger_percentage
  4. ob_sql_work_area_percentage
  5. 内存相关问题
  6. 内存相关参数
  7. data_disk_usage_limit_percentage
  8. memstore_limit_percentage
1 个赞

这么高级 机器人回答 厉害

是的,原理咨询类问题可以直接a艾特他 :grinning:

@论坛小助手 朋友你很厉害

您好,您提到的问题似乎与 OceanBase 没有关联,我无法回答,敬请谅解! 如果您有其他 OceanBase 相关问题,欢迎继续提问。