怎样实现高负载进程定位脚本

wen 实用脚本 30

本文目录导读:

怎样实现高负载进程定位脚本

  1. 基础版高负载进程定位脚本
  2. 增强版自动化监控脚本
  3. 使用说明
  4. 主要功能说明
  5. 自定义配置

我来为您提供一个高负载进程自动定位的Shell脚本方案,这个脚本可以自动检测系统负载并定位高消耗进程。

基础版高负载进程定位脚本

#!/bin/bash
# 高负载进程定位脚本
# 通过CPU、内存、I/O等多维度检测高负载进程
# 头部信息
echo "=========================================="
echo "  系统负载监控脚本 - $(date)"
echo "=========================================="
# 1. 系统负载概览
echo -e "\n[系统负载信息]"
uptime
echo ""
# 2. Top CPU消耗进程
echo "[Top 10 CPU消耗进程]"
ps aux --sort=-%cpu | head -11
echo ""
# 3. Top 内存消耗进程
echo "[Top 10 内存消耗进程]"
ps aux --sort=-%mem | head -11
echo ""
# 4. 检查高负载线程
echo "[高CPU使用率的线程]"
top -b -n1 -H | grep -E "^\s*[0-9]+" | sort -k9 -rn | head -10
echo ""
# 5. 分析进程详细信息
echo "[潜在问题进程分析]"
high_load_processes() {
    # 检查CPU使用率超过50%的进程
    ps aux | awk '$3 > 50.0 {print $0}'
}
high_load_processes | while read line; do
    if [ ! -z "$line" ]; then
        echo "高负载进程: $line"
        pid=$(echo $line | awk '{print $2}')
        echo "进程详细信息:"
        ls -la /proc/$pid/exe 2>/dev/null
        cat /proc/$pid/cmdline 2>/dev/null | tr '\0' ' '
        echo ""
    fi
done
# 6. 检测僵尸进程
echo "[僵尸进程检测]"
zombie_count=$(ps aux | awk '{print $8}' | grep -c "Z")
if [ $zombie_count -gt 0 ]; then
    echo "发现 $zombie_count 个僵尸进程"
    ps aux | awk '$8 ~ /Z/ {print "PID: "$2" 状态: "$8" 命令: "$11}'
else
    echo "未发现僵尸进程"
fi
# 7. I/O wait分析
echo -e "\n[磁盘I/O分析]"
if command -v iostat &> /dev/null; then
    iostat -x 1 2 | tail -5
else
    echo "iostat未安装,请安装sysstat包"
fi
# 8. 网络连接分析
echo -e "\n[网络连接统计]"
netstat -an | grep -c "ESTABLISHED"
echo "当前建立的连接数"
# 9. 监控建议
echo -e "\n[监控建议]"
echo "----------------------------------------"
echo "1. 检查占用资源最高的进程是否需要优化"
echo "2. 考虑是否需要增加系统资源"
echo "3. 查看应用日志定位具体问题"
echo "4. 检查是否存在内存泄漏"
echo "5. 考虑负载均衡"

增强版自动化监控脚本

#!/bin/bash
# 配置部分
ALERT_CPU=80          # CPU告警阈值(%)
ALERT_MEM=90          # 内存告警阈值(%)
ALERT_LOAD=5          # 负载告警阈值
LOG_FILE="/var/log/high_load_monitor.log"
INTERVAL=5            # 检测间隔(秒)
# 函数:记录日志
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# 函数:获取系统负载
get_system_load() {
    uptime | awk -F'load average:' '{print $2}' | awk -F',' '{print $1}'
}
# 函数:定位高负载进程
find_high_load_processes() {
    local load=$(get_system_load)
    # 系统负载分析
    log_message "当前系统负载: $load"
    # 检查CPU使用率
    ps aux --sort=-%cpu | awk 'NR>1 && $3 > '$ALERT_CPU' {
        printf("高CPU进程 - PID: %s, CPU: %s%%, 命令: %s\n", $2, $3, $11)
        system("ps -p " $2 " -o pid,ppid,user,pcpu,pmem,etime,cmd --no-headers")
    }'
    # 检查内存使用率
    ps aux --sort=-%mem | awk 'NR>1 && $4 > '$ALERT_MEM' {
        printf("高内存进程 - PID: %s, MEM: %s%%, 命令: %s\n", $2, $4, $11)
    }'
}
# 函数:深度分析进程
deep_process_analysis() {
    local pid=$1
    echo "=== 进程 $pid 深度分析 ==="
    # 进程基本信息
    echo "进程名称: $(cat /proc/$pid/comm 2>/dev/null)"
    echo "父进程ID: $(cat /proc/$pid/status 2>/dev/null | grep PPid | awk '{print $2}')"
    # 线程分析
    echo "线程数量: $(ls /proc/$pid/task/ 2>/dev/null | wc -l)"
    # 文件描述符
    echo "打开文件数: $(ls /proc/$pid/fd/ 2>/dev/null | wc -l)"
    # 内存分析
    if [ -f /proc/$pid/status ]; then
        echo "内存信息:"
        cat /proc/$pid/status | grep -E "VmRSS|VmSize|VmPeak|Threads"
    fi
}
# 主监控循环
monitor_loop() {
    while true; do
        clear
        log_message "=== 开始系统负载检查 ==="
        # 获取系统负载
        current_load=$(get_system_load)
        log_message "系统负载: $current_load"
        # 检查是否超过阈值
        if (( $(echo "$current_load > $ALERT_LOAD" | bc -l) )); then
            log_message "警告: 系统负载超过阈值!"
            # 定位高负载进程
            find_high_load_processes
            # 对Top进程进行深度分析
            top_pid=$(ps aux --sort=-%cpu | awk 'NR==2{print $2}')
            if [ ! -z "$top_pid" ]; then
                deep_process_analysis $top_pid
            fi
            # 发送告警(可选)
            # send_alert "系统负载过高"
        else
            log_message "系统负载正常"
        fi
        sleep $INTERVAL
    done
}
# 主函数
main() {
    echo "高负载监控脚本启动"
    echo "日志文件: $LOG_FILE"
    echo "检测间隔: $INTERVAL 秒"
    echo "CPU告警阈值: $ALERT_CPU%"
    echo "内存告警阈值: $ALERT_MEM%"
    echo "按 Ctrl+C 停止监控"
    echo ""
    # 检查必要命令
    for cmd in ps top uptime bc; do
        if ! command -v $cmd &> /dev/null; then
            echo "错误: 缺少命令 $cmd"
            exit 1
        fi
    done
    # 启动监控
    # 取消注释下一行来启用循环监控
    # monitor_loop
    # 单次执行
    log_message "=== 高负载进程检测 ==="
    find_high_load_processes
    log_message "=== 检测完成 ==="
}
# 执行主函数
main

使用说明

保存脚本

# 保存为 find_high_load.sh
nano find_high_load.sh

添加执行权限

chmod +x find_high_load.sh

运行脚本

# 单次运行
./find_high_load.sh
# 如果需要持续监控
# 取消脚本中 monitor_loop 函数的注释
# 然后运行
./find_high_load.sh &
# 实时查看日志
tail -f /var/log/high_load_monitor.log

配置定时任务

# 添加到 crontab 每5分钟执行
crontab -e
*/5 * * * * /path/to/find_high_load.sh

主要功能说明

  1. CPU负载检测:识别CPU使用率过高的进程
  2. 内存泄漏检测:监控内存使用率异常的进程
  3. I/O等待分析:检测磁盘I/O瓶颈
  4. 僵尸进程检测:识别和清理僵尸进程
  5. 线程分析:查看进程的线程数量
  6. 文件描述符:监控进程打开的文件数量
  7. 网络连接:统计网络连接状态

自定义配置

您可以根据需要修改脚本中的阈值:

  • ALERT_CPU=80:CPU使用率告警阈值
  • ALERT_MEM=90:内存使用率告警阈值
  • ALERT_LOAD=5:系统负载告警阈值
  • INTERVAL=5:监控间隔时间

这个脚本可以帮助您快速定位系统高负载的根源,适合服务器运维和性能调优场景。

抱歉,评论功能暂时关闭!