诊断Oceanbase OCP_Agent OOM kill 不可用

前不久跟朋友聊国产数据库的问题时,就有聊到该问题,在一些国产数据库使用了一些JAVA编写的程序,如Agent或外部插件,或是数据库内核机制,如内存数据对齐等,相比oracle会占用更多的内存,如果内存管理不好就容易出现out of memory的致命错误。近日一客户的oceanbase OCP告警ocp_monagent agent服务不可用,日志显示OOM kill

Sep 28 14:00:01 anbob-2 kernel: [25155102.451829] Memory cgroup stats for /ocp_agent/ocp_monagent: cache:0KB rss:4191388KB rss_huge:0KB shmem:0KB mapped_file:2112KB dirty:0KB writeback:11484KB swap:0KB inactive_anon:0KB active_anon:4190472KB inactive_file:0KB active_file:0KB unevictable:0KB
Sep 28 14:00:01 anbob-2 kernel: [25155102.451903] Tasks state (memory values in pages):
Sep 28 14:00:01 anbob-2 kernel: [25155102.451904] [  pid  ]   uid  tgid total_vm      rss pgtables_bytes swapents oom_score_adj name
Sep 28 14:00:01 anbob-2 kernel: [25155102.452067] [1948228]     0 1948228  1446516  1050940  8663040        0             0 ocp_monagent
Sep 28 14:00:01 anbob-2 kernel: [25155102.452083] [1951434]     0 1951434    53713      732    61440        0             0 ls
Sep 28 14:00:01 anbob-2 kernel: [25155102.452085] [1951435]     0 1951435    53018      120    53248        0             0 wc
Sep 28 14:00:01 anbob-2 kernel: [25155102.452087] oom-kill:constraint=CONSTRAINT_MEMCG,nodemask=(null),cpuset=ocp_monagent,mems_allowed=0-7,oom_memcg=/ocp_agent/ocp_monagent,task_memcg=/ocp_agent/ocp_monagent,task=ocp_monagent,pid=1948228,uid=0
Sep 28 14:00:01 anbob-2 kernel: [25155102.452094] Memory cgroup out of memory: Kill process 1948228 (ocp_monagent) score 1004 or sacrifice child
Sep 28 14:00:01 anbob-2 kernel: [25155102.461146] Killed process 1948228 (ocp_monagent) total-vm:5786064kB, anon-rss:4191812kB, file-rss:11948kB, shmem-rss:0kB

ocp_monagent

ocp_monagent 是 OCP-Agent 采集监控数据的进程,如果进程停止后很快被守护进程(ocp_agentd)拉起(最多尝试拉起3次),OCP_AGENT对业务几乎无影响,可能会丢失几秒钟的监控数据,如果进程停止后没有被拉起,则会造成监控大量丢数据,依赖监控数据的告警也将失效。

诊断原因

通常是因为库繁忙或采集频发导致内存过大或bug出现的内存泄露,最后超过限制,出现OOM Kill. 相关日志在/home/admin/ocp_agent/log 目录下.如搜索 panic 关键字,确认是否存在进程 BUG 导致的问题

解决方案

OCP_AGENT内存默认限制为2048MB,如果数据库环境较忙,采集数据多,并且操作系统free内存多的话,可以尝试调整 monagent 的内存限制。

  • 针对 3.2.x ~ 4.2.0 版本:
    • 修改 /home/admin/ocp_agent/conf/agentd.yaml 文件中的 ocp_monagent.imit.memoryQuota 参数.,可以根据主机内存使用情况适当调大;
    • 重启ocp_agent后生效;
  • 针对 4.2.1 及其之后版本:
    • 执行 /home/admin/ocp_agent/bin/ocp_agentctl config -u monagent.limit.memory.quota=8192MB 命令修改ocp_monagent进程内存限制的参数值;
    • 重启ocp_agent后生效;

启动或重启ocp_monaget进程:

/home/admin/ocp_agentctl service restart|start  ocp_monagent

验证生效:

cat /sys/fs/cgroup/memory/ocp_agent/ocp_monagent/memory.limit_in_bytes

/home/admin/ocp_agent/bin/ocp_agentctl status

而如果调大内存后仍旧有OOM现象,需要采集更多的操作系统和进程日志(如pprof),分析何内存区占用最大,可以临时禁用指标或调整(减少)采集频率.

Leave a Comment