Qwen3.5-27B保姆级教程:如何通过supervisor配置实现服务CPU/GPU使用率告警联动

1. 引言

在部署和使用Qwen3.5-27B这样的大型多模态模型时,监控服务的资源使用情况至关重要。本教程将详细介绍如何通过supervisor配置实现服务CPU/GPU使用率告警联动,帮助您及时发现并解决潜在的性能问题。

Qwen3.5-27B作为一款视觉多模态理解模型,在4 x RTX 4090 D 24GB环境下运行时,合理监控GPU使用率可以避免资源耗尽导致的服务中断。通过本教程,您将学会:

  • 配置supervisor监控Qwen3.5-27B服务
  • 设置CPU/GPU使用率告警阈值
  • 实现告警自动通知
  • 常见问题排查方法

2. 环境准备

2.1 确认当前部署环境

在开始配置前,请确保您已经按照标准流程部署了Qwen3.5-27B服务。可以通过以下命令检查服务状态:

supervisorctl status qwen3527

预期输出应显示服务为RUNNING状态:

qwen3527                        RUNNING   pid 12345, uptime 1:23:45

2.2 安装必要工具

我们需要安装几个监控工具:

# 安装GPU监控工具
pip install nvidia-ml-py3

# 安装系统监控工具
apt-get install -y sysstat

3. supervisor监控配置

3.1 创建监控脚本

/opt/qwen3527-27b目录下创建监控脚本monitor_resources.py

#!/usr/bin/env python3
import os
import psutil
import pynvml
from datetime import datetime

# 监控阈值配置
CPU_THRESHOLD = 90  # CPU使用率百分比
GPU_THRESHOLD = 85  # GPU使用率百分比
MEMORY_THRESHOLD = 90  # 内存使用率百分比

def check_resources():
    # 初始化NVML
    pynvml.nvmlInit()
    
    # 获取CPU使用率
    cpu_percent = psutil.cpu_percent(interval=1)
    
    # 获取内存使用率
    memory = psutil.virtual_memory()
    mem_percent = memory.percent
    
    # 获取GPU使用率
    device_count = pynvml.nvmlDeviceGetCount()
    gpu_percent = 0
    for i in range(device_count):
        handle = pynvml.nvmlDeviceGetHandleByIndex(i)
        util = pynvml.nvmlDeviceGetUtilizationRates(handle)
        gpu_percent = max(gpu_percent, util.gpu)
    
    # 生成报告
    report = {
        "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        "cpu_percent": cpu_percent,
        "memory_percent": mem_percent,
        "gpu_percent": gpu_percent,
        "exceed_threshold": False
    }
    
    # 检查是否超过阈值
    if cpu_percent > CPU_THRESHOLD or gpu_percent > GPU_THRESHOLD or mem_percent > MEMORY_THRESHOLD:
        report["exceed_threshold"] = True
    
    return report

if __name__ == "__main__":
    report = check_resources()
    print(report)
    if report["exceed_threshold"]:
        # 这里可以添加告警通知逻辑
        print("警告:资源使用率超过阈值!")

3.2 配置supervisor监控任务

编辑supervisor配置文件/etc/supervisor/conf.d/qwen3527_monitor.conf

[program:qwen3527_monitor]
command=/usr/bin/python3 /opt/qwen3527-27b/monitor_resources.py
directory=/opt/qwen3527-27b
autostart=true
autorestart=true
startsecs=10
startretries=3
user=root
redirect_stderr=true
stdout_logfile=/var/log/qwen3527_monitor.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=5
environment=PYTHONUNBUFFERED="1"

3.3 更新supervisor配置

supervisorctl reread
supervisorctl update

4. 告警联动配置

4.1 邮件告警设置

修改监控脚本,添加邮件通知功能:

#!/usr/bin/env python3
import os
import psutil
import pynvml
from datetime import datetime
import smtplib
from email.mime.text import MIMEText

# 配置部分
SMTP_SERVER = "smtp.example.com"
SMTP_PORT = 587
SMTP_USER = "your_email@example.com"
SMTP_PASSWORD = "your_password"
ALERT_EMAIL = "admin@example.com"

# 监控阈值配置
CPU_THRESHOLD = 90
GPU_THRESHOLD = 85
MEMORY_THRESHOLD = 90

def send_alert(subject, message):
    msg = MIMEText(message)
    msg['Subject'] = subject
    msg['From'] = SMTP_USER
    msg['To'] = ALERT_EMAIL
    
    try:
        server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
        server.starttls()
        server.login(SMTP_USER, SMTP_PASSWORD)
        server.sendmail(SMTP_USER, [ALERT_EMAIL], msg.as_string())
        server.quit()
    except Exception as e:
        print(f"发送邮件失败: {str(e)}")

def check_resources():
    # 初始化NVML
    pynvml.nvmlInit()
    
    # 获取资源使用率
    cpu_percent = psutil.cpu_percent(interval=1)
    memory = psutil.virtual_memory()
    mem_percent = memory.percent
    
    device_count = pynvml.nvmlDeviceGetCount()
    gpu_percent = 0
    for i in range(device_count):
        handle = pynvml.nvmlDeviceGetHandleByIndex(i)
        util = pynvml.nvmlDeviceGetUtilizationRates(handle)
        gpu_percent = max(gpu_percent, util.gpu)
    
    report = {
        "timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        "cpu_percent": cpu_percent,
        "memory_percent": mem_percent,
        "gpu_percent": gpu_percent,
        "exceed_threshold": False,
        "thresholds": {
            "cpu": CPU_THRESHOLD,
            "gpu": GPU_THRESHOLD,
            "memory": MEMORY_THRESHOLD
        }
    }
    
    # 检查阈值并发送告警
    if cpu_percent > CPU_THRESHOLD or gpu_percent > GPU_THRESHOLD or mem_percent > MEMORY_THRESHOLD:
        report["exceed_threshold"] = True
        alert_subject = "Qwen3.5-27B 资源使用告警"
        alert_message = f"""
资源使用率超过阈值:
- 时间: {report['timestamp']}
- CPU使用率: {cpu_percent}% (阈值: {CPU_THRESHOLD}%)
- GPU使用率: {gpu_percent}% (阈值: {GPU_THRESHOLD}%)
- 内存使用率: {mem_percent}% (阈值: {MEMORY_THRESHOLD}%)

请立即检查服务状态!
"""
        send_alert(alert_subject, alert_message)
    
    return report

if __name__ == "__main__":
    report = check_resources()
    print(report)

4.2 企业微信/钉钉机器人告警

如果您使用企业微信或钉钉,可以添加机器人通知:

import requests

def send_dingtalk_alert(message):
    webhook_url = "https://oapi.dingtalk.com/robot/send?access_token=your_token"
    headers = {"Content-Type": "application/json"}
    data = {
        "msgtype": "text",
        "text": {
            "content": message
        }
    }
    try:
        requests.post(webhook_url, json=data, headers=headers)
    except Exception as e:
        print(f"发送钉钉通知失败: {str(e)}")

# 在check_resources函数中调用
if cpu_percent > CPU_THRESHOLD or gpu_percent > GPU_THRESHOLD or mem_percent > MEMORY_THRESHOLD:
    # ...原有代码...
    dingtalk_msg = f"Qwen3.5-27B资源告警: CPU {cpu_percent}%, GPU {gpu_percent}%, 内存 {mem_percent}%"
    send_dingtalk_alert(dingtalk_msg)

5. 高级监控配置

5.1 历史数据记录

添加资源使用历史记录功能:

import json
from pathlib import Path

HISTORY_FILE = "/var/log/qwen3527_resource_history.json"

def save_history(report):
    history = []
    if Path(HISTORY_FILE).exists():
        with open(HISTORY_FILE, "r") as f:
            history = json.load(f)
    
    history.append(report)
    
    # 只保留最近100条记录
    if len(history) > 100:
        history = history[-100:]
    
    with open(HISTORY_FILE, "w") as f:
        json.dump(history, f, indent=2)

# 在check_resources函数最后调用
save_history(report)

5.2 自动重启服务

在资源持续高负载时自动重启服务:

import subprocess

def restart_service():
    try:
        subprocess.run(["supervisorctl", "restart", "qwen3527"], check=True)
        return True
    except subprocess.CalledProcessError as e:
        print(f"重启服务失败: {str(e)}")
        return False

# 在check_resources函数中添加
if report["exceed_threshold"]:
    # 检查是否连续3次超过阈值
    if len(history) >= 3 and all(h["exceed_threshold"] for h in history[-3:]):
        print("资源持续高负载,尝试重启服务...")
        if restart_service():
            send_alert("Qwen3.5-27B 服务已自动重启", 
                      "由于资源持续高负载,服务已自动重启。")

6. 常见问题解决

6.1 监控脚本不执行

如果监控脚本没有执行,请检查:

# 检查supervisor状态
supervisorctl status qwen3527_monitor

# 检查日志
tail -100 /var/log/qwen3527_monitor.log

# 检查脚本权限
chmod +x /opt/qwen3527-27b/monitor_resources.py

6.2 GPU监控失败

如果GPU监控失败,可能是NVML库的问题:

# 检查nvidia-smi是否正常工作
nvidia-smi

# 重新安装NVML
pip install --upgrade nvidia-ml-py3

6.3 告警邮件无法发送

检查邮件服务器配置:

# 测试SMTP连接
telnet smtp.example.com 587

# 检查Python的smtplib是否正常工作
python3 -c "import smtplib; smtplib.SMTP('smtp.example.com', 587)"

7. 总结

通过本教程,您已经学会了如何为Qwen3.5-27B配置完整的资源监控和告警系统。这套方案可以帮助您:

  1. 实时监控CPU/GPU/内存使用情况
  2. 在资源使用率超过阈值时自动发送告警
  3. 记录历史数据用于性能分析
  4. 在持续高负载时自动重启服务

建议定期检查监控日志,并根据实际使用情况调整阈值:

# 查看监控日志
tail -f /var/log/qwen3527_monitor.log

# 查看历史数据
cat /var/log/qwen3527_resource_history.json | jq

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐