本文介绍 4013 内存爆问题的排查。
内存爆的类型
内存爆主要分为五类,可以通过关键词 OOPS
确定内存爆的类型。
| 内存爆的类型 | 日志信息(关键字为 [OOPS]) |
|---|---|
| SINGLE_ALLOC_SIZE_OVERFLOW | single alloc size large than 4G is not allowed(alloc_size: %ld) |
| CTX_HOLD_REACH_LIMIT | ctx memory has reached the upper limit(ctx_name: %s, ctx_hold: %ld, ctx_limit: %ld, alloc_size: %ld) |
| TENANT_HOLD_REACH_LIMIT | tenant memory has reached the upper limit(tenant_id: %lu, tenant_hold: %ld, tenant_limit: %ld, alloc_size: %ld) |
| SERVER_HOLD_REACH_LIMIT | server memory has reached the upper limit(server_hold: %ld, server_limit: %ld, alloc_size: %ld) |
| PHYSICAL_MEMORY_EXHAUST | physical memory exhausted(os_total: %ld, os_available: %ld, server_hold: %ld, errno: %d, alloc_size: %ld) |
可以在内存爆的时间点(比如 20230730142424792
),搜索 OOPS
日志,确定属于哪个类型的内存爆。
grep '\[OOPS\]' observer.log.20230730142424792
租户内存爆
检查是否存在 msg
信息,表示特定租户的内存爆。

此处 msg
表示 1008 租户的内存爆了,需要进一步查看该租户下哪个 CTX_ID
的占用偏高。
1.1 分析租户的内存元信息,确定高内存占用的 CTX_ID
未发现占用较大的 CTX_ID
,并且租户的大部分内存都是 kvcache,说明租户内存不足时挤占 kvcache 的内存失败了,需要确定失败的原因。
OBServer 内存爆
CTX_ID 内存爆
按照 CTX 的内存元信息分析 这一节的步骤来确定导致 OBServer 内存爆的模块。
物理内存耗尽
常见原因是超卖机器的物理内存,一台机器上部署多个 OBServer,或者 OBServer 的 memory_limit
接近机器的物理内存。可以结合 tsar --mem
在内存爆时刻的日志进行验证。
无 OOPS 日志
适用版本
OceanBase 数据库所有版本。
文章转载自数据库工兵营,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。











