EagleEye企业级运维:Prometheus+Grafana监控GPU利用率、QPS、平均延迟指标
1. 为什么需要监控EagleEye的运行状态?
你刚部署好EagleEye——那个基于DAMO-YOLO TinyNAS、跑在双RTX 4090上的毫秒级目标检测引擎。它能在20ms内完成一帧推理,支持本地化处理、动态阈值调节和Streamlit交互大屏。但问题来了:
- 当并发请求从10路涨到80路时,GPU是不是已经开始喘不过气?
- 某次置信度滑块调低后,QPS翻倍了,但平均延迟悄悄爬升到了35ms——你发现了吗?
- 昨晚批量上传图片测试后,显存占用峰值冲到98%,系统却没报警,第二天服务卡顿了半小时……
这些都不是“能不能用”的问题,而是“稳不稳定”“能不能持续扛住”的问题。
EagleEye不是玩具模型,它是嵌入产线质检、智能安防、物流分拣等关键环节的工业级视觉引擎。它的价值不仅在于单次推理快,更在于长期稳定、可预期、可归因。而这一切的前提,是把“黑盒推理”变成“透明流水线”——让GPU利用率、每秒处理请求数(QPS)、单次推理平均延迟这三项核心指标,实时可见、历史可查、异常可告。
本文不讲概念,不堆术语,只带你用最轻量的方式,把Prometheus+Grafana这套业界验证过的监控组合,真正落地到EagleEye服务上。你会看到:
不改一行业务代码,就能采集GPU显存、温度、算力占用;
自动统计HTTP接口的QPS与P50/P90/P95延迟分布;
在Grafana里拖拽生成多维度看板,比如“高QPS时段GPU是否过热”“低置信度设置下延迟是否突增”;
设置一条简单规则,当GPU利用率连续2分钟>92%时,自动微信/邮件告警。
全程基于Linux服务器实操,命令可复制、配置可复用、看板可导出。
2. 监控架构设计:三步打通数据链路
2.1 整体数据流向(一句话说清)
EagleEye服务 → Exporter暴露指标 → Prometheus拉取存储 → Grafana查询渲染
没有代理、不走消息队列、不依赖K8s——所有组件都以进程方式运行在你的EagleEye宿主机上,最小侵入,最大可控。
2.2 关键组件选型与定位
| 组件 | 作用 | 为什么选它 | 部署位置 |
|---|---|---|---|
| node_exporter | 采集服务器基础指标(CPU、内存、磁盘) | 官方维护、零配置启动、资源占用<5MB | 与EagleEye同台服务器 |
| nvidia_gpu_exporter | 专采NVIDIA GPU指标(显存使用率、温度、SM利用率、功耗) | 唯一原生支持RTX 4090的GPU exporter,指标粒度细至每个GPU实例 | 同台服务器,需nvidia-docker或驱动支持 |
| prometheus | 时间序列数据库 + 指标拉取调度器 | 单二进制、配置即代码、无需外部依赖 | 同台服务器(推荐4C8G起步) |
| grafana | 可视化看板 + 告警引擎 | 拖拽式建图、支持Prometheus原生查询、告警渠道丰富(微信/钉钉/邮件) | 同台服务器或独立小机器 |
注意:所有组件均运行在同一物理机或Docker容器网络互通的环境中,避免跨主机网络延迟干扰延迟指标采集。
2.3 EagleEye服务端需做的唯一改动
EagleEye本身是Streamlit应用,不原生暴露Prometheus指标。但我们不需要修改它的Python代码——只需在启动命令前加一层轻量代理:
# 启动EagleEye时,用exporter包装HTTP服务 pip install prometheus-client然后在app.py(或你启动Streamlit的主文件)顶部加入:
# app.py 开头添加 from prometheus_client import Counter, Histogram, Gauge, start_http_server import time # 定义指标(全局变量,避免重复注册) REQUEST_COUNT = Counter('eagleeye_request_total', 'Total HTTP Requests', ['endpoint', 'method', 'status']) REQUEST_LATENCY = Histogram('eagleeye_request_latency_seconds', 'Request latency in seconds', ['endpoint']) GPU_MEMORY_USAGE = Gauge('eagleeye_gpu_memory_used_bytes', 'GPU memory used in bytes', ['gpu']) GPU_UTILIZATION = Gauge('eagleeye_gpu_utilization_percent', 'GPU utilization percent', ['gpu']) # 启动Prometheus metrics server(监听端口8000) start_http_server(8000)再在Streamlit的请求处理逻辑中(如st.file_uploader触发的推理函数内)插入埋点:
# 在推理开始前记录时间 start_time = time.time() # ... 执行DAMO-YOLO TinyNAS推理 ... # 推理结束后上报指标 latency = time.time() - start_time REQUEST_LATENCY.labels(endpoint='/predict').observe(latency) REQUEST_COUNT.labels(endpoint='/predict', method='POST', status='200').inc() # 假设你用pynvml获取GPU0显存 gpu_mem = get_gpu_memory_usage(0) # 你自己的获取函数 GPU_MEMORY_USAGE.labels(gpu='0').set(gpu_mem)这样,EagleEye就自带了/metrics端点(http://localhost:8000/metrics),Prometheus可直接拉取。全程不改变原有功能,不增加用户感知延迟。
3. Prometheus配置实战:精准拉取三类核心指标
3.1 创建prometheus.yml配置文件
# /etc/prometheus/prometheus.yml global: scrape_interval: 15s evaluation_interval: 15s scrape_configs: # 1. 拉取EagleEye自定义指标(QPS、延迟、GPU内存) - job_name: 'eagleeye-app' static_configs: - targets: ['localhost:8000'] metrics_path: '/metrics' # 2. 拉取nvidia_gpu_exporter(GPU温度、算力、功耗) - job_name: 'nvidia-gpu' static_configs: - targets: ['localhost:9101'] # nvidia_gpu_exporter默认端口 # 3. 拉取node_exporter(服务器基础状态) - job_name: 'node' static_configs: - targets: ['localhost:9100'] # node_exporter默认端口3.2 启动Prometheus(三行命令搞定)
# 1. 下载并解压Prometheus(以Linux x86_64为例) wget https://github.com/prometheus/prometheus/releases/download/v2.47.2/prometheus-2.47.2.linux-amd64.tar.gz tar -xzf prometheus-2.47.2.linux-amd64.tar.gz cd prometheus-2.47.2.linux-amd64 # 2. 启动(后台运行,日志输出到prom.log) nohup ./prometheus --config.file=prometheus.yml --storage.tsdb.path=data/ > prom.log 2>&1 & # 3. 验证:访问 http://localhost:9090/targets 查看三个job是否UP此时Prometheus已开始每15秒拉取一次数据。打开http://localhost:9090/graph,输入eagleeye_request_total,你能立即看到请求计数曲线;输入eagleeye_gpu_utilization_percent,能看到双卡实时利用率。
4. Grafana看板搭建:三张图看清EagleEye健康度
4.1 安装与数据源配置
# 安装Grafana(Debian/Ubuntu) sudo apt-get install -y adduser libfontconfig1 wget https://dl.grafana.com/oss/release/grafana_10.2.3_amd64.deb sudo dpkg -i grafana_10.2.3_amd64.deb sudo systemctl daemon-reload sudo systemctl enable grafana-server sudo systemctl start grafana-server访问http://localhost:3000(默认账号admin/admin),进入「Configuration → Data Sources」,添加Prometheus数据源:
- Name:
Prometheus-EagleEye - URL:
http://localhost:9090 - Save & Test → 显示"Data source is working"即成功。
4.2 创建核心看板(直接导入JSON)
点击左上角「+」→「Import」,粘贴以下JSON(已适配EagleEye指标命名):
{ "dashboard": { "panels": [ { "title": " GPU利用率与温度(双卡对比)", "targets": [ { "expr": "100 - (nvidia_smi_fan_speed_percent{gpu=\"0\"} or vector(0))", "legendFormat": "GPU0 利用率" }, { "expr": "100 - (nvidia_smi_fan_speed_percent{gpu=\"1\"} or vector(0))", "legendFormat": "GPU1 利用率" }, { "expr": "nvidia_smi_temperature_gpu{gpu=\"0\"}", "legendFormat": "GPU0 温度(℃)" }, { "expr": "nvidia_smi_temperature_gpu{gpu=\"1\"}", "legendFormat": "GPU1 温度(℃)" } ], "type": "graph" }, { "title": "⚡ QPS与平均延迟(P95)", "targets": [ { "expr": "sum(rate(eagleeye_request_total{status=\"200\"}[1m])) by (endpoint)", "legendFormat": "QPS - {{endpoint}}" }, { "expr": "histogram_quantile(0.95, sum(rate(eagleeye_request_latency_seconds_bucket[5m])) by (le, endpoint))", "legendFormat": "P95延迟 - {{endpoint}}" } ], "type": "graph" }, { "title": " 置信度阈值与延迟关联分析", "targets": [ { "expr": "avg_over_time(eagleeye_request_latency_seconds{endpoint=\"/predict\"}[1h])", "legendFormat": "过去1小时平均延迟" }, { "expr": "avg_over_time(eagleeye_gpu_utilization_percent{gpu=\"0\"}[1h])", "legendFormat": "GPU0平均利用率" } ], "type": "graph" } ] } }点击「Load」,看板自动生成三张图:
- 第一张:双GPU利用率曲线(注意:
nvidia_smi_fan_speed_percent反向映射为利用率,更直观)+ 实时温度; - 第二张:QPS柱状图 + P95延迟折线图,一眼看出“高并发是否拖慢响应”;
- 第三张:将“平均延迟”与“GPU平均利用率”放在同一坐标系,若两条线同步飙升,说明瓶颈确实在GPU。
所有图表支持时间范围选择(1h/6h/24h/7d),支持鼠标悬停查看精确数值。
5. 告警规则配置:让系统自己喊你
5.1 在Prometheus中定义告警规则
创建/etc/prometheus/alert.rules.yml:
groups: - name: eagleeye-alerts rules: - alert: EagleEyeGPULoadHigh expr: avg_over_time(eagleeye_gpu_utilization_percent{gpu=~"0|1"}[5m]) > 92 for: 2m labels: severity: warning annotations: summary: "GPU利用率持续过高" description: "GPU {{ $labels.gpu }} 连续2分钟利用率>92%,当前值{{ $value | printf \"%.1f\" }}%" - alert: EagleEyeLatencyHigh expr: histogram_quantile(0.95, sum(rate(eagleeye_request_latency_seconds_bucket[5m])) by (le, endpoint)) > 0.035 for: 1m labels: severity: critical annotations: summary: "P95延迟超35ms" description: "接口 {{ $labels.endpoint }} P95延迟达{{ $value | printf \"%.3f\" }}秒,影响实时性"并在prometheus.yml的global下添加:
rule_files: - "alert.rules.yml"5.2 配置Alertmanager发送微信(极简版)
下载Alertmanager,创建alertmanager.yml:
global: resolve_timeout: 5m route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'wechat' receivers: - name: 'wechat' wechat_configs: - send_resolved: true corp_id: 'your_corp_id' # 企业微信管理后台获取 api_secret: 'your_api_secret' agent_id: '1000002' # 企业微信应用ID to_user: '@all'启动Alertmanager后,在Prometheus Web UI的「Alerts」页即可看到告警状态。当GPU过热或延迟超标时,企业微信会立刻推送消息。
6. 总结:监控不是摆设,而是EagleEye的“运维仪表盘”
我们没写一行深度学习代码,也没碰DAMO-YOLO TinyNAS的模型结构,却完成了对EagleEye生产级服务的完整可观测性建设:
🔹GPU利用率——不再是nvidia-smi里一闪而过的数字,而是连续曲线,能回溯“上周三下午3点GPU1为何突然飙高”;
🔹QPS——不再靠日志grep估算,而是每分钟精确统计,配合延迟曲线,清晰区分“是流量突增还是性能退化”;
🔹平均延迟——不只是一个P95数字,而是与置信度滑块、GPU负载联动分析,告诉你“调低阈值省下的时间,是否被额外计算拖回去了”。
更重要的是,这套方案完全复用业界标准工具链,未来如果EagleEye要接入K8s、升级为微服务、对接ELK日志系统,Prometheus+Grafana的指标体系无需重构,平滑演进。
你现在要做的,只有三件事:
1⃣ 复制本文中的prometheus.yml和告警规则,启动Prometheus;
2⃣ 在EagleEye代码里加10行指标埋点(已给出完整示例);
3⃣ 导入Grafana看板JSON,设置企业微信告警。
不到1小时,你的毫秒级视觉引擎,就拥有了企业级的“心跳监护仪”。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。