---
title: 如何防止 observer 进程被系统 OOM Killer 杀死？-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于如何防止 observer 进程被系统 OOM Killer 杀死？相关的常见问题和使用技巧，帮助您快速解决如何防止 observer 进程被系统 OOM Killer 杀死？的难题。
image: https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*OSPzQ6GUQF4AAAAAQHAAAAgAeiGDAQ/original
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

划线反馈

# 如何防止 observer 进程被系统 OOM Killer 杀死？

更新时间：2026-06-08 02:36

适用版本： V1.4.x、V2.1.x、V2.2.x、V3.1.x、V3.2.x、V4.0.x、V4.1.x、V4.2.x 内容类型：How-to  

本文讲述如何进行系统设置来避免 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 杀死。

1. 查看 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`，反之亦然。
 2. 修改 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 数据库所有版本。

上一篇

[Dag Scheduler 任务调度优先级说明](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000207638)

下一篇

[insert ignore 线程 hang 死问题](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000008218) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
