4.3 监控与运维 本节导读:掌握vLLM生产环境的监控体系建设、日志管理、性能监控和告警机制,构建高可用的LLM推理服务。 学习目标 掌握vLLM监控系统的核心组件和架构 学习性能指标监控和数据分析方法 构建完善的日志管理和告警机制 实现自动化运维和故障诊断 核心概念 vLLM监控体系包含四个核心组件: Metrics监控:实时性能指标收集 Logging系统:结构化日志记录 Alerting告警:异常检测和通知 Dashboard可视化:监控数据展示 环境准备 基础软件包 配置文件结构 分步实战 步骤1:Prometheus监控配置 创建Prometheus配置文件: 实现Python监控客户端: 步骤2:集成vLLM监控 修改vLLM服务代码添加监控: 步骤3:日志管理系统
本节导读:掌握vLLM生产环境的监控体系建设、日志管理、性能监控和告警机制,构建高可用的LLM推理服务。
vLLM监控体系包含四个核心组件:
# 监控组件安装 pip install prometheus-client pyyaml requests pip install elasticsearch-async aiohttp
/vllm-monitor/ ├── config/ │ ├── prometheus.yml │ ├── grafana/ │ └── alerts/ ├── scripts/ │ ├── metrics_collector.py │ ├── log_processor.py │ └── alert_manager.py └── data/ ├── metrics/ └── logs/
创建Prometheus配置文件:
# config/prometheus.yml global: scrape_interval: 15s evaluation_interval: 15s rule_files: - "alerts/rules.yml" scrape_configs: - job_name: 'vllm' static_configs: - targets: ['localhost:8090'] metrics_path: '/metrics' scrape_interval: 5s
实现Python监控客户端:
# scripts/metrics_collector.py import prometheus_client import time import threading from prometheus_client import Counter, Histogram, Gauge # 创建监控指标 REQUEST_COUNT = Counter('vllm_requests_total', 'Total requests processed') REQUEST_DURATION = Histogram('vllm_request_duration_seconds', 'Request processing time') ACTIVE_REQUESTS = Gauge('vllm_active_requests', 'Number of active requests') CACHE_HIT_RATIO = Gauge('vllm_cache_hit_ratio', 'Cache hit percentage') class VLLMMetricsCollector: def __init__(self): self.start_time = time.time() self.total_requests = 0 self.active_requests = 0 def record_request_start(self): """记录请求开始""" self.active_requests += 1 REQUEST_COUNT.inc() ACTIVE_REQUESTS.set(self.active_requests) def record_request_end(self, duration): """记录请求结束""" self.active_requests -= 1 REQUEST_DURATION.observe(duration) ACTIVE_REQUESTS.set(self.active_requests) def record_cache_stats(self, hits, total): """记录缓存统计""" ratio = hits / total if total > 0 else 0 CACHE_HIT_RATIO.set(ratio) # 全局监控器实例 metrics_collector = VLLMMetricsCollector() # 启动Prometheus服务器 def start_prometheus_server(port=8090): prometheus_client.start_http_server(port) print(f"Prometheus server started on port {port}")
修改vLLM服务代码添加监控:
# 修改vLLM服务类,添加监控集成 class VLLMServiceWithMetrics: def __init__(self, config): self.config = config self.metrics_collector = metrics_collector async def process_request(self, request_data): """处理请求并记录监控指标""" start_time = time.time() # 记录请求开始 self.metrics_collector.record_request_start() try: # 处理vLLM推理 result = await self._execute_inference(request_data) # 记录请求完成 duration = time.time() - start_time self.metrics_collector.record_request_end(duration) return result except Exception as e: # 记录错误 self.metrics_collector.record_request_error() raise def get_system_metrics(self): """获取系统性能指标""" return { 'active_requests': self.metrics_collector.active_requests, 'total_requests': self.metrics_collector.total_requests, 'uptime': time.time() - self.metrics_collector.start_time, 'memory_usage': self._get_memory_usage(), 'gpu_usage': self._get_gpu_usage() }
实现结构化日志处理:
# scripts/log_processor.py import logging import json import os from datetime import datetime from logging.handlers import RotatingFileHandler class VLLMLogProcessor: def __init__(self, log_dir="/vllm-monitor/logs"): self.log_dir = log_dir self.setup_logging() def setup_logging(self): """配置结构化日志系统""" # 创建日志目录 os.makedirs(self.log_dir, exist_ok=True) # 配置日志格式 formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' ) # 主日志文件 main_handler = RotatingFileHandler( f"{self.log_dir}/vllm.log", maxBytes=100*1024*1024, # 100MB backupCount=5 ) main_handler.setFormatter(formatter) # 性能日志文件 perf_handler = RotatingFileHandler( f"{self.log_dir}/performance.log", maxBytes=50*1024*1024, # 50MB backupCount=3 ) perf_handler.setFormatter(formatter) # 错误日志文件 error_handler = RotatingFileHandler( f"{self.log_dir}/error.log", maxBytes=50*1024*1024, # 50MB backupCount=3 ) error_handler.setFormatter(formatter) # 配置根日志器 root_logger = logging.getLogger() root_logger.setLevel(logging.INFO) root_logger.addHandler(main_handler) root_logger.addHandler(perf_handler) root_logger.addHandler(error_handler) def log_request(self, request_id, model, tokens, duration, status): """记录请求日志""" log_data = { 'timestamp': datetime.now().isoformat(), 'request_id': request_id, 'model': model, 'input_tokens': tokens.get('input', 0), 'output_tokens': tokens.get('output', 0), 'total_tokens': tokens.get('total', 0), 'duration_ms': duration * 1000, 'status': status } logging.info(f"REQUEST: {json.dumps(log_data, ensure_ascii=False)}") def log_error(self, error_type, error_message, context=None): """记录错误日志""" log_data = { 'timestamp': datetime.now().isoformat(), 'error_type': error_type, 'error_message': error_message, 'context': context or {} } logging.error(f"ERROR: {json.dumps(log_data, ensure_ascii=False)}")
# monitoring_system.py import asyncio import time import json from datetime import datetime class VLLMMonitoringSystem: def __init__(self, config): self.config = config self.metrics_collector = VLLMMetricsCollector() self.log_processor = VLLMLogProcessor(config.get('log_dir')) self.alert_manager = VLLMAlertManager(config.get('alerts')) async def start_monitoring(self): """启动监控系统""" # 启动Prometheus服务器 start_prometheus_server(self.config.get('prometheus_port', 8090)) # 启动监控循环 while True: try: # 收集指标 metrics = self.collect_metrics() # 检查告警 alerts = await self.alert_manager.check_alerts(metrics) for alert in alerts: await self.alert_manager.send_alert(alert) # 记录日志 self.log_metrics(metrics) # 等待下一个监控周期 await asyncio.sleep(self.config.get('monitor_interval', 30)) except Exception as e: self.log_processor.log_error('monitoring_error', str(e)) await asyncio.sleep(60) def collect_metrics(self): """收集系统指标""" return { 'timestamp': datetime.now().isoformat(), 'requests_count': self.metrics_collector.total_requests, 'active_requests': self.metrics_collector.active_requests, 'memory_usage': self._get_memory_usage(), 'gpu_usage': self._get_gpu_usage(), 'cpu_usage': self._get_cpu_usage(), 'disk_usage': self._get_disk_usage() }
A:通过环境变量或配置文件设置监控端口:
# 方法1:环境变量 export VLLM_MONITOR_PORT=8090 # 方法2:配置文件 cat > vllm_config.py << EOF MONITORING_CONFIG = { 'prometheus_port': 8090, 'metrics_enabled': True, 'log_level': 'INFO' } EOF
A:可以通过以下方式优化:
A:健康检查实现方案:
@app.get('/health') async def health_check(): """健康检查端点""" try: # 检查模型加载状态 model_status = check_model_status() # 检查资源使用情况 resource_status = check_resources() # 检查缓存状态 cache_status = check_cache_health() overall_status = all([ model_status['healthy'], resource_status['healthy'], cache_status['healthy'] ]) return { 'status': 'healthy' if overall_status else 'unhealthy', 'details': { 'model': model_status, 'resources': resource_status, 'cache': cache_status, 'timestamp': datetime.now().isoformat() } } except Exception as e: return { 'status': 'unhealthy', 'error': str(e), 'timestamp': datetime.now().isoformat() }
本节详细介绍了vLLM监控体系的构建,包括Prometheus监控、日志管理、告警系统等核心组件。通过结构化的监控方案,可以实现对vLLM服务运行状态的全面掌控,及时发现和解决生产环境中的问题。
下一节将介绍vLLM的故障处理与优化策略,重点关注系统异常的处理和性能调优方法。
关键词:vLLM, 监控系统, Prometheus, Grafana, 日志管理, 告警机制, 生产环境, DevOps, 性能监控
难度:进阶
预计阅读:45 分钟