#!/usr/bin/env bash
# ==============================================================================
# 脚本名称: check_502_oom.sh
# 功能描述: 后端服务进程 OOM 终止记录自动诊断与内存状态巡检 (纯只读)
# 使用方式: 在报错对应的后端 Linux 服务器上以 root 权限执行
# ==============================================================================
set -o pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PLAIN='\033[0m'
echo -e "${BLUE}================================================================${PLAIN}"
echo -e "${BLUE} 底层系统 OOM Killer 记录与内存水位安全巡检 ${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"
# 1. 检索 dmesg 中的 OOM 记录
echo -e "\n${YELLOW}[1/3] 正在扫描系统内核 dmesg OOM 终止记录...${PLAIN}"
OOM_LOGS=$(dmesg -T 2>/dev/null | grep -i -E "Out of memory|Killed process|Memory cgroup out of memory")
if [ -n "$OOM_LOGS" ]; then
echo -e " -> ${RED}[ALERT] 检测到内核 OOM Killer 触发记录!近期有以下进程因内存超限被强制终止:${PLAIN}"
echo "$OOM_LOGS" | tail -n 5 | while read -r line; do
echo -e " ${RED}${line}${PLAIN}"
done
echo -e " -> ${YELLOW}[诊断] 若被终止的进程包含业务服务 (Java/Python/Node/Go等),即为触发网关 502 的直接原因。${PLAIN}"
else
echo -e " -> ${GREEN}[OK] dmesg 内核日志中暂未发现进程被 OOM 终止的记录。${PLAIN}"
fi
# 2. 检查当前系统内存水位
echo -e "\n${YELLOW}[2/3] 当前系统物理内存与 Swap 水位评估...${PLAIN}"
free -m | awk '
NR==2 {
total=$2; used=$3; free=$4;
usage=used/total*100;
printf " -> 物理内存使用率: %.1f%% (Total: %d MB, Used: %d MB)\n", usage, total, used
if(usage > 90) { print " \033[0;31m[WARN] 物理内存使用率超过 90%,存在较高的 OOM 触发风险!\033[0m" }
}
NR==3 {
if($2 > 0) {
total=$2; used=$3;
usage=used/total*100;
printf " -> Swap 交换分区 : %.1f%% (Total: %d MB, Used: %d MB)\n", usage, total, used
} else {
print " -> Swap 交换分区 : 未启用 (当物理内存耗尽时将直接触发 OOM Killer)"
}
}'
# 3. 筛选当前内存占用 TOP 3 的进程
echo -e "\n${YELLOW}[3/3] 当前存活进程物理内存占用排行 (TOP 3)...${PLAIN}"
ps -eo pid,pmem,rss,comm --sort=-rss | head -n 4 | awk '
NR==1 { printf " %-8s %-6s %-12s %s\n", $1, $2, "RSS(KB)", $4 }
NR>1 { printf " %-8s %-6s %-12s %s\n", $1, $2, $3, $4 }'
echo -e "\n${BLUE}================================================================${PLAIN}"
echo -e "${BLUE}巡检完毕。若确认为单点 OOM 导致 502,建议优化应用内存并在网关补充 proxy_next_upstream 容错配置。${PLAIN}"
echo -e "${BLUE}================================================================${PLAIN}"