从零构建高效监控系统
📖 目录导读
- 为什么需要服务器性能监控脚本?
- 核心指标:你需要监控什么?
- 选择脚本语言与工具链
- 编写基础监控脚本(实战示例)
- 进阶技巧:告警、日志与可视化
- 常见问题问答(FAQ)
- 最佳实践与避坑指南
为什么需要服务器性能监控脚本?
在现代运维体系中,服务器监控脚本是保障业务稳定性的“第一道防线”,相比商业监控工具(如Zabbix、Prometheus),自定义脚本具有以下优势:

- 轻量级:无需安装额外代理,直接利用系统自带命令
- 高度定制:精准采集业务特有指标(如每秒订单量、数据库连接数)
- 成本可控:零授权费用,适合中小企业或单服务器场景
📌 核心逻辑:监控脚本 = 数据采集 + 阈值判断 + 告警触发
核心指标:你需要监控什么?
| 指标类别 | 具体指标 | 采集命令(Linux) | 关键阈值 |
|---|---|---|---|
| CPU | 使用率、负载 | top mpstat |
持续>80%告警 |
| 内存 | 使用率、Swap | free -m |
使用率>90%告警 |
| 磁盘 | I/O、使用率 | iostat df -h |
使用率>85%告警 |
| 网络 | 带宽、连接数 | ss -s iftop |
连接数>10000告警 |
| 进程 | 关键进程状态 | ps aux |
进程不存在告警 |
推荐监控频率:
- 关键指标(CPU、内存):每1分钟采集
- 普通指标(磁盘):每5分钟采集
- 业务指标(如登录失败次数):实时监控
选择脚本语言与工具链
🧰 推荐方案对比
| 语言 | 适用场景 | 示例工具 |
|---|---|---|
| Bash | 快速原型、简单指标采集 | awk grep curl |
| Python | 复杂逻辑、数据处理、告警集成 | psutil requests |
| Go | 高性能、并发监控、二进制部署 | gopsutil influxdb |
推荐组合:
- 初学者:Bash + crontab(零依赖)
- 进阶用户:Python + psutil + 钉钉/微信告警
编写基础监控脚本(实战示例)
🔧 脚本功能设计
- 采集CPU、内存、磁盘使用率
- 若超过阈值,输出告警信息
- 记录日志到文件
🖥️ 完整代码(Python版)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import psutil
import datetime
import os
# 配置阈值
CPU_THRESHOLD = 80 # %
MEM_THRESHOLD = 90 # %
DISK_THRESHOLD = 85 # %
def get_cpu_usage():
return psutil.cpu_percent(interval=1)
def get_mem_usage():
mem = psutil.virtual_memory()
return mem.percent
def get_disk_usage():
disk = psutil.disk_usage('/')
return disk.percent
def write_log(message):
timestamp = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
log_dir = '/var/log/server_monitor'
if not os.path.exists(log_dir):
os.makedirs(log_dir)
with open(f'{log_dir}/monitor.log', 'a') as f:
f.write(f'[{timestamp}] {message}\n')
def check_and_alert():
cpu = get_cpu_usage()
mem = get_mem_usage()
disk = get_disk_usage()
alerts = []
if cpu > CPU_THRESHOLD:
alerts.append(f'CPU 告警: {cpu}% (阈值{CPU_THRESHOLD}%)')
if mem > MEM_THRESHOLD:
alerts.append(f'内存告警: {mem}% (阈值{MEM_THRESHOLD}%)')
if disk > DISK_THRESHOLD:
alerts.append(f'磁盘告警: {disk}% (阈值{DISK_THRESHOLD}%)')
if alerts:
msg = ' | '.join(alerts)
write_log(msg)
send_alert(msg) # 可集成告警方法
else:
write_log(f'状态正常 CPU={cpu}% 内存={mem}% 磁盘={disk}%')
if __name__ == '__main__':
check_and_alert()
⏰ 使用crontab定时执行
# 每5分钟执行一次 */5 * * * * /usr/bin/python3 /opt/scripts/monitor.py
进阶技巧:告警、日志与可视化
🚨 告警集成(以钉钉为例)
import requests
def send_alert(msg):
webhook_url = 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN'
data = {
"msgtype": "text",
"text": {"content": f"【服务器告警】{msg}"}
}
requests.post(webhook_url, json=data)
📊 日志轮转建议
- 使用
logrotate管理脚本日志 - 配置
/etc/logrotate.d/monitor.conf:/var/log/server_monitor/*.log { daily rotate 7 compress delaycompress missingok notifempty }
📈 可视化输出
将采集数据写入Prometheus或InfluxDB,配合Grafana生成看板,示例数据推送:
from influxdb import InfluxDBClient
client = InfluxDBClient(host='localhost', port=8086)
json_body = [
{
"measurement": "server_perf",
"tags": {"host": "web01"},
"fields": {"cpu": cpu, "mem": mem, "disk": disk}
}
]
client.write_points(json_body)
常见问题问答(FAQ)
❓ Q1:监控脚本会影响服务器性能吗?
答:合理设计的影响极小,建议:
- 采集间隔不低于1秒(使用
interval=1参数) - 避免使用
top等交互式命令,改用psutil或sysstat工具 - 不要在同一台服务器运行多个监控脚本
❓ Q2:如何监控远程服务器?
答:三种方案:
- SSH无密码连接:主控机执行
ssh user@remote_ip "命令"采集 - Agent模式:远程服务器运行脚本,通过HTTP推送数据到中央服务器
- SNMP协议:适用于网络设备监控
❓ Q3:脚本突然不运行了怎么办?
答:排查步骤:
- 检查crontab是否加载:
crontab -l - 查看脚本执行日志:
tail -f /var/log/server_monitor/monitor.log - 手动执行脚本看报错:
python3 /opt/scripts/monitor.py - 检查脚本权限:
chmod +x script.py
最佳实践与避坑指南
✅ 规范建议
- 使用shebang行:
#!/usr/bin/env python3避免环境问题 - 错误处理:添加
try-except捕获异常,防止脚本中断 - 避免硬编码:配置项写入外部
config.json文件 - 版本控制:脚本纳入Git管理,方便回滚与协同
❌ 常见错误
| 错误 | 后果 | 解决 |
|---|---|---|
| 采集间隔太短 | 抢占CPU资源 | 设置最小间隔≥1秒 |
| 日志不轮转 | 磁盘占满 | 配置logrotate |
| 忽略swap监控 | 内存溢出时无法预警 | 添加swap使用率监控 |
| 告警频率过高 | 告警疲劳 | 设置重试间隔(如5分钟后再报) |
📊 可扩展方向
- 历史趋势分析:将数据存入数据库,生成日报/周报
- 智能阈值:基于机器学习动态调整告警阈值
- 自动化修复:检测到异常后自动执行恢复脚本(如重启服务)
编写服务器性能监控脚本的核心是“以简驭繁”——用最轻量的代码,采集最关键的指标,触发最及时的告警,从今天的实战示例开始,逐步构建适合自己业务的监控体系,是每位运维工程师的必修课。