基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
如何防止 observer 进程被系统 OOM Killer 杀死?
更新时间:2026-06-08 02:36
本文讲述如何进行系统设置来避免 observer 进程被 OOM Killer 杀掉。
OOM Killer 是 Linux 内核设计的一种机制,在内存不足时选择一个进程杀死,释放内存来满足内存分配的的需求,避免系统 crash。
通常我们要求 OBServer 服务器为 OceanBase 数据库独占,不建议同时在 OBServer 服务器上部署其他应用。当 OBServer 其他应用共享服务器时,如果操作系统发生 OOM(Out-of-Memory),因为 observer 进程使用的内存较多,操作系统很可能杀掉 observer 进程来释放内存。
在 /var/log/message 日志内容中可以查看进程被 OOM Killer 杀掉的信息。
Sep 15 04:01:17 VBJ-oceanbase-23 kernel: [24151305.366580] Out of memory: Kill process 986423 (observer) score 783 or sacrifice childSep 15 04:01:17 VBJ-oceanbase-23 kernel: [24151305.375911] Killed process 986423 (observer) total-m:723242928kB, anon-rss:618044864kB, file-rss:102348kB, shmem-rss:0kB acct="admin" exe="/usr/sbin/runuser" hostname=? addr=? terminal=? res=success' dr=? terminal=? res=success' stname=? addr=? terminal=? res=success' ddr=? terminal=? res=success'
OverCommit
Overcommit 是指 Linux 系统在分配内存时,分配出的内存总量可以比系统可提供的内存量(物理内存 + Swap 空间)多,即是一种超卖的行为。通常,大部分应用并不会将其申请的内存全部用满,因此允许超卖可以提升内存的使用效率。但是这种做法也导致 OOM 的风险。
Linux 内核参数 vm.overcommit_memory 控制 Overcommit 的行为:
- 0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
- 1 永远允许 Overcommit,这种策略适合那些不能承受内存分配失败的应用,比如某些科学计算应用。
- 2 永远禁止 Overcommit,在这个情况下,系统所能分配的内存不会超过
swap+RAM * overcmmit_ratio。/proc/sys/vm/overcmmit_ratio,默认 50%。
理论上,设置 vm.overcommit_memory=2 可以防止进程被 OOM Killer 杀死的问题,但是如果进程的内存得不到申请,又没办法释放内存,则会导致系统死机。
OOM Killer 运行机制
OOM Killer 会按照进程的内存使用为进程打分,选择杀掉得分最高的进程。为实现这个目标,内核对每个进程维护了一个评分 oom_score。用户无法修改 oom_score 的值,但可以修改 oom_score_adj 来影响 OOM Killer 的选择。
- oom_score:
- 存储在
/proc/$PID/oom_score中,只读文件。 - 取值范围 [0,1000],值越大该进程被杀掉的可能就越高。
- 操作系统根据进程的内存消耗量、CPU 时间(utime + stime)、存活时间 (uptime - start time) 来计算得到,消耗内存越多分越高,存活时间越长分越低。
- 存储在
- oom_score_adj:
- 存储在
/proc/$PID/oom_score_adj中,用户可以修改。 - 默认值为 0,取值范围 [-1000,1000]。
- 在最终 OOM Killer 判断时会附加
oom_score_adj的值,所以oom_score_adj数字越小越趋向于不被选择。如果设置 -1000 基本可以避免被 OOM Killer 选中。
- 存储在
设置 oom_score_adj 来避免 OBServer 被 OOM Killer 杀死
综上所述,可以设置 OBServer 进程的 oom_score_adj=-1000 来避免 OBServer 被 OOM Killer 杀死。
查看 observer 进程的 oom 配置文件。
$ ll /proc/$(pidof observer)/oom* -rw-r--r-- 1 admin admin 0 Sep 13 11:07 /proc/55849/oom_adj -r--r--r-- 1 admin admin 0 Sep 13 11:07 /proc/55849/oom_score -rw-r--r-- 1 admin admin 0 Sep 13 11:07 /proc/55849/oom_score_adj $ cat /proc/$(pidof observer)/oom* 0 # oom_adj 698 # oom_score 0 # oom_score_adj其中,
oom_adj文件为旧版 Linux 的接口,其功能与oom_score_adj类似。为了兼容,目前仍然保留这个参数,当操作这个参数的时候,kernel 实际上是会换算成oom_score_adj,反之亦然。修改 observer 进程的
oom_score_adj为 -1000,不能使用 admin 用户修改。$ echo -1000 > /proc/55849/oom_score_adj -bash: echo: write error: Permission denied $ sudo sh -c "echo -1000 > /proc/55849/oom_score_adj" $ cat /proc/$(pidof observer)/oom* -17 # oom_adj 0 # oom_score -1000 # oom_score_adj
适用版本
OceanBase 数据库所有版本。