首批通过分布式安全可靠测评,为关键业务系统打造
租户内存写满
更新时间:2025-03-25 14:26:40
租户内存(memstore)写满多数情况下是由突发的批量导入操作导致的,应急的操作主要以开启写入限速以及调整转储阈值等手段。
应急处理流程
租户内存写满一般表现为写入失败,报错No memory or reach tenant memory limit 或者 Over tenant memory limits。应急策略的优先级选择一般从高到低分别为:
增加租户内存配置。建议直接在 OCP 执行租户内存扩容操作,详见 OCP 使用指南。命令行修改详见如下步骤:
- 执行以下 SQL 语句,确认当前租户使用的
unit_config。
- 执行以下 SQL 语句,确认当前租户使用的
注意
多个副本可能使用了不同的 resource_pool,您需要分别做出调整。
```sql
SELECT a.tenant_name,a.tenant_id,b.name unit_config,c.name pool_name,b.max_cpu,b.min_cpu
FROM
OCEANBASE.DBA_OB_TENANTS a,
OCEANBASE.DBA_OB_UNIT_CONFIGS b,
OCEANBASE.DBA_OB_RESOURCE_POOLS c
WHERE a.tenant_id=c.tenant_id
AND b.unit_config_id = c.unit_config_id
ORDER BY a.tenant_id desc;
```
- 执行生成的 SQL 语句。
注意
截止 OceanBase V3.2 版本,修改 resource unit 配置仅 CPU、Memory 配置是实际生效的,其他 IO 参数例如磁盘、iops 等都暂时无效,默认即可。
```sql
ALTER resource unit unit_config_name min_cpu = 2,max_cpu = 2,MEMORY_SIZE = '2G',max_iops = 10000,min_iops = 10000;
```
调高转储线程数,加快转储,让内存尽快释放。
转储前数据会大量占据内存,快速转储结束能释放被占用的内存,
compaction_high_thread_score是控制并行转储线程数,您可以通过调高该参数值来达到快速释放内存的目的。该参数默认值为0,表示只有一个线程数,修改该参数无需重启 OBServer 即刻生效。
注意
该参数调大的代价为 CPU 使用率升高,请根据具体情况决定是否开启。
具体方法如下:使用 root 用户登录集群的 sys 租户。
ALTER SYSTEM SET compaction_high_thread_score=x;
修改成功后,可以通过 SHOW PARAMETERS 语句查看是否修改成功。
SHOW PARAMETERS LIKE 'compaction_high_thread_score';
当集群已经无法扩容租户总内存时,可调高租户 memstore 的比例,临时扩大可写入内存,并且调低转储阈值,让转储更快发生。
OceanBase中一个租户的 MemTable 内存的使用量达到配置项 freeze_trigger_percentage 所限制使用的百分比时,就会自动触发转储,转储后会释放占用的内存。该参数默认值为 70 ,表示当 memstore 使用率超过70%,就会触发转储。
另一个相关的参数是
memstore_limit_percentage,也就是租户内存中可用于 memstore 写入的比例,默认为 50%,意为租户使用 memstore 的内存占其总可用内存50%。例如一个内存配置为 10GB 的租户,memstore 可写入部分为 5G。该参数的取值范围为[1, 99],修改该参数无需重启 OBServer 即刻生效。在应急场景下,可以调大
memstore_limit_percentage的同时,调低freeze_trigger_percentage,达到临时扩容和尽快转储释放的目的。具体方法如下:使用
root用户登录集群的sys租户。ALTER SYSTEM SET freeze_trigger_percentage=40; ALTER SYSTEM SET memstore_limit_percentage=70;开启写入限速,内存写入达到一定阈值 OB 会主动限制客户端导入速度。
writing_throttling_trigger_percentage是租户级参数,该参数是调整写入速度的阈值,当 memstore 已使用的内存达到该阈值时,触发写入限速。该参数的默认值是 100,表示关闭写入限速机制。该参数的取值范围为[0, 100],修改该参数无需重启 OBServer 即刻生效。另一个参数writing_throttling_maximum_duration表示触发限速后,剩余内存最多支持多长时间的写入时间,默认为 2 小时,该项一般不做修改。ALTER SYSTEM SET writing_throttling_trigger_percentage = 80; ALTER SYSTEM SET writing_throttling_maximum_duration = '2h';应用侧降级批处理任务。
当用户内存写满时,您可以考虑在应用侧降级对应租户的批处理任务。