WEBKT

手把手教你打造服务器监控利器:CPU、内存、磁盘实时监控与告警

162 0 0 0

网站的稳定运行离不开对服务器状态的实时监控。作为一名经验丰富的运维老兵,我深知服务器监控的重要性。今天,我就来手把手教你如何打造一个简易但实用的服务器监控工具,它可以实时显示 CPU、内存、磁盘使用率,并在出现异常时发送告警邮件,让你随时掌握服务器的健康状况。

技术选型

在开始之前,我们需要选择合适的技术栈。这里我推荐使用 Python,因为它简单易学,拥有丰富的库,非常适合快速开发。

  • 监控数据采集: psutil 是一个跨平台的库,可以轻松获取 CPU、内存、磁盘等系统信息。
  • 数据可视化: 虽然我们主要关注告警,但如果需要可视化展示,可以使用 matplotlibplotly 等库。
  • 邮件发送: smtplibemail.mime.text 是 Python 自带的库,可以用来发送邮件。
  • 定时任务: schedule 库可以方便地设置定时任务,定期采集服务器数据。

实现步骤

  1. 安装依赖库

    首先,我们需要安装上面提到的依赖库:

    pip install psutil schedule
    
  2. 编写监控脚本

    接下来,创建一个 Python 脚本,例如 monitor.py,并编写以下代码:

    import psutil
    import smtplib
    from email.mime.text import MIMEText
    import schedule
    import time
    
    # 配置信息
    SMTP_SERVER = 'smtp.example.com' # SMTP服务器地址
    SMTP_PORT = 587 # SMTP服务器端口
    SENDER_EMAIL = 'sender@example.com' # 发件人邮箱
    SENDER_PASSWORD = 'your_password' # 发件人邮箱密码或授权码
    RECEIVER_EMAIL = 'receiver@example.com' # 收件人邮箱
    CPU_THRESHOLD = 80 # CPU使用率阈值,超过此值发送告警
    MEMORY_THRESHOLD = 80 # 内存使用率阈值,超过此值发送告警
    DISK_THRESHOLD = 80 # 磁盘使用率阈值,超过此值发送告警
    DISK_PATH = '/' # 监控的磁盘路径
    
    def send_email(subject, body):
        msg = MIMEText(body, 'plain')
        msg['Subject'] = subject
        msg['From'] = SENDER_EMAIL
        msg['To'] = RECEIVER_EMAIL
    
        try:
            server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
            server.starttls()
            server.login(SENDER_EMAIL, SENDER_PASSWORD)
            server.sendmail(SENDER_EMAIL, RECEIVER_EMAIL, msg.as_string())
            server.quit()
            print('邮件发送成功')
        except Exception as e:
            print(f'邮件发送失败: {e}')
    
    def check_cpu_usage():
        cpu_usage = psutil.cpu_percent(interval=1)
        print(f'CPU 使用率: {cpu_usage}%')
        if cpu_usage > CPU_THRESHOLD:
            subject = 'CPU 使用率过高告警'
            body = f'CPU 使用率已超过 {CPU_THRESHOLD}%,当前使用率为 {cpu_usage}%,请及时处理。'
            send_email(subject, body)
    
    def check_memory_usage():
        memory_usage = psutil.virtual_memory().percent
        print(f'内存 使用率: {memory_usage}%')
        if memory_usage > MEMORY_THRESHOLD:
            subject = '内存 使用率过高告警'
            body = f'内存 使用率已超过 {MEMORY_THRESHOLD}%,当前使用率为 {memory_usage}%,请及时处理。'
            send_email(subject, body)
    
    def check_disk_usage():
        disk_usage = psutil.disk_usage(DISK_PATH).percent
        print(f'磁盘 使用率: {disk_usage}%')
        if disk_usage > DISK_THRESHOLD:
            subject = '磁盘 使用率过高告警'
            body = f'磁盘 {DISK_PATH} 使用率已超过 {DISK_THRESHOLD}%,当前使用率为 {disk_usage}%,请及时处理。'
            send_email(subject, body)
    
    # 设置定时任务
    schedule.every(1).minutes.do(check_cpu_usage)
    schedule.every(1).minutes.do(check_memory_usage)
    schedule.every(1).minutes.do(check_disk_usage)
    
    while True:
        schedule.run_pending()
        time.sleep(1)
    

    代码解释:

    • psutil.cpu_percent(interval=1):获取 CPU 使用率,interval=1 表示每隔 1 秒采样一次。
    • psutil.virtual_memory().percent:获取内存使用率。
    • psutil.disk_usage(DISK_PATH).percent:获取磁盘使用率,DISK_PATH 是要监控的磁盘路径。
    • send_email(subject, body):发送邮件的函数,使用 smtplibemail.mime.text 库。
    • schedule.every(1).minutes.do(check_cpu_usage):每隔 1 分钟执行一次 check_cpu_usage 函数。

    注意事项:

    • 请务必修改代码中的配置信息,包括 SMTP 服务器地址、端口、发件人邮箱、密码、收件人邮箱、CPU/内存/磁盘使用率阈值和磁盘路径。
    • 为了安全起见,建议使用邮箱授权码代替邮箱密码。
  3. 运行监控脚本

    在终端中运行脚本:

    python monitor.py
    

    脚本会定期采集服务器数据,并在达到阈值时发送告警邮件。

进阶优化

  • 日志记录: 将监控数据和告警信息记录到日志文件中,方便后续分析和排查问题。
  • 数据可视化: 使用 matplotlibplotly 等库将监控数据可视化展示,更直观地了解服务器状态。
  • 多服务器监控: 将脚本部署到多台服务器上,集中监控所有服务器的状态。
  • 集成到现有监控系统: 将脚本集成到现有的监控系统,例如 Zabbix、Nagios 等。
  • 使用消息队列: 如果需要处理大量的监控数据,可以使用消息队列(例如 RabbitMQ、Kafka)来解耦数据采集和告警处理。
  • 更精细的监控指标: 除了 CPU、内存和磁盘使用率,还可以监控网络流量、进程数量、IO 等指标,更全面地了解服务器状态。
  • 更灵活的告警策略: 可以根据不同的指标和时间段设置不同的告警阈值,更精准地告警。
  • 使用专业的监控工具: 如果预算充足,可以考虑使用专业的服务器监控工具,例如 Prometheus、Grafana 等,它们提供了更强大的功能和更友好的界面。

总结

通过本文的介绍,相信你已经掌握了如何使用 Python 打造一个简易但实用的服务器监控工具。虽然这个工具比较简单,但它可以帮助你实时了解服务器的健康状况,并在出现异常时及时告警。希望你能根据自己的实际需求,对这个工具进行优化和扩展,打造一个更强大的服务器监控系统。

记住,监控只是手段,保障网站稳定运行才是最终目的。祝你的网站永不宕机!

运维老兵 服务器监控Python告警

评论点评