ccmusic-database部署教程:Prometheus+Grafana监控服务QPS、延迟与GPU利用率
ccmusic-database部署教程:Prometheus+Grafana监控服务QPS、延迟与GPU利用率
音乐流派分类模型ccmusic-database是一个基于VGG19_BN架构和CQT频谱特征的智能分类系统。它能自动识别音频文件所属的16种音乐流派,从交响乐到流行舞曲,覆盖了广泛的音乐类型。这个模型最初在计算机视觉任务上进行了预训练,学习了丰富的特征表示能力,然后专门针对音频数据进行了微调,使其能够“看懂”声音的视觉化图谱——频谱图,从而做出准确的分类判断。
当你把这样一个模型部署成在线服务后,一个很实际的问题就来了:我怎么知道它运行得好不好?有多少人在用?处理速度快不快?服务器资源吃紧吗?特别是如果用了GPU加速,显卡利用率怎么样?这些问题对于确保服务稳定、优化性能、规划资源都至关重要。
今天,我就带你一步步搭建一套完整的监控系统,用Prometheus收集ccmusic-database服务的各项指标,再用Grafana做成直观的仪表盘。你会看到实时的请求量(QPS)、处理延迟、GPU利用率等关键数据,就像给服务装上了“仪表盘”和“健康监测仪”。
1. 理解监控什么:关键指标解读
在开始部署之前,我们先搞清楚要监控哪些东西,以及为什么这些指标重要。
1.1 服务性能指标
对于ccmusic-database这样的推理服务,最核心的性能指标有两个:
-
QPS(每秒查询数):衡量服务处理能力。比如你的服务1秒钟能处理多少个音频分类请求。这个数字直接反映了服务的吞吐量。如果QPS突然下降,可能意味着服务出现了瓶颈或错误。
-
延迟(Latency):从用户上传音频到收到分类结果,这中间花了多少时间。延迟直接影响用户体验。我们通常关注P50(中位数)、P95、P99等不同百分位的延迟,因为少数慢请求对用户体验影响很大。
1.2 资源利用率指标
服务跑在什么硬件上,这些硬件用得好不好,同样重要:
-
GPU利用率:如果ccmusic-database用了GPU加速(VGG19模型推理通常可以受益于GPU),那么GPU的使用率就是关键指标。利用率太低说明资源浪费,太高则可能成为瓶颈。
-
CPU和内存使用率:即使主要计算在GPU上,CPU和内存的监控也不能少。内存泄漏、CPU过载都会导致服务不稳定。
-
网络和磁盘I/O:音频文件的上传下载、模型文件的读取都会涉及I/O操作。
1.3 业务指标
除了技术指标,业务层面的数据也很有价值:
-
分类结果分布:哪种音乐流派被识别得最多?这个数据可以帮助你了解用户偏好。
-
请求成功率:有多少请求成功返回了结果?有多少失败了?失败原因是什么?
2. 环境准备与组件介绍
我们的监控方案基于三个核心组件,它们各自扮演不同的角色。
2.1 监控系统三剑客
Prometheus:负责数据收集和存储。它是一个开源的监控系统,会定期从各个目标(比如你的ccmusic-database服务)“抓取”指标数据,然后存储在自己的时间序列数据库中。
Grafana:负责数据可视化。它从Prometheus读取数据,然后以图表、仪表盘的形式展示出来。你可以自定义各种面板,监控不同的指标。
监控客户端(Exporter):这是安装在你要监控的服务或主机上的代理程序。对于ccmusic-database,我们需要:
- 服务自身的指标暴露(通过/metrics接口)
- 节点监控(CPU、内存、磁盘等)
- GPU监控(如果使用了NVIDIA GPU)
2.2 系统要求
- 操作系统:Ubuntu 20.04/22.04或CentOS 7/8(本文以Ubuntu 22.04为例)
- Docker:建议使用Docker部署,简化安装和配置
- 网络:确保7860端口(ccmusic-database服务)、9090端口(Prometheus)、3000端口(Grafana)可访问
- 存储:准备至少10GB可用空间用于存储监控数据
如果你还没有安装Docker,可以用下面的命令快速安装:
# 更新包管理器
sudo apt-get update
# 安装必要的依赖
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加Docker仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# 验证安装
sudo docker --version
3. 部署ccmusic-database并暴露监控指标
首先,我们需要让ccmusic-database服务能够提供监控数据。Prometheus通过HTTP接口拉取数据,所以我们要给服务添加一个/metrics端点。
3.1 修改ccmusic-database服务代码
在原来的app.py基础上,我们需要添加监控指标的支持。这里使用Python的prometheus_client库。
创建一个新的文件app_with_metrics.py:
import gradio as gr
import torch
import torch.nn as nn
import librosa
import numpy as np
from PIL import Image
import time
from prometheus_client import start_http_server, Counter, Histogram, Gauge
import threading
# 初始化Prometheus指标
# QPS计数器
REQUEST_COUNT = Counter('ccmusic_requests_total', 'Total number of requests')
# 延迟直方图(单位:秒)
REQUEST_LATENCY = Histogram('ccmusic_request_latency_seconds', 'Request latency in seconds', buckets=[0.1, 0.5, 1.0, 2.0, 5.0])
# 正在处理的请求数
REQUESTS_IN_PROGRESS = Gauge('ccmusic_requests_in_progress', 'Number of requests in progress')
# 分类结果分布
GENRE_PREDICTIONS = Counter('ccmusic_genre_predictions_total', 'Genre predictions', ['genre'])
# 启动Prometheus metrics服务器(在端口8000)
def start_metrics_server():
start_http_server(8000)
# 在后台线程中启动metrics服务器
metrics_thread = threading.Thread(target=start_metrics_server, daemon=True)
metrics_thread.start()
# 这里放置你原有的模型加载和预处理代码
# 为了简洁,我假设你已经有了这些函数:
# load_model(), extract_cqt(), predict_genre()等
def analyze_audio(audio_file):
"""分析音频文件并返回分类结果"""
# 增加正在处理的请求数
REQUESTS_IN_PROGRESS.inc()
# 记录请求开始时间
start_time = time.time()
try:
# 记录请求总数
REQUEST_COUNT.inc()
# 这里是原有的音频处理逻辑
# 1. 加载音频
# 2. 提取CQT特征
# 3. 模型推理
# 4. 获取分类结果
# 模拟处理时间(实际中是你的模型推理时间)
time.sleep(0.5) # 模拟处理时间
# 假设这是预测结果
top_genres = [
{"genre": "Symphony", "probability": 0.85},
{"genre": "Chamber", "probability": 0.10},
{"genre": "Solo", "probability": 0.05}
]
# 记录分类结果到Prometheus
for result in top_genres:
GENRE_PREDICTIONS.labels(genre=result["genre"]).inc()
# 构建返回结果
result_text = "Top 5预测结果:\n"
for i, res in enumerate(top_genres, 1):
result_text += f"{i}. {res['genre']}: {res['probability']*100:.2f}%\n"
return result_text
finally:
# 减少正在处理的请求数
REQUESTS_IN_PROGRESS.dec()
# 记录请求延迟
latency = time.time() - start_time
REQUEST_LATENCY.observe(latency)
# 创建Gradio界面
with gr.Blocks() as demo:
gr.Markdown("# 🎵 音乐流派分类系统")
gr.Markdown("上传音频文件,自动识别16种音乐流派")
with gr.Row():
audio_input = gr.Audio(label="上传音频文件", type="filepath")
output_text = gr.Textbox(label="分类结果", lines=10)
analyze_btn = gr.Button("分析音频")
analyze_btn.click(
fn=analyze_audio,
inputs=audio_input,
outputs=output_text
)
gr.Markdown("### 监控指标")
gr.Markdown("服务监控指标可在 http://localhost:8000/metrics 查看")
# 启动服务
if __name__ == "__main__":
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False
)
3.2 安装必要的Python包
除了ccmusic-database原有的依赖,我们还需要安装监控相关的包:
pip install prometheus-client
3.3 启动带监控的服务
现在启动修改后的服务:
python3 app_with_metrics.py
服务启动后,你可以在两个端口访问:
http://localhost:7860:正常的Gradio Web界面http://localhost:8000:Prometheus指标端点
访问http://localhost:8000/metrics,你会看到类似这样的指标数据:
# HELP ccmusic_requests_total Total number of requests
# TYPE ccmusic_requests_total counter
ccmusic_requests_total 0
# HELP ccmusic_request_latency_seconds Request latency in seconds
# TYPE ccmusic_request_latency_seconds histogram
ccmusic_request_latency_seconds_bucket{le="0.1"} 0
ccmusic_request_latency_seconds_bucket{le="0.5"} 0
ccmusic_request_latency_seconds_bucket{le="1.0"} 0
ccmusic_request_latency_seconds_bucket{le="2.0"} 0
ccmusic_request_latency_seconds_bucket{le="5.0"} 0
ccmusic_request_latency_seconds_bucket{le="+Inf"} 0
ccmusic_request_latency_seconds_sum 0
ccmusic_request_latency_seconds_count 0
# HELP ccmusic_requests_in_progress Number of requests in progress
# TYPE ccmusic_requests_in_progress gauge
ccmusic_requests_in_progress 0
4. 部署Prometheus收集监控数据
有了数据源,接下来我们需要部署Prometheus来定期收集这些指标。
4.1 创建Prometheus配置文件
创建一个目录来存放配置和数据:
mkdir -p ~/prometheus-config
cd ~/prometheus-config
创建Prometheus的配置文件prometheus.yml:
global:
scrape_interval: 15s # 每15秒抓取一次数据
evaluation_interval: 15s # 每15秒评估一次规则
# 告警规则配置(可选,后续可以添加)
rule_files:
# - "alert_rules.yml"
# 告警管理器配置(可选)
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# 抓取配置 - 这里定义我们要监控的目标
scrape_configs:
# 监控Prometheus自身
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 监控ccmusic-database服务
- job_name: 'ccmusic-database'
static_configs:
- targets: ['localhost:8000'] # 我们刚才暴露的metrics端口
metrics_path: '/metrics'
scrape_interval: 10s # 对这个服务,我们10秒抓取一次
# 监控节点(服务器本身)的指标
- job_name: 'node-exporter'
static_configs:
- targets: ['localhost:9100']
# 监控GPU指标(如果有NVIDIA GPU)
- job_name: 'nvidia-gpu'
static_configs:
- targets: ['localhost:9835']
scrape_interval: 5s # GPU指标变化快,抓取间隔短一些
4.2 使用Docker运行Prometheus
用Docker运行Prometheus最简单:
docker run -d \
--name=prometheus \
-p 9090:9090 \
-v ~/prometheus-config/prometheus.yml:/etc/prometheus/prometheus.yml \
-v prometheus-data:/prometheus \
prom/prometheus:latest
参数解释:
-p 9090:9090:将容器的9090端口映射到主机的9090端口-v .../prometheus.yml:/etc/prometheus/prometheus.yml:挂载配置文件-v prometheus-data:/prometheus:创建数据卷,持久化存储监控数据
4.3 验证Prometheus运行
访问http://localhost:9090,你应该能看到Prometheus的Web界面。
在顶部导航栏点击"Status" -> "Targets",你会看到配置的监控目标列表。如果一切正常,ccmusic-database这个job的状态应该是"UP"(绿色)。
5. 监控服务器资源指标
除了应用本身的指标,我们还需要监控服务器的CPU、内存、磁盘、网络等资源使用情况。这通过node-exporter来实现。
5.1 部署Node Exporter
Node Exporter是Prometheus官方提供的节点监控代理:
docker run -d \
--name=node-exporter \
--net="host" \
--pid="host" \
-v "/:/host:ro,rslave" \
quay.io/prometheus/node-exporter:latest \
--path.rootfs=/host
--net="host"和--pid="host"让容器能够访问主机的网络和进程信息。
5.2 验证Node Exporter
访问http://localhost:9100/metrics,你应该能看到大量的系统指标,比如:
node_cpu_seconds_total:CPU使用时间node_memory_MemTotal_bytes:总内存node_filesystem_size_bytes:文件系统大小
6. 监控GPU利用率(如果使用GPU)
如果你的ccmusic-database服务运行在带NVIDIA GPU的服务器上,监控GPU利用率就特别重要。
6.1 部署NVIDIA GPU Exporter
首先确保已经安装了NVIDIA驱动和nvidia-docker运行时。
然后运行NVIDIA GPU Exporter:
docker run -d \
--name=nvidia-gpu-exporter \
--runtime=nvidia \
-p 9835:9835 \
nvidia/gpu-monitoring-tools:2.3.1-20.09
6.2 验证GPU指标
访问http://localhost:9835/metrics,你会看到GPU相关的指标,比如:
nvidia_gpu_duty_cycle:GPU利用率百分比nvidia_gpu_memory_total_bytes:GPU总内存nvidia_gpu_memory_used_bytes:GPU已用内存nvidia_gpu_temperature_celsius:GPU温度
7. 配置Grafana可视化监控数据
数据都有了,现在我们需要一个漂亮的界面来展示它们。这就是Grafana的用武之地。
7.1 部署Grafana
docker run -d \
--name=grafana \
-p 3000:3000 \
-v grafana-data:/var/lib/grafana \
grafana/grafana:latest
7.2 初始配置Grafana
- 访问
http://localhost:3000 - 使用默认账号登录:admin / admin
- 首次登录会要求修改密码
7.3 添加Prometheus数据源
- 点击左侧齿轮图标 -> "Data Sources"
- 点击"Add data source"
- 选择"Prometheus"
- 配置URL为
http://host.docker.internal:9090(如果你在宿主机访问)或http://你的服务器IP:9090 - 点击"Save & Test",应该显示"Data source is working"
7.4 导入监控仪表盘
Grafana社区有很多现成的仪表盘模板,我们可以直接导入使用。
7.4.1 导入Node Exporter仪表盘
- 点击左侧"+"图标 -> "Import"
- 输入仪表盘ID:1860(Node Exporter Full)
- 选择Prometheus数据源
- 点击"Import"
这个仪表盘会显示CPU、内存、磁盘、网络等全面的系统指标。
7.4.2 创建ccmusic-database专属仪表盘
虽然可以导入现成的,但针对我们的服务,最好创建一个定制化的仪表盘。
点击"Create" -> "Dashboard" -> "Add new panel",然后添加以下面板:
面板1:QPS(每秒请求数)
- 查询:
rate(ccmusic_requests_total[1m]) - 可视化:Time series
- 标题:请求速率 (QPS)
- Y轴单位:req/s
面板2:请求延迟分布
- 查询:
histogram_quantile(0.95, rate(ccmusic_request_latency_seconds_bucket[5m])) - 可视化:Time series
- 标题:P95延迟
- Y轴单位:seconds
添加另一个查询显示中位数延迟:
- 查询:
histogram_quantile(0.50, rate(ccmusic_request_latency_seconds_bucket[5m]))
面板3:正在处理的请求数
- 查询:
ccmusic_requests_in_progress - 可视化:Stat
- 标题:当前处理中的请求
面板4:分类结果分布
- 查询:
rate(ccmusic_genre_predictions_total[5m]) - 可视化:Pie chart
- 标题:音乐流派分布(最近5分钟)
面板5:GPU利用率(如果有GPU)
- 查询:
nvidia_gpu_duty_cycle - 可视化:Gauge
- 标题:GPU利用率
- 单位:percent (0-100)
面板6:GPU内存使用
- 查询:
nvidia_gpu_memory_used_bytes / nvidia_gpu_memory_total_bytes * 100 - 可视化:Time series
- 标题:GPU内存使用率
- 单位:percent
面板7:系统资源概览
- 查询1:
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)(CPU使用率) - 查询2:
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100(内存使用率) - 可视化:Time series
- 标题:CPU & 内存使用率
把这些面板合理排列,你的监控仪表盘就初具雏形了。
8. 实际效果展示与使用技巧
部署完成后,让我们看看这套监控系统能带来什么价值。
8.1 实时监控服务状态
打开Grafana仪表盘,你可以一眼看到:
- 当前有多少请求正在处理
- 最近一分钟的QPS是多少
- P95延迟是否在可接受范围内
- GPU是否被充分利用
- 系统资源是否充足
8.2 发现性能瓶颈
假设你发现某个时段的延迟突然升高,可以结合多个指标分析原因:
- 如果GPU利用率同时达到100%,可能是模型计算成为瓶颈
- 如果QPS很高但GPU利用率低,可能是批处理大小不合适
- 如果内存使用率持续增长,可能有内存泄漏
8.3 容量规划参考
通过监控历史数据,你可以了解:
- 高峰时段的QPS是多少,需要多少资源
- 平均延迟是多少,用户体验如何
- 资源使用趋势,什么时候需要扩容
8.4 实用技巧与建议
-
设置告警:在Grafana中可以设置告警规则,比如当延迟超过2秒或错误率超过5%时发送通知。
-
长期数据存储:Prometheus默认只保存15天数据。对于长期趋势分析,可以考虑集成VictoriaMetrics或Thanos。
-
多实例监控:如果你的ccmusic-database部署了多个实例,Prometheus可以同时监控所有实例,并在Grafana中聚合展示。
-
自定义指标:除了基本的QPS和延迟,你还可以添加业务相关的指标,比如每种音乐流派的识别准确率。
-
监控服务可用性:使用
up{job="ccmusic-database"}指标监控服务是否在线。
9. 常见问题与解决方案
在实际部署和使用过程中,你可能会遇到一些问题。这里列举一些常见情况:
9.1 Prometheus抓取失败
问题:在Prometheus的Targets页面看到ccmusic-database状态是DOWN。
可能原因和解决:
- 端口不对:检查
app_with_metrics.py中Prometheus客户端是否在8000端口启动,以及Prometheus配置中的target端口是否正确。 - 防火墙阻止:确保8000端口在防火墙中是开放的。
- 服务未运行:确认ccmusic-database服务正在运行。
9.2 Grafana看不到数据
问题:Grafana中查询返回"No data"。
解决步骤:
- 检查Grafana数据源配置是否正确
- 在Grafana中直接查询
ccmusic_requests_total,看是否有数据 - 访问
http://localhost:8000/metrics,确认服务是否在产生指标 - 检查Prometheus的Targets页面,确认抓取是否成功
9.3 监控指标太多影响性能
问题:添加监控后,服务性能下降。
解决方案:
- 调整抓取间隔:将
scrape_interval从10秒调整为30秒或60秒 - 减少指标数量:只暴露关键指标,不必要的指标不要暴露
- 使用Prometheus的采样功能
9.4 Docker容器网络问题
问题:容器间无法通信。
解决方案:
- 使用
--network="host"模式运行容器,让容器使用主机网络 - 或者创建自定义Docker网络:
docker network create monitor-net,然后所有容器都加入这个网络 - 在配置中使用容器名而不是localhost,比如Prometheus配置中targets写
ccmusic-database:8000
9.5 数据持久化
问题:容器重启后监控数据丢失。
解决方案:
- 使用Docker volume持久化数据(我们在运行命令中已经加了
-v参数) - 定期备份Prometheus数据目录
- 考虑使用更专业的长期存储方案
10. 总结
通过这套Prometheus+Grafana监控方案,我们为ccmusic-database音乐流派分类服务装上了全方位的"监控仪表盘"。现在你可以:
- 实时掌握服务状态:随时查看QPS、延迟、错误率等关键指标
- 快速定位问题:当服务出现异常时,通过监控数据快速找到瓶颈所在
- 优化资源配置:根据实际使用情况调整服务器配置,避免资源浪费或不足
- 提升用户体验:通过监控延迟,确保用户获得快速响应
- 数据驱动决策:基于历史数据做出容量规划和优化决策
这套方案不仅适用于ccmusic-database,任何Web服务或API都可以用类似的方式添加监控。监控是服务可观测性的重要组成部分,有了它,你才能安心地把服务部署到生产环境。
监控系统的价值在于,它让你从"猜测"服务状态变为"确知"服务状态。当用户反馈"服务有点慢"时,你不再需要盲目排查,而是可以直接查看监控图表,找到问题根源。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐


所有评论(0)