青岛移动公司网站,医保局网站建设中标公告,建设工程专业承包交易中心网站,百度网站建设中心实时检测系统资源监控#xff1a;PrometheusGrafana对GPU/内存/请求量实时看板 1. 项目背景与监控需求 当你部署了一个像手机检测这样的AI应用后#xff0c;最怕遇到什么情况#xff1f;服务器突然卡死#xff0c;用户访问不了#xff0c;或者GPU跑满了却不知道原因。这…实时检测系统资源监控PrometheusGrafana对GPU/内存/请求量实时看板1. 项目背景与监控需求当你部署了一个像手机检测这样的AI应用后最怕遇到什么情况服务器突然卡死用户访问不了或者GPU跑满了却不知道原因。这时候一个清晰的监控看板就像汽车的仪表盘能让你一眼看清系统的“健康状况”。我们之前介绍的手机检测系统基于DAMO-YOLO和TinyNAS技术主打“小、快、省”专门为手机端低算力场景设计。但再轻量的系统运行久了也会遇到资源瓶颈。GPU使用率是不是一直很高内存有没有泄漏用户请求量有没有突增这些都需要实时掌握。今天要分享的就是如何用PrometheusGrafana这套黄金组合为你的AI应用搭建一个专业的资源监控看板。这不是那种简单的命令行查看而是像下面这样的可视化仪表盘┌─────────────────────────────────────────────────────────────┐ │ 系统资源监控看板 │ ├──────────────────────┬──────────────────────────────────────┤ │ GPU使用率: 85% │ 内存使用: 4.2GB/8GB (52%) │ │ ┌────────────┐ │ ┌────────────┐ │ │ │█████████░░░│ │ │██████░░░░░░│ │ │ └────────────┘ │ └────────────┘ │ │ │ │ │ 请求量/分钟: 120 │ CPU使用率: 45% │ │ ┌────────────┐ │ ┌────────────┐ │ │ │ ▲ │ │ │████░░░░░░░░│ │ │ │ │ │ │ └────────────┘ │ │ └────────────┘ │ │ └──────────────────────┴──────────────────────────────────────┘有了这个看板你就能实时看到GPU、内存、CPU的使用情况监控用户请求量和响应时间设置告警在问题发生前收到通知分析历史数据优化系统性能2. 监控方案选型为什么是PrometheusGrafana市面上监控工具很多为什么偏偏选这套组合让我用大白话给你解释一下。Prometheus就像个“数据收集员”。它定时去各个系统组件那里“问一问”GPU现在用了多少内存还剩多少请求处理了几个然后把数据存起来。它的特点是主动拉取数据不用你推它自己会去拿时间序列数据库专门存带时间戳的数据比如“今天下午3点GPU使用率85%”灵活的查询语言你可以用类似SQL的语句查数据Grafana则是个“数据展示员”。它从Prometheus那里拿到数据然后画成漂亮的图表。它的特点是丰富的图表类型折线图、柱状图、仪表盘、热力图...可定制的看板你想看什么数据就放什么图表告警功能数据异常时发邮件、发微信通知你这套组合的优势很明显开源免费不用花一分钱生态成熟社区活跃问题好解决扩展性强想监控什么就加什么部署简单几个命令就能跑起来对于我们的手机检测系统来说这套方案再合适不过了。系统本身轻量监控也要轻量但够用。3. 环境准备与快速部署3.1 系统要求在开始之前先确认你的环境操作系统Ubuntu 20.04或更高版本其他Linux发行版也类似内存至少2GB空闲内存存储至少5GB空闲空间网络能访问互联网下载安装包我们的手机检测系统已经在运行了假设它的访问地址是http://你的服务器IP:7860。3.2 一键安装脚本为了简化安装我准备了一个一键安装脚本。你只需要复制粘贴就能完成大部分工作。#!/bin/bash # 监控系统一键安装脚本 # 保存为 install_monitor.sh然后运行: bash install_monitor.sh echo 开始安装监控系统... # 1. 安装Docker如果还没安装 if ! command -v docker /dev/null; then echo 安装Docker... curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker $USER echo Docker安装完成 else echo Docker已安装 fi # 2. 创建监控目录 echo 创建监控目录... mkdir -p ~/monitoring/{prometheus,grafana} cd ~/monitoring # 3. 创建Prometheus配置文件 cat prometheus/prometheus.yml EOF global: scrape_interval: 15s # 每15秒收集一次数据 evaluation_interval: 15s scrape_configs: - job_name: prometheus static_configs: - targets: [localhost:9090] - job_name: node_exporter static_configs: - targets: [node_exporter:9100] - job_name: cadvisor static_configs: - targets: [cadvisor:8080] EOF # 4. 创建Docker Compose文件 cat docker-compose.yml EOF version: 3.8 services: prometheus: image: prom/prometheus:latest container_name: prometheus ports: - 9090:9090 volumes: - ./prometheus:/etc/prometheus - prometheus_data:/prometheus command: - --config.file/etc/prometheus/prometheus.yml - --storage.tsdb.path/prometheus - --web.console.libraries/etc/prometheus/console_libraries - --web.console.templates/etc/prometheus/consoles - --storage.tsdb.retention.time200h - --web.enable-lifecycle restart: unless-stopped grafana: image: grafana/grafana:latest container_name: grafana ports: - 3000:3000 volumes: - grafana_data:/var/lib/grafana environment: - GF_SECURITY_ADMIN_PASSWORDadmin123 restart: unless-stopped node_exporter: image: prom/node-exporter:latest container_name: node_exporter ports: - 9100:9100 volumes: - /proc:/host/proc:ro - /sys:/host/sys:ro - /:/rootfs:ro command: - --path.procfs/host/proc - --path.rootfs/rootfs - --path.sysfs/host/sys - --collector.filesystem.mount-points-exclude^/(sys|proc|dev|host|etc)($$|/) restart: unless-stopped cadvisor: image: gcr.io/cadvisor/cadvisor:latest container_name: cadvisor ports: - 8080:8080 volumes: - /:/rootfs:ro - /var/run:/var/run:ro - /sys:/sys:ro - /var/lib/docker/:/var/lib/docker:ro - /dev/disk/:/dev/disk:ro privileged: true devices: - /dev/kmsg restart: unless-stopped volumes: prometheus_data: grafana_data: EOF echo 安装脚本创建完成 echo 请运行以下命令启动监控系统 echo cd ~/monitoring docker-compose up -d运行这个脚本# 给脚本执行权限 chmod x install_monitor.sh # 运行脚本 bash install_monitor.sh3.3 启动监控服务脚本运行完后进入监控目录启动服务cd ~/monitoring docker-compose up -d等个几十秒用下面的命令检查服务状态# 查看所有容器状态 docker-compose ps # 应该看到类似这样的输出 # Name Command State Ports # ------------------------------------------------------------------------------- # cadvisor /usr/bin/cadvisor -logtostderr Up 0.0.0.0:8080-8080/tcp # grafana /run.sh Up 0.0.0.0:3000-3000/tcp # node_exporter /bin/node_exporter --path. ... Up 0.0.0.0:9100-9100/tcp # prometheus /bin/prometheus --config.f ... Up 0.0.0.0:9090-9090/tcp如果所有服务都是“Up”状态恭喜你监控系统的基础部分已经部署成功了4. 配置手机检测系统的监控现在监控系统跑起来了但还没监控我们的手机检测应用。我们需要让Prometheus能收集到应用的数据。4.1 为手机检测系统添加监控端点手机检测系统是用Gradio做的Web应用我们需要给它加个“健康检查”接口让Prometheus能获取到应用的状态信息。修改手机检测系统的app.py文件添加监控相关代码# 在原有代码基础上添加以下内容 import psutil import time from prometheus_client import Counter, Gauge, Histogram, generate_latest, CONTENT_TYPE_LATEST from flask import Flask, Response import threading # 创建监控指标 REQUEST_COUNT Counter(phone_detection_requests_total, Total number of detection requests) REQUEST_LATENCY Histogram(phone_detection_request_latency_seconds, Request latency in seconds) GPU_MEMORY_USAGE Gauge(phone_detection_gpu_memory_usage_mb, GPU memory usage in MB) SYSTEM_MEMORY_USAGE Gauge(phone_detection_system_memory_usage_percent, System memory usage percentage) CPU_USAGE Gauge(phone_detection_cpu_usage_percent, CPU usage percentage) # 创建Flask应用用于提供监控数据 monitor_app Flask(__name__) monitor_app.route(/metrics) def metrics(): 提供Prometheus格式的监控数据 # 更新系统指标 update_system_metrics() # 返回所有指标数据 return Response(generate_latest(), mimetypeCONTENT_TYPE_LATEST) def update_system_metrics(): 更新系统资源指标 # 获取系统内存使用率 memory psutil.virtual_memory() SYSTEM_MEMORY_USAGE.set(memory.percent) # 获取CPU使用率 CPU_USAGE.set(psutil.cpu_percent(interval1)) # 这里简化处理实际GPU监控需要根据你的环境调整 # 如果你有NVIDIA GPU可以安装nvidia-ml-py3库 try: import pynvml pynvml.nvmlInit() handle pynvml.nvmlDeviceGetHandleByIndex(0) info pynvml.nvmlDeviceGetMemoryInfo(handle) GPU_MEMORY_USAGE.set(info.used / 1024 / 1024) # 转换为MB pynvml.nvmlShutdown() except: # 如果没有GPU或库不存在设置一个默认值 GPU_MEMORY_USAGE.set(0) def start_monitor_server(): 启动监控服务器 monitor_app.run(host0.0.0.0, port5000) # 在Gradio应用启动后启动监控服务器 if __name__ __main__: # 启动监控服务器在后台线程中运行 monitor_thread threading.Thread(targetstart_monitor_server, daemonTrue) monitor_thread.start() # 原有的Gradio应用启动代码 demo.launch(server_name0.0.0.0, server_port7860)还需要修改requirements.txt添加新的依赖# 在原有依赖基础上添加 prometheus-client0.20.0 psutil5.9.8 flask3.0.2 # 如果有NVIDIA GPU可以添加 # nvidia-ml-py37.352.0然后重启手机检测服务# 进入手机检测目录 cd /root/phone-detection # 安装新的依赖 pip install -r requirements.txt # 重启服务 supervisorctl restart phone-detection4.2 配置Prometheus收集应用数据现在手机检测系统有了监控接口在5000端口我们需要告诉Prometheus去收集这个数据。编辑Prometheus的配置文件cd ~/monitoring nano prometheus/prometheus.yml在文件末尾添加新的job配置# 在scrape_configs部分添加 scrape_configs: # ... 原有的配置 ... - job_name: phone_detection static_configs: - targets: [你的服务器IP:5000] metrics_path: /metrics scrape_interval: 10s # 每10秒收集一次重启Prometheus使配置生效cd ~/monitoring docker-compose restart prometheus4.3 验证监控数据现在可以检查监控数据是否正常收集了。首先访问手机检测的监控端点http://你的服务器IP:5000/metrics你应该能看到类似这样的数据# HELP phone_detection_requests_total Total number of detection requests # TYPE phone_detection_requests_total counter phone_detection_requests_total 0 # HELP phone_detection_system_memory_usage_percent System memory usage percentage # TYPE phone_detection_system_memory_usage_percent gauge phone_detection_system_memory_usage_percent 45.2 # HELP phone_detection_cpu_usage_percent CPU usage percentage # TYPE phone_detection_cpu_usage_percent gauge phone_detection_cpu_usage_percent 12.7然后访问Prometheus的Web界面http://你的服务器IP:9090在查询框输入phone_detection_应该能看到我们定义的监控指标。5. 配置Grafana监控看板数据收集好了现在我们来创建漂亮的监控看板。5.1 登录Grafana打开浏览器访问http://你的服务器IP:3000用以下信息登录用户名admin密码admin123这是我们在一键脚本里设置的第一次登录会要求改密码你可以改也可以先用默认的。5.2 添加数据源点击左边菜单的Configuration小齿轮图标→Data Sources点击Add data source选择Prometheus配置Prometheus地址URL:http://prometheus:9090注意这里用服务名因为都在Docker网络内点击Save Test应该显示“Data source is working”5.3 导入预置的监控看板Grafana社区有很多现成的看板模板我们直接导入一个适合的。点击左边菜单的Dashboards四个方块图标→New→Import在“Import via grafana.com”框输入1860 这是Node Exporter的看板ID点击Load选择Prometheus数据源点击Import现在你就有了一个系统资源监控看板可以看到CPU、内存、磁盘、网络等基本信息。5.4 创建手机检测专属看板系统监控有了我们还需要一个专门看手机检测应用状态的看板。点击Dashboards→New→New Dashboard然后添加以下面板面板1请求量监控折线图标题检测请求量每分钟查询语句rate(phone_detection_requests_total[1m])可视化选择Time series时间序列图单位req/min请求/分钟面板2系统内存使用率仪表盘标题系统内存使用率查询语句phone_detection_system_memory_usage_percent可视化选择Gauge仪表盘单位percent百分比阈值设置警告线比如80%和危险线比如90%面板3CPU使用率折线图标题CPU使用率查询语句phone_detection_cpu_usage_percent可视化选择Time series单位percent面板4GPU内存使用统计面板标题GPU内存使用查询语句phone_detection_gpu_memory_usage_mb可视化选择Stat统计面板单位bytes会自动转换为MB/GB面板5服务状态状态面板标题服务状态查询语句up{jobphone_detection}可视化选择Stat值映射设置1正常0异常排列好这些面板后你的看板大概长这样┌─────────────────┬─────────────────┬─────────────────┐ │ 请求量/分钟 │ 系统内存使用率 │ GPU内存使用 │ │ [折线图] │ [仪表盘] │ [统计面板] │ ├─────────────────┼─────────────────┼─────────────────┤ │ CPU使用率 │ 服务状态 │ │ │ [折线图] │ [状态面板] │ │ └─────────────────┴─────────────────┴─────────────────┘点击右上角的Save给看板起个名字比如“手机检测系统监控”。6. 高级监控配置基础监控有了我们再来加点高级功能让监控更智能。6.1 设置告警规则当系统出现问题时我们希望能自动收到通知。Grafana的告警功能可以帮我们做到。在Grafana中创建告警规则进入刚才创建的看板点击面板标题 →Edit在右侧找到Alert标签页点击Create alert rule from this panel以内存使用率为例设置告警规则名称内存使用率过高评估间隔1m条件当phone_detection_system_memory_usage_percent 80 持续 5分钟通知渠道可以配置邮件、Slack、微信等6.2 监控请求延迟除了请求量响应速度也很重要。我们需要在代码中添加延迟监控。修改手机检测系统的监控代码添加请求延迟记录import time from functools import wraps def track_request_latency(func): 装饰器记录请求延迟 wraps(func) def wrapper(*args, **kwargs): start_time time.time() result func(*args, **kwargs) latency time.time() - start_time # 记录延迟 REQUEST_LATENCY.observe(latency) # 记录请求次数 REQUEST_COUNT.inc() return result return wrapper # 在检测函数上使用装饰器 track_request_latency def detect_phone(image): # 原有的检测逻辑 # ... return result6.3 监控模型推理性能对于AI应用模型推理的性能是关键指标。我们可以监控# 添加模型推理相关的监控指标 MODEL_INFERENCE_TIME Histogram( phone_detection_model_inference_seconds, Model inference time in seconds, buckets[0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1.0, 5.0] ) DETECTION_CONFIDENCE Histogram( phone_detection_confidence, Detection confidence distribution, buckets[0.1, 0.3, 0.5, 0.7, 0.9, 1.0] ) def track_inference_performance(func): 装饰器记录模型推理性能 wraps(func) def wrapper(*args, **kwargs): start_time time.time() result func(*args, **kwargs) inference_time time.time() - start_time MODEL_INFERENCE_TIME.observe(inference_time) # 如果有置信度信息也记录下来 if result and confidence in result: DETECTION_CONFIDENCE.observe(result[confidence]) return result return wrapper7. 实际效果展示配置完成后让我们看看监控看板在实际运行中是什么样子。7.1 正常情况下的监控看板当系统运行平稳时看板显示请求量平稳的波浪线每分钟大约50-100个请求内存使用率保持在40-60%之间CPU使用率平时30%左右请求来时短暂升高GPU内存稳定在1.2GB左右模型加载后服务状态绿色“正常”状态7.2 压力测试时的监控看板当我们模拟大量用户同时访问时请求量突然飙升到每分钟500请求内存使用率逐渐上升到75%CPU使用率冲到80-90%响应延迟从平均200ms增加到800ms服务状态仍然绿色但各项指标接近阈值7.3 异常情况告警当内存使用超过80%持续5分钟时Grafana检测到异常触发告警规则发送邮件通知管理员看板上内存面板变黄色警告或红色严重管理员收到通知后可以立即查看监控看板快速定位问题。8. 监控数据的使用技巧监控数据不只是用来看的还能帮我们优化系统。这里分享几个实用技巧。8.1 通过监控发现性能瓶颈看监控数据时要特别关注这些模式内存缓慢增长可能是有内存泄漏现象内存使用率随时间缓慢上升重启后恢复解决方法检查代码中的缓存、大对象是否及时释放CPU使用率与请求量不匹配现象请求量没变但CPU使用率突然升高可能原因某个请求处理异常陷入死循环GPU内存使用异常现象GPU内存占满但请求量不大可能原因模型重复加载或显存没释放8.2 设置合理的监控阈值阈值设得太低整天收到误报设得太高真出问题才发现。建议这样设置内存使用率警告80%严重90%CPU使用率警告85%严重95%请求延迟警告500ms严重1000ms错误率警告1%严重5%8.3 定期查看监控报告Grafana可以生成监控报告定期发送到邮箱。设置方法在看板页面点击Share→Report配置报告名称、频率每天/每周、接收邮箱点击Send test测试然后保存这样你每周都能收到系统的“体检报告”了解系统运行趋势。9. 总结9.1 监控系统带来的价值通过这一套监控方案我们为手机检测系统装上了“眼睛”和“警报器”。现在你可以实时掌握系统状态不用登录服务器打开网页就能看到所有指标快速定位问题出问题时看监控数据就能知道是CPU、内存还是网络的问题预防性维护在问题发生前收到告警提前处理性能优化依据通过历史数据找到系统的瓶颈点容量规划参考根据使用趋势决定什么时候需要升级服务器9.2 关键配置回顾整个监控系统的核心配置Prometheus配置定义了收集哪些数据、多久收集一次应用监控端点在代码中添加/metrics接口暴露数据Grafana看板把数据变成直观的图表告警规则设置阈值异常时自动通知9.3 下一步建议如果你还想进一步优化监控系统可以考虑监控更多指标磁盘IO、网络流量、数据库连接数等设置分级告警不同级别的问题通知不同的人集成更多通知渠道除了邮件还可以加微信、钉钉、Slack历史数据分析用监控数据做容量规划预测什么时候需要扩容监控不是一次性的工作而是持续的过程。随着系统的发展监控也需要不断调整和优化。9.4 遇到问题怎么办如果在配置过程中遇到问题可以检查服务状态docker-compose ps看所有服务是否正常查看日志docker-compose logs -f 服务名看具体错误信息验证数据直接访问http://IP:5000/metrics看是否有数据检查配置确认Prometheus配置中的IP和端口是否正确记住好的监控系统不是一蹴而就的。先从核心指标开始慢慢完善。最重要的是监控数据要真正用起来为你的决策提供依据。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。