从零构建高效监控系统
📖 目录导读
- 为什么需要服务器性能监控脚本?
- 核心指标:你需要监控什么?
- 选择脚本语言与工具链
- 编写基础监控脚本(实战示例)
- 进阶技巧:告警、日志与可视化
- 常见问题问答(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分钟后再报) |
📊 可扩展方向
- 历史趋势分析:将数据存入数据库,生成日报/周报
- 智能阈值:基于机器学习动态调整告警阈值
- 自动化修复:检测到异常后自动执行恢复脚本(如重启服务)
编写服务器性能监控脚本的核心是“以简驭繁”——用最轻量的代码,采集最关键的指标,触发最及时的告警,从今天的实战示例开始,逐步构建适合自己业务的监控体系,是每位运维工程师的必修课。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播