#!/usr/bin/env bash # ============================================================================ # MAX LoadCheck — 服务器负载深度分析 # 原创脚本,综合 top/ps/vmstat 信息分析系统压力来源 # # 风险等级: 🟢 只读 — 不修改任何系统设置 # 用法: bash <(curl -fsSL https://dl.unvmax.com/linux/scripts/max-tools/max-loadcheck.sh) # ============================================================================ set -e R='\033[1;31m' G='\033[1;32m' Y='\033[1;33m' B='\033[1;34m' C='\033[1;36m' M='\033[1;35m' W='\033[1;37m' N='\033[0m' GR='\033[90m' echo -e "${B}┌─────────────────────────────────────────────┐${N}" echo -e "${B}│${N} ${G}MAX 负载深度分析${N} ${GR}(只读诊断)${N}" echo -e "${B}└─────────────────────────────────────────────┘${N}" echo # 1. CPU 负载 cpu_cores=$(grep -c '^processor' /proc/cpuinfo 2>/dev/null || nproc 2>/dev/null || echo 1) load=$(awk '{print $1, $2, $3}' /proc/loadavg 2>/dev/null) load1=$(echo "$load" | awk '{print $1}' | cut -d. -f1) load5=$(echo "$load" | awk '{print $2}' | cut -d. -f1) load15=$(echo "$load" | awk '{print $3}' | cut -d. -f1) echo -e " ${M}1. CPU 负载概览${N}" echo -e " ${GR}───${N}" echo -e " CPU 核心数: ${W}$cpu_cores${N}" [ "$load1" -gt "$cpu_cores" ] && c1=$R || c1=$G [ "$load5" -gt "$cpu_cores" ] && c5=$R || c5=$G [ "$load15" -gt "$cpu_cores" ] && c15=$R || c15=$G echo -e " 负载: ${c1}1min: $load1${N} / ${c5}5min: $load5${N} / ${c15}15min: $load15${N}" echo -e " ${GR} (超过核心数 = 过载)${N}" # 2. CPU 占用 TOP10 echo -e "\n ${M}2. CPU 消耗 TOP10${N}" echo -e " ${GR}───${N}" ps aux --sort=-%cpu 2>/dev/null | head -11 | awk 'NR==1{printf " %-6s %-5s %-24s %s\n","PID","%CPU","COMMAND","USER"}' ps aux --sort=-%cpu 2>/dev/null | head -11 | awk 'NR>1{printf " %-6s %-5s %-24s %s\n",$2,$3,$11,$1}' # 3. 内存占用 TOP10 echo -e "\n ${M}3. 内存占用 TOP10${N}" echo -e " ${GR}───${N}" ps aux --sort=-%mem 2>/dev/null | head -11 | awk 'NR>1{printf " %-6s %-5s %-24s %s\n",$2,$4,$11,$1}' # 4. 僵尸进程检查 echo -e "\n ${M}4. 僵尸 / D 状态进程${N}" echo -e " ${GR}───${N}" zombie=$(ps aux 2>/dev/null | awk '$8=="Z" || $8=="Z+"' | wc -l) dsleep=$(ps aux 2>/dev/null | awk '$8=="D" || $8=="D+"' | wc -l) [ "$zombie" -gt 0 ] && zc=$R || zc=$G [ "$dsleep" -gt 0 ] && dc=$Y || dc=$G echo -e " 僵尸进程(Z): ${zc}$zombie${N}" echo -e " 不可中断(D): ${dc}$dsleep${N}" # 5. SWAP 压力 echo -e "\n ${M}5. Swap 压力${N}" echo -e " ${GR}───${N}" si=$(awk '/^pswpin/{print $2}' /proc/vmstat 2>/dev/null || echo 0) so=$(awk '/^pswpout/{print $2}' /proc/vmstat 2>/dev/null || echo 0) [ "$si" -gt 0 ] || [ "$so" -gt 0 ] && sc=$Y || sc=$G echo -e " Swap In: ${sc}$si${N} | Swap Out: ${sc}$so${N}" echo -e " ${GR}(数值 > 0 表示内存可能不足)${N}" # 6. 最大进程数的进程 echo -e "\n ${M}6. 进程数最多的服务${N}" echo -e " ${GR}───${N}" ps -eo comm= 2>/dev/null | sort | uniq -c | sort -rn | head -10 | while read -r cnt name; do [ "$cnt" -gt 50 ] && c=$R || c=$GR echo -e " ${c}$cnt${N} $name" done echo echo -e "${GR}👉 性能基准: max-bench.sh | 磁盘分析: max-diskreport.sh${N}"