zadd压测报错

【 使用环境 】生产环境
【 OB or 其他组件 】obkv-redis
【 使用版本 】4.2.5.2
【问题描述】memtier_benchmark 压测zadd时容易出现内存不足
【复现路径】问题出现前后相关操作
【附件及日志】我做完合并之后进行的压测.
export host=10.38.48.37
export port=2885
export passwd=M**L
/usr/local/bin/memtier_benchmark
-s $host
-p $port
-a $passwd
-t 10
-c 50
-n 31457
–pipeline=1
–distinct-client-seed
–random-data
–data-size=1024
–key-maximum=15728640
–key-minimum=1
–command=‘zadd key 90.0 data
–command-key-pattern=P
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE7020A2624F2-0000000000000F2A-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE7BA0A2624F2-0000000000000F47-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE72A0A2624F2-0000000000000ED8-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE9220A2624F2-0000000000000EBE-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE78E0A2624F2-0000000000000EBC-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE6680A2624F2-0000000000000ED5-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE6500A2624F2-0000000000000F04-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE7900A2624F2-0000000000000ED8-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE7BC0A2624F2-0000000000000E74-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE63A0A2624F2-0000000000000F5B-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE9080A2624F2-0000000000000E74-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE5960A2624F2-0000000000000EF0-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE9000A2624F2-0000000000000ED1-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE7320A2624F2-0000000000000E89-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE8C40A2624F2-0000000000000F43-0-0
server 10.38.48.37:2885 handle error response: -ERR errCode:-4013, errCodeName:ObAllocateMemoryFailed, errMsg:No memory or reach tenant memory limit, server:10.38.48.39:2882, trace:YE7A00A2624F2-0000000000000F0A-0-0

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

压测其他命令的时候,不怎么出现内存的报错

根因分析场景: 内存问题
根因分析命令: 无(当前 obdiag 工具未提供针对内存分配失败的特定根因分析场景)
日志采集场景: 内存问题
日志采集命令: obdiag gather scene run --scene=observer.memory

推荐使用 obdiag 工具进行日志采集,以便我们确认租户内存限制和内存分配的具体情况。请您执行以下命令采集日志,并将生成的日志压缩包提供给我们以进一步分析问题。

为了更好地帮助您解决问题,在此需要您提供一些额外的信息:

  1. 当前租户的内存配额是多少?是否已经接近或达到上限?
  2. 是否有其他高负载操作同时运行,导致内存竞争加剧?
  3. 压测时使用的 memtier_benchmark 配置参数是什么?例如并发线程数、请求速率等。
  4. 是否可以提供压测期间的系统监控数据(如内存使用率、CPU 使用率等)?
  5. 是否尝试过调整租户的内存配额?如果尝试过,请问结果如何?

附上敏捷诊断工具 obdiag 使用帮助链接

根据您提供的图片和 OCR 提取的内容,可以看出租户的 MEMStore(内存存储)已经达到了 100% 的使用率。这可能是导致 zadd 压测时出现内存不足错误的主要原因。

问题分析

  1. MEMStore 使用率过高
    OceanBase 的租户内存分为多个部分,其中 MEMStore 是用于存储增量数据的内存区域。当 MEMStore 达到上限时,系统会拒绝新的写入请求,并返回类似 -ERR errCode:-4013, ObAllocateMemoryFailed 的错误。

  2. 压测场景下的高负载
    在您的压测场景中,zadd 操作频繁写入数据,可能导致 MEMStore 快速增长。如果租户的内存配额较小或未及时触发合并(Major Compaction),则容易出现内存不足的问题。


解决方案

1. 增加租户内存配额

  • 检查当前租户的内存配额是否足够:
    SHOW TENANT WHERE tenant_name = 'your_tenant_name';
    
  • 如果内存配额不足,可以调整租户的内存大小:
    ALTER TENANT your_tenant_name SET RESOURCE UNIT = new_unit_name;
    
    或者直接修改租户的内存参数:
    ALTER TENANT your_tenant_name SET MEMORY_SIZE = 'new_memory_size';
    

2. 优化 Major Compaction 频率

  • Major Compaction 会将内存中的数据刷盘并释放 MEMStore 空间。可以通过以下方式优化:
    • 手动触发 Major Compaction:
      ALTER SYSTEM MAJOR FREEZE;
      
    • 调整自动触发 Major Compaction 的阈值(例如降低触发条件):
      ALTER SYSTEM SET freeze_trigger_percentage = 70;
      

3. 减少压测负载

  • 如果租户内存配额无法大幅增加,可以尝试减少压测的并发线程数或请求速率,以降低 MEMStore 的增长速度。例如:
    /usr/local/bin/memtier_benchmark \
        -t 5 \
        -c 10 \
        --command='zadd __key__ 90.0 __data__'
    

4. 监控租户内存使用情况

  • 使用以下命令监控租户的内存使用情况:
    SELECT * FROM GV$OB_TENANT_MEMORY_INFO WHERE tenant_id = your_tenant_id;
    
  • 或者通过 OCP 平台查看租户的实时内存使用情况。

总结

当前问题的根本原因是租户的 MEMStore 已达到 100% 使用率,建议您优先增加租户内存配额或优化 Major Compaction 频率。同时,适当调整压测参数以避免过高的内存消耗。

如果问题仍未解决,请提供以下信息以便进一步分析:

  1. 当前租户的内存配额和使用情况。
  2. 压测期间的系统监控数据(如 CPU、内存、磁盘 I/O 等)。
  3. 是否有其他高负载操作同时运行。

更多信息请查看:

  1. 13900.merge_stat_sampling_ratio.md
  2. CDB_OB_AUX_STATISTICS
  3. 27300.o-dba_wr_snapshot-of-sys-tenant.md
  4. 300.automatically-collect-statistic-information.md
  5. 1800.gv-ob_merge_info-of-sys-tenant.md
  6. oceanbase.CDB_OB_ZONE_MAJOR_COMPACTION
  7. 500.auto_refresh_location_cache_rate_limit.md
  8. 15800.o-dba_ob_archive_dest-of-sys-tenant.md
  9. 100.collect-statistic-information-overview.md
  10. 14100.merger_completion_percentage.md

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

报错期间查询下
select * from gv$ob_memory where TENANT_ID=’’;

上传到云盘里了,麻烦看看