如何写CPU负载监控脚本

wen 实用脚本 25

如何写CPU负载监控脚本:从入门到企业级实战指南

目录导读

  1. CPU负载监控的核心指标与原理
  2. 基础脚本编写:使用系统命令监控负载
  3. 脚本进阶:阈值告警与日志记录
  4. 企业级方案:集成Prometheus与Grafana
  5. 常见问题与优化技巧
  6. 问答环节:解决你遇到的典型问题

CPU负载监控的核心指标与原理

CPU负载(Load Average)是衡量系统繁忙程度的关键指标,通常显示为1分钟、5分钟和15分钟的平均值,你需要理解以下核心概念:

如何写CPU负载监控脚本

  • 用户态CPU:执行用户应用程序的时间占比
  • 系统态CPU:操作系统内核执行任务的时间占比
  • I/O等待:CPU等待磁盘或网络I/O的时间
  • 软中断/硬中断:处理硬件或软件中断的时间

重要规则:单个核心的Load Average如果持续高于0.7,表示系统可能过载;若超过1.0,则需紧急排查。


基础脚本编写:使用系统命令监控负载

最简单的CPU负载监控脚本可以使用topuptime/proc/loadavg文件,以下是一个核心示例:

#!/bin/bash
# 获取当前1分钟平均负载
load=$(awk '{print $1}' /proc/loadavg)
# 获取CPU核心数
cores=$(nproc)
# 计算负载百分比(负载/核心数*100)
load_percent=$(echo "scale=2; $load * 100 / $cores" | bc)
echo "$(date) - 当前负载: $load (核心数: $cores, 百分比: $load_percent%)"

关键点解析

  • /proc/loadavg是Linux内核实时文件,读取速度远快于top
  • 使用nproc获取核心数,避免单核/多核误判
  • 将负载转换为百分比,更直观判断阈值

运行方式:将脚本保存为cpu_monitor.sh,添加执行权限后通过while true; do ./cpu_monitor.sh; sleep 5; done连续运行。


脚本进阶:阈值告警与日志记录

企业级脚本需要包含告警机制和历史数据持久化,以下是一个增强版:

#!/bin/bash
LOG_FILE="/var/log/cpu_monitor.log"
ALERT_THRESHOLD=80  # 负载百分比告警阈值
ALERT_EMAIL="admin@example.com"
while true; do
  load=$(awk '{print $1}' /proc/loadavg)
  cores=$(nproc)
  load_percent=$(echo "scale=2; $load * 100 / $cores" | bc)
  timestamp=$(date +"%Y-%m-%d %H:%M:%S")
  echo "$timestamp | 负载: $load | 核心数: $cores | 百分比: $load_percent%" >> $LOG_FILE
  if (( $(echo "$load_percent > $ALERT_THRESHOLD" | bc -l) )); then
    echo "警告: CPU负载异常 ($load_percent%) - 时间: $timestamp" | \
      mail -s "CPU负载告警" $ALERT_EMAIL
  fi
  sleep 60  # 每分钟检查一次
done

关键改进

  • 自动记录到日志文件,便于回溯分析
  • 使用bc进行浮点数比较,避免Shell原生整数运算的缺陷
  • 通过mail命令发送邮件告警(需提前配置sendmail或postfix)

最佳实践:将告警阈值设置为动态自适应值,例如根据最近15分钟平均负载动态调整告警基线。


企业级方案:集成Prometheus与Grafana

对于大规模集群监控,推荐使用Prometheus + node_exporter + Grafana组合:

步骤1:安装node_exporter

wget https://github.com/prometheus/node_exporter/releases/latest/download/node_exporter-*.tar.gz
tar xvf node_exporter-*.tar.gz
./node_exporter --web.listen-address=:9100 &

步骤2:配置Prometheus抓取CPU指标

# prometheus.yml
scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['server_ip:9100']

步骤3:在Grafana中导入仪表盘
使用ID 11074(Node Exporter Full模板),可实时查看CPU每核使用率、上下文切换、平均负载等20+指标。

优势:无需编写脚本即可获得可视化监控,且数据持久化在Prometheus中,支持跨周/月分析。


常见问题与优化技巧

问题1:脚本监控的数值与top不一致怎么办?

/proc/loadavg读取的是瞬时值,而top是采样周期平均值,建议脚本增加连续采样3次后取中间值的逻辑。

问题2:高负载时脚本自身占用CPU过高?

:优化方案包括:

  • 减少sleep间隔,从1秒改为5-60秒
  • 使用bc代替awk进行浮点运算(bc更轻量)
  • 避免频繁磁盘写入,可采用内存环状缓冲区(如/dev/shm

问题3:如何监控特定进程的CPU占用率?

:使用ps -p PID -o %cpu --no-headers,配合pidstat工具更精准。


问答环节:解决你遇到的典型问题

Q:我的监控脚本总显示100%负载,但系统很流畅,为什么?
A:你可能混淆了“CPU使用率”和“Load Average”,Load Average超过核心数才表示超载,例如4核CPU负载5.0才算过载,请修改脚本中的基准值判断。

Q:有没有开箱即用的CPU监控脚本推荐?
A:推荐使用htop命令行工具(安装sudo apt install htop),它提供实时彩色视图,服务器场景可选用glances,支持Web API输出。

Q:如何监控历史趋势,而不仅仅当前值?
A:使用ts(moreutils包)为每行输出添加时间戳,配合tail -f /var/log/cpu_monitor.log | grep "2025"过滤,或直接存入InfluxDB时序数据库。

Q:我的脚本在Kubernetes容器中无法读取CPU负载?
A:容器内只能看到自己的cgroup限制,需通过cat /sys/fs/cgroup/cpu/cpuacct.usage获取CPU时间,而非物理机的/proc/loadavg


通过以上从基础命令到企业级系统的完整讲解,你可以根据实际环境选择最适合的CPU负载监控方案,监控的终极目标是预防性维护,而非事后告警——建议将脚本结合Ansible/Puppet等配置管理工具,实现自动化部署与告警动作联动。

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