ODA/Oracle RAC 节点 Load 100+ 排查:一个 lsof 残留进程引发的负载虚高问题 2026-05-27

一、问题现象

在日常巡检过程中,发现 生产 ODA办公 ODA 两套平台的 RAC 节点一均存在负载异常偏高现象,load average 一度达到 100+

其中:

  • 生产 ODA 节点一 load 约为 100+

  • 办公 ODA 节点一 load 约为 115+

  • 对应 RAC 节点二负载较低,未出现同类异常。

进一步查看发现,节点一虽然 load 较高,但 CPU idle 仍保持在 90% 以上,IO wait 为 0,内存及 Swap 未见明显压力。因此初步判断,该问题并非 CPU、内存、Swap 或 IO 资源打满导致,更像是异常进程堆积或进程等待导致 load 被拉高。


二、排查过程

1. 查看系统负载

巡检时通过 top 查看系统负载:

复制代码
top
uptime

发现 RAC 节点一 load 明显偏高,但系统资源未见明显瓶颈:

复制代码
CPU idle 较高
IO wait 为 0
内存剩余充足
Swap 基本未使用

因此初步排除 CPU 打满、IO 卡死、内存不足等常见问题。


2. 查看系统进程

继续查看节点一系统进程:

复制代码
ps -ef

在进程列表中发现大量异常进程,格式类似:

复制代码
/bin/lsof -p <PID>
/bin/lsof -p <PID>
/bin/lsof -p <PID>

这些进程具有明显异常特征:

复制代码
root 用户运行
父进程 PPID = 1
启动时间为 May23
CPU 时间为 00:00:00
数量较多

这些进程不是 Oracle 数据库核心进程,也不是正常业务应用进程,而是异常残留的 /bin/lsof -p 进程。


3. 精准筛选异常进程

发现异常进程后,进一步筛选确认:

复制代码
ps -ef | grep lsof

更精准筛选:

复制代码
ps -ef | grep '[l]sof -p'

确认节点一存在大量 /bin/lsof -p xxx 异常残留进程。

这些进程长期未退出,父进程已变成 1,说明原始调用进程已经结束,而这些 lsof 进程被系统接管,形成异常残留进程。


4. 对比 RAC 节点二

随后在对应 RAC 节点二进行同样检查,未发现类似大量 /bin/lsof -p 异常残留进程。

由此判断:

异常主要集中在 RAC 节点一,节点一 load 偏高与大量残留 lsof 进程高度相关。


三、原因分析

1. 直接原因

本次 RAC 节点一 load 异常升高的直接原因是:

节点一存在大量异常残留的 /bin/lsof -p xxx 进程,这些进程长期未退出,导致系统 load 被持续拉高。

虽然这些进程 CPU 时间显示为 00:00:00,但如果进程卡在文件系统、NFS、旧文件句柄或资源等待状态,仍可能被计入 load average。

因此会出现:

复制代码
load 很高
CPU idle 仍然较高
IO wait 不一定明显
内存和 Swap 正常
业务不一定明显卡顿

这类问题属于典型的 异常等待/残留进程导致 load 虚高


2. 根本原因初步判断

结合异常进程启动时间均为 May23,而当天曾修改过异地备份服务器 IP 地址,初步判断本次问题与异地备份链路变更有关。

异地备份服务器 IP 由:

复制代码
192.0.2.50

调整为:

复制代码
192.0.2.248

同时,异地备份服务器的 NFS 备份路径主要挂载在 RAC 节点一 上。因此,IP 变更期间如果节点一上的 NFS 挂载、旧文件句柄、备份路径或备份相关进程出现异常,就可能主要影响节点一。

推测链路如下:

复制代码
异地备份服务器 IP 调整
        ↓
异地备份 NFS 路径挂载在 RAC 节点一
        ↓
节点一 NFS 挂载 / 旧文件句柄 / 备份链路短时间异常
        ↓
相关巡检或排查动作执行 lsof -p
        ↓
lsof 访问异常资源时卡住
        ↓
节点一大量 lsof 进程残留
        ↓
节点一 load 持续偏高
        ↓
节点二未承载该 NFS 备份挂载路径,因此未出现同类异常

四、处理措施

1. 清理异常 lsof 进程

清理前先确认异常进程:

复制代码
ps -ef | grep '[l]sof -p'

确认无误后,执行普通清理:

复制代码
ps -ef | grep '[l]sof -p' | awk '{print $2}' | xargs -r kill

等待几秒后复查:

复制代码
ps -ef | grep '[l]sof -p'

如仍有残留,再执行强制清理:

复制代码
ps -ef | grep '[l]sof -p' | awk '{print $2}' | xargs -r kill -9

清理完成后确认数量:

复制代码
ps -ef | grep '[l]sof -p' | wc -l

结果为:

复制代码
0

说明异常 lsof -p 残留进程已清理完成。


2. 清理后查看系统负载

清理异常进程后,再次查看系统负载:

复制代码
top
uptime

清理后 load 明显下降,系统状态恢复正常,CPU、内存、Swap、IO 指标均未见异常。


3. 检查 NFS 挂载状态

检查当前 NFS 挂载情况:

复制代码
cat /proc/mounts | egrep '192.0.2.50|192.0.2.248|nfs'
findmnt | egrep '192.0.2.50|192.0.2.248|nfs'

确认当前异地备份 NFS 已指向新 IP:

复制代码
192.0.2.248

未发现旧 IP 192.0.2.50 仍作为有效 NFS 挂载源。


4. 优化 RMAN 备份脚本

为防止后续 NFS 未挂载时,RMAN 误将备份写入本地目录,已分别对 办公 ODA生产 ODA 的 RMAN 备份脚本增加 NFS 前置检查。

检查内容包括:

复制代码
NFS 挂载点是否已挂载
RMAN 备份目录是否存在
RMAN 备份目录是否可写

核心检查逻辑如下:

复制代码
LOG_DIR="/home/oracle/rman/log"
NFS_DIR="/ODACDBbackup_nfs/192.0.2.101_CDB"
NFS_RMAN_DIR="${NFS_DIR}/rman"
TODAY=$(date +"%Y%m%d")
CHECK_LOG="${LOG_DIR}/nfs_check_${TODAY}.log"

mkdir -p "$LOG_DIR"

if ! mountpoint -q "$NFS_DIR"; then
  echo "$(date '+%F %T') ERROR: NFS目录 $NFS_DIR 未挂载,停止备份,防止写入本地磁盘。" >> "$CHECK_LOG"
  exit 1
fi

if [ ! -d "$NFS_RMAN_DIR" ]; then
  echo "$(date '+%F %T') ERROR: RMAN备份目录 $NFS_RMAN_DIR 不存在,停止备份。" >> "$CHECK_LOG"
  exit 1
fi

if [ ! -w "$NFS_RMAN_DIR" ]; then
  echo "$(date '+%F %T') ERROR: RMAN备份目录 $NFS_RMAN_DIR 不可写,停止备份。" >> "$CHECK_LOG"
  exit 1
fi

同时将 nfs_check_*.log 纳入日志清理范围:

复制代码
find "$LOG_DIR" -type f \( \
  -name "*_backup_*.log" -o \
  -name "*_ARCH_clean_*.log" -o \
  -name "nfs_check_*.log" \
\) -mtime +$((KEEP_DAYS-1)) -print -delete

五、处理结果

本次处理完成后:

复制代码
异常 lsof 进程已清理
两套 ODA 节点一负载恢复正常
NFS 当前挂载正常
RMAN 备份目录可写
办公 ODA 和生产 ODA 备份脚本均已增加 NFS 防误写保护

脚本验证结果:

复制代码
bash -n 检查通过
NFS mounted OK
RMAN dir writable OK

六、最终结论

本次两套 ODA RAC 节点一 load 异常偏高,并非 Oracle 数据库本身 CPU 打满,也不是内存、Swap 或 IO 故障导致。

最终判断为:

异地备份服务器 IP 变更后,由于异地备份 NFS 路径主要挂载在 RAC 节点一,节点一上的备份链路/NFS 相关资源曾出现异常,导致巡检或排查过程中产生的大量 /bin/lsof -p 进程卡住未退出。这些残留进程长期堆积,造成 RAC 节点一 load 异常升高。清理异常进程后,系统负载恢复正常。

后续已完成 RMAN 备份脚本优化,增加 NFS 挂载点、备份目录存在性和可写性检查,防止类似问题再次引发备份异常或误写入本地磁盘。


简短总结

巡检发现生产 ODA 与办公 ODA 的 RAC 节点一 load 均异常偏高,达到 100+,而节点二负载较低。进一步查看节点一进程后,发现存在大量 /bin/lsof -p xxx 异常残留进程,而节点二未发现类似情况。结合异常进程启动时间为 May23,且当天曾修改异地备份服务器 IP,同时异地备份 NFS 路径主要挂载在 RAC 节点一,判断为 IP 变更期间节点一备份/NFS 链路异常,导致 lsof 进程卡住并长期残留,最终推高节点一 load。清理异常进程后,负载恢复正常;同时已优化 RMAN 备份脚本,增加 NFS 挂载检查,防止后续备份异常写入本地目录。

相关推荐
AlfredZhao2 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
冬奇Lab12 小时前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
AlfredZhao17 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
ClouGence1 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
无响应de神1 天前
三、用户与权限管理
数据库·mysql
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux