前不久与朋友讨论国产数据库时,我们谈到其中一个比较突出的问题是内存占用较高。部分国产数据库采用了 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-Agent 是部署在主机上的管理、监控进程,其分为 3 个常驻进程和 1 个黑屏工具, 提供拉取监控数据的能力,ocp_mgragent 为管理进程;ocp_monagent 为监控进程,采集 OceanBase、OBProxy、主机监控数据;ocp_agentd 为管理进程、监控进程的守护进程。如果ocp_monagent 进程停止后很快被守护进程(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),分析何内存区占用最大,可以临时禁用指标或调整(减少)采集频率.