前不久跟朋友聊国产数据库的问题时,就有聊到该问题,在一些国产数据库使用了一些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),分析何内存区占用最大,可以临时禁用指标或调整(减少)采集频率.