本文目录导读:

- 方案一:Shell 脚本(最常用,适合 Linux 系统)
- 方案二:Python 脚本(更灵活,支持跨平台)
- 方案三:使用 Prometheus + Alertmanager(生产环境推荐)
- 常用阈值参考(通用建议)
- 关于“脚本怎样设置”的具体说明
在运维监控领域,设置资源告警阈值通常有几种方式,取决于你使用的工具(如自研脚本、Prometheus、Zabbix、云平台等)。
这里为你提供 基于 Shell 脚本(Linux 系统) 和 Python 脚本 的两种常见方案,用于设置 CPU、内存、磁盘的告警阈值。
Shell 脚本(最常用,适合 Linux 系统)
创建一个 resource_alarm.sh 文件:
#!/bin/bash
# ========== 配置区域:在这里修改阈值 ==========
CPU_THRESHOLD=80 # CPU 使用率超过 80% 告警
MEM_THRESHOLD=90 # 内存使用率超过 90% 告警
DISK_THRESHOLD=85 # 磁盘使用率超过 85% 告警
ALARM_EMAIL="admin@example.com" # 告警通知邮箱(或使用其他通知方式)
# ============================================
# 1. 检查 CPU 使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}' | cut -d'.' -f1)
# 或者使用:CPU_USAGE=$(mpstat 1 1 | awk '/Average/ {print 100 - $NF}')
if [ "$CPU_USAGE" -gt "$CPU_THRESHOLD" ]; then
echo "[ALARM] CPU 使用率过高: ${CPU_USAGE}% (阈值: ${CPU_THRESHOLD}%)"
# 发送邮件或触发其他动作
# mail -s "CPU Alert" $ALARM_EMAIL <<< "CPU usage is ${CPU_USAGE}%"
fi
# 2. 检查内存使用率
MEM_TOTAL=$(free -m | awk '/Mem:/ {print $2}')
MEM_USED=$(free -m | awk '/Mem:/ {print $3}')
MEM_USAGE=$(( (MEM_USED * 100) / MEM_TOTAL ))
if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
echo "[ALARM] 内存使用率过高: ${MEM_USAGE}% (阈值: ${MEM_THRESHOLD}%)"
fi
# 3. 检查磁盘使用率(检查根分区)
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | cut -d'%' -f1)
if [ "$DISK_USAGE" -gt "$DISK_THRESHOLD" ]; then
echo "[ALARM] 磁盘使用率过高: ${DISK_USAGE}% (阈值: ${DISK_THRESHOLD}%)"
fi
# 4.(可选)检查负载
LOAD_THRESHOLD=5.0
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}' | cut -d',' -f1 | tr -d ' ')
if (( $(echo "$LOAD_AVG > $LOAD_THRESHOLD" | bc -l) )); then
echo "[ALARM] 系统负载过高: $LOAD_AVG (阈值: $LOAD_THRESHOLD)"
fi
使用方法:
- 将脚本添加到 crontab 中,每分钟执行一次:
crontab -e添加:* * * * * /path/to/resource_alarm.sh >> /var/log/alarm.log 2>&1 - 修改阈值后,直接编辑
CPU_THRESHOLD、MEM_THRESHOLD等变量即可。
Python 脚本(更灵活,支持跨平台)
创建一个 resource_alarm.py 文件:
#!/usr/bin/env python3
import psutil
import smtplib
from email.mime.text import MIMEText
# ========== 配置区域:在这里修改阈值 ==========
CPU_THRESHOLD = 80.0 # int 或 float
MEM_THRESHOLD = 90.0
DISK_THRESHOLD = 85.0
ALARM_EMAIL = "admin@example.com"
SMTP_SERVER = "smtp.example.com"
SMTP_PORT = 587
EMAIL_USER = "noreply@example.com"
EMAIL_PASS = "your_password"
# ============================================
def send_alarm(subject, body):
msg = MIMEText(body)
msg['Subject'] = subject
msg['From'] = EMAIL_USER
msg['To'] = ALARM_EMAIL
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
server.starttls()
server.login(EMAIL_USER, EMAIL_PASS)
server.send_message(msg)
# 1. CPU 使用率
cpu_usage = psutil.cpu_percent(interval=1)
if cpu_usage > CPU_THRESHOLD:
message = f"CPU 使用率: {cpu_usage}% (阈值: {CPU_THRESHOLD}%)"
print(f"[ALARM] {message}")
# send_alarm("CPU Alert", message)
# 2. 内存使用率
mem = psutil.virtual_memory()
mem_usage = mem.percent
if mem_usage > MEM_THRESHOLD:
message = f"内存使用率: {mem_usage}% (阈值: {MEM_THRESHOLD}%)"
print(f"[ALARM] {message}")
# 3. 磁盘使用率
disk_usage = psutil.disk_usage('/').percent
if disk_usage > DISK_THRESHOLD:
message = f"磁盘使用率: {disk_usage}% (阈值: {DISK_THRESHOLD}%)"
print(f"[ALARM] {message}")
# 4. 网络流量、进程数等其他资源可类似添加
运行前准备:
pip install psutil
使用 Prometheus + Alertmanager(生产环境推荐)
如果你在云原生环境或需要更复杂的告警规则,通常通过配置文件设置阈值,脚本只是执行器。
Prometheus 告警规则示例(在 rules.yml 中):
groups:
- name: resource_alerts
rules:
- alert: HighCpuUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m]))) * 100 > 80
for: 5m
labels:
severity: critical
annotations:
summary: "CPU 使用率过高 {{ $value }}%"
threshold: "80%"
优点:无需手动写脚本,通过表达式管理阈值,且支持动态调整。
常用阈值参考(通用建议)
| 资源 | 建议警告阈值(Warning) | 建议严重阈值(Critical) | 说明 |
|---|---|---|---|
| CPU | 80% | 90% | 长期超过 80% 需要扩容 |
| 内存 | 80% | 95% | 注意是否有 SWAP 抖动 |
| 磁盘 | 80% | 90% | 根据读写频率可调整 |
| 负载 | 等于 CPU 核心数 | 核心数 * 2 | 4 核 CPU 阈值设为 8 |
| 网络流量 | 带宽的 70% | 带宽的 90% | 需要提前知道带宽上限 |
脚本怎样设置”的具体说明
- 明确硬编码 vs 配置文件:直接在脚本中写死(如上示例)适合小规模;推荐将阈值写在
.env、config.ini或命令行参数中,方便动态调整。 - 通知方式:除了输出到控制台,可以集成邮件、钉钉/企业微信 Webhook 机器人、Slack、短信等,例如在脚本中加入
curl -X POST -d "msg=报警内容" https://qyapi.weixin.qq.com/...。 - 防重复告警:设置一个状态文件(如
/tmp/alert_sent),若已经发送过告警且资源仍超标,则不再重复发送,直到恢复正常后再重置。 - 阈值分组:不同业务模块可以使用不同阈值,例如数据库服务器内存阈值设 80%,而 Web 服务器可以设 90%。
| 场景 | 推荐方式 |
|---|---|
| 临时/快速检测 | Shell 脚本(crontab 定时执行) |
| 需要跨平台或复杂逻辑 | Python + psutil 库 |
| 生产环境/集群管理 | Prometheus + Alertmanager / Zabbix / 云监控 |
| 微服务/容器化 | Kubernetes HPA / 自定义 Operator |
根据你的实际环境(Linux/Windows、单机/集群、是否需要可视化),选择最适合的一种方式即可,需要进一步示例请说明具体场景。