问题现象
客户在进行性能压测时发现 OBServer 服务器上的 ocp_monagent 进程因为内存使用超限而频繁地重启,同时在主机的 /var/log/messages 日志中发现如下的日志。
Feb 26 16:25:00 obs2 kernel: [1749083.671935] memory: usage 2097152kB, limit 2097152kB, failcnt 936089037
Feb 26 16:25:00 obs2 kernel: [1749083.671936] memory+swap: usage 2097152kB, limit 9007199254740988kB, failcnt 0
Feb 26 16:25:00 obs2 kernel: [1749083.671937] kmem: usage 0kB, limit 9007199254740988kB, failcnt 0
Feb 26 16:25:00 obs2 kernel: [1749083.671938] Memory cgroup stats for /ocp_agent/ocp_monagent: cache:0KB rss:2093920KB rss_huge:0KB shmem:0KB mapped_file:4224KB dirty:0KB writeback:0KB swap:0KB inactive_anon:0KB active_anon:2094048KB inactive_file:0KB active_file:0KB unevictable:0KB
Feb 26 16:25:00 obs2 kernel: [1749083.672009] Tasks state (memory values in pages):
Feb 26 16:25:00 obs2 kernel: [1749083.672009] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name
Feb 26 16:25:00 obs2 kernel: [1749083.672393] [3276420] 0 3276420 913171 530766 4485120 0 0 ocp_monagent
Feb 26 16:25:00 obs2 kernel: [1749083.672404] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=ocp_monagent,mems_allowed=0,oom_memcg=/ocp_agent/ocp_monagent,task_memcg=/ocp_agent/ocp_monagent,task=ocp_monagent,pid=3276420,uid=0
Feb 26 16:25:00 obs2 kernel: [1749083.672496] Memory cgroup out of memory: Killed process 3276420 (ocp_monagent) total-vm:3652684kB, anon-rss:2096216kB, file-rss:26848kB, shmem-rss:0kB
Feb 26 16:25:01 obs2 kernel: [1749083.848270] oom_reaper: reaped process 3276420 (ocp_monagent), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
这是一段来自 Linux 内核的日志,描述了一个由于内存不足(Out Of Memory,OOM)导致的进程被杀死的情况。具体来说,这个事件发生在 2025 年 2 月 26 日 16:25 左右,在一台名为 obs2 的机器上,一个名为 ocp_monagent 的进程因为其所处的 cgroup(控制组)达到了设定的内存限制而被系统终止。
关键日志解析
内存使用情况。
memory: usage 2097152kB, limit 2097152kB, failcnt 936089037:显示该 cgroup 下的内存使用量已经达到了其上限 2GB,并且尝试分配更多内存失败的次数非常之多。memory+swap: usage 2097152kB, limit 9007199254740988kB, failcnt 0:表明即使考虑了交换分区,实际使用的仍然是 2GB,但这里的限制设置得非常高,实际上不影响当前问题。kmem: usage 0kB, limit 9007199254740988kB, failcnt 0:内核直接分配的内存用量为 0,也不是问题的关键。
OOM Killer 触发
日志中提到
oom-kill:constraint=CONSTRAINT_MEMCG,...,这表示是因为 cgroup 级别的内存限制被触发生效,导致 OOM Killer 启动。Memory cgroup out of memory: Killed process 3276420 (ocp_monagent):明确指出是ocp_monagent进程因为内存超限而被杀死。进程的详细信息包括它的虚拟内存大小(total_vm:3652684kB)、匿名页 RSS(anon-rss:2096216kB)、文件映射的 RSS(file-rss:26848kB)等。
OOM Reaper
oom_reaper: reaped process 3276420 (ocp_monagent),...:确认了 OOM Killer 之后,OOM Reaper 清理了被终止的进程所占用的所有资源。
问题原因
OCP Agent 进程默认安装的内存使用上限为2GB,当数据库进行压测时,因为性能监控数据较多,收集压力很大,导致 ocp_agent 进程内存使用超限。当内存使用超过 2G B时,会被操作系统的 oom_killer 自动杀掉。
问题的风险及影响
ocp_monagent 进程频繁重启,导致 OCP 上性能数据的采集和监控被频繁中断。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
适用版本
OCP Agent V3.2.x 及更高版本。
解决方法
以操作系统管理员用户或者具有 sudo 权限的用户登陆到 OBServer 服务器上,执行 /home/admin/ocp_agent/bin/ocp_agentctl config -u monagent.limit.memory.quota=xxx 来修改 ocp_monagent 进程允许使用的内存上限。
示例如下。
-- 注意:执行完下面的的命令后,需要重启 ocp_agent 才能生效。
[root@observer ~]# /home/admin/ocp_agent/bin/ocp_agentctl config -u monagent.limit.memory.quota=10240MB
{"successful":true,"message":"success","error":""}
-- 重启命令
[root@observer ~]# systemctl restart ocp_agent
-- 可以使用下面的命令来检查修改是否已经生效
[root@observer ~]# cat /sys/fs/cgroup/memory/ocp_agent/ocp_monagent/memory.limit_in_bytes
10737418240
[root@observer ~]# cat /home/admin/ocp_agent/conf/config_properties/common_meta.yaml | grep -A4 monagent.limit.memory.quota
- key: monagent.limit.memory.quota
value: 10240MB
valueType: string
encrypted: false
configVersion: "2025-02-26T16:51:33.747+08:00"
规避方式
无。