如何编写服务器性能监控脚本

wen 实用脚本 1

从零构建高效监控系统

📖 目录导读

  1. 为什么需要服务器性能监控脚本?
  2. 核心指标:你需要监控什么?
  3. 选择脚本语言与工具链
  4. 编写基础监控脚本(实战示例)
  5. 进阶技巧:告警、日志与可视化
  6. 常见问题问答(FAQ)
  7. 最佳实践与避坑指南

为什么需要服务器性能监控脚本?

在现代运维体系中,服务器监控脚本是保障业务稳定性的“第一道防线”,相比商业监控工具(如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
    }

📈 可视化输出

将采集数据写入PrometheusInfluxDB,配合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 等交互式命令,改用 psutilsysstat 工具
  • 不要在同一台服务器运行多个监控脚本

❓ Q2:如何监控远程服务器?

:三种方案:

  1. SSH无密码连接:主控机执行 ssh user@remote_ip "命令" 采集
  2. Agent模式:远程服务器运行脚本,通过HTTP推送数据到中央服务器
  3. SNMP协议:适用于网络设备监控

❓ Q3:脚本突然不运行了怎么办?

:排查步骤:

  1. 检查crontab是否加载:crontab -l
  2. 查看脚本执行日志:tail -f /var/log/server_monitor/monitor.log
  3. 手动执行脚本看报错:python3 /opt/scripts/monitor.py
  4. 检查脚本权限:chmod +x script.py

最佳实践与避坑指南

✅ 规范建议

  1. 使用shebang行#!/usr/bin/env python3 避免环境问题
  2. 错误处理:添加 try-except 捕获异常,防止脚本中断
  3. 避免硬编码:配置项写入外部 config.json 文件
  4. 版本控制:脚本纳入Git管理,方便回滚与协同

❌ 常见错误

错误 后果 解决
采集间隔太短 抢占CPU资源 设置最小间隔≥1秒
日志不轮转 磁盘占满 配置logrotate
忽略swap监控 内存溢出时无法预警 添加swap使用率监控
告警频率过高 告警疲劳 设置重试间隔(如5分钟后再报)

📊 可扩展方向

  • 历史趋势分析:将数据存入数据库,生成日报/周报
  • 智能阈值:基于机器学习动态调整告警阈值
  • 自动化修复:检测到异常后自动执行恢复脚本(如重启服务)

编写服务器性能监控脚本的核心是“以简驭繁”——用最轻量的代码,采集最关键的指标,触发最及时的告警,从今天的实战示例开始,逐步构建适合自己业务的监控体系,是每位运维工程师的必修课。

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