SkyWalking 性能指标监控
指标监控架构
指标类型
SkyWalking 收集以下类型的性能指标:
服务指标:
- QPS(每秒请求数)
- 响应时间(平均、P50、P75、P90、P95、P99)
- 成功率
- 慢调用次数
JVM 指标:
- 堆内存使用
- 非堆内存使用
- GC 次数和时间
- 线程数
- 类加载数
数据库指标:
- SQL 执行次数
- SQL 执行时间
- 慢 SQL 统计
- 连接池状态
消息队列指标:
- 消息生产/消费速率
- 消息处理时间
- 消息积压量
数据流
┌─────────────────┐
│ Agent 采集 │
│ (指标 + 链路) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ OAP Server │
│ (聚合 + 分析) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ 存储引擎 │
│ (ES/MySQL) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ UI 展示 │
│ (仪表盘 + 告警) │
└─────────────────┘
服务指标监控
1. 基础指标
SkyWalking 自动收集以下服务指标:
QPS 指标:
service_cpm - 服务每分钟调用次数
service_sla - 服务成功率
响应时间指标:
service_resp_time - 平均响应时间
service_p50 - P50 响应时间
service_p75 - P75 响应时间
service_p90 - P90 响应时间
service_p95 - P95 响应时间
service_p99 - P99 响应时间
查看方式:
- 在 SkyWalking UI 的”服务”页面查看
- 选择时间范围(最近 1 小时/6 小时/24 小时等)
- 查看指标趋势图
2. 服务拓扑
服务依赖图:
- 自动生成了服务间调用关系
- 显示调用次数和响应时间
- 标识异常和慢调用
实例依赖图:
- 显示实例间的调用关系
- 分析负载均衡情况
- 发现热点实例
3. 端点分析
Endpoint 指标:
endpoint_cpm - 端点每分钟调用次数
endpoint_resp_time - 端点响应时间
endpoint_sla - 端点成功率
慢端点分析:
- 按响应时间排序
- 识别性能瓶颈
- 定位慢接口
示例查询:
query queryTopNEndpoint($duration: Duration!, $topN: Int!) {
readTopNEndpoint(duration: $duration, topN: $topN, order: DES) {
id
name
value
}
}
JVM 指标监控
1. 内存指标
堆内存:
jvm_memory_used - 堆内存使用量
jvm_memory_max - 堆内存最大值
jvm_memory_committed - 堆内存分配量
# 分区域
jvm_memory_pool_used - 各内存池使用量
- Eden Space
- Survivor Space
- Old Gen
- Metaspace
内存使用率计算:
内存使用率 = jvm_memory_used / jvm_memory_max * 100%
告警阈值:
- 警告:> 80%
- 严重:> 90%
2. GC 指标
GC 次数:
jvm_gc_count - GC 总次数
jvm_gc_young_count - Young GC 次数
jvm_gc_old_count - Old GC 次数
GC 时间:
jvm_gc_time - GC 总时间(毫秒)
jvm_gc_young_time - Young GC 时间
jvm_gc_old_time - Old GC 时间
GC 频率分析:
GC 频率 = jvm_gc_count / 时间窗口
告警阈值:
- Young GC 频率:> 10 次/分钟
- Old GC 频率:> 1 次/10 分钟
- Full GC 时间:> 1 秒
3. 线程指标
线程数:
jvm_thread_count - 活跃线程数
jvm_daemon_thread_count - 守护线程数
线程状态:
jvm_thread_runnable - 运行中线程
jvm_thread_blocked - 阻塞线程
jvm_thread_waiting - 等待线程
jvm_thread_timed_waiting - 超时等待线程
告警阈值:
- 线程数突增:> 50%
- 阻塞线程:> 10%
- 死锁检测:发现死锁
4. 类加载指标
类加载数:
jvm_class_loaded_count - 已加载类数
jvm_class_total_loaded_count - 累计加载类数
jvm_class_unloaded_count - 已卸载类数
数据库指标监控
1. SQL 执行指标
执行次数:
database_cpm - 数据库每分钟调用次数
执行时间:
database_resp_time - 平均响应时间
database_p90 - P90 响应时间
慢 SQL 统计:
database_slow_query_count - 慢查询次数
2. SQL 分析
慢 SQL 排行:
- 按执行时间排序
- 按调用次数排序
- 按影响行数排序
SQL 语句分析:
-- 查看慢 SQL
SELECT service_name, statement, avg_resp_time, count
FROM slow_query
WHERE time >= now() - interval '1 hour'
ORDER BY avg_resp_time DESC
LIMIT 10;
执行计划分析:
- 查看 SQL 执行计划
- 分析索引使用情况
- 优化建议
3. 连接池指标
HikariCP:
hikaricp_connections - 总连接数
hikaricp_active_connections - 活跃连接数
hikaricp_idle_connections - 空闲连接数
hikaricp_pending_threads - 等待线程数
Druid:
druid_active_count - 活跃连接数
druid_pooling_count - 池中连接数
druid_wait_thread_count - 等待线程数
告警阈值:
- 活跃连接率:> 80%
- 等待线程数:> 10
- 连接超时:> 1 秒
缓存指标监控
1. Redis 指标
命令执行:
redis_commands_per_sec - 每秒命令数
redis_resp_time - 响应时间
内存使用:
redis_used_memory - 已用内存
redis_max_memory - 最大内存
连接数:
redis_connected_clients - 连接客户端数
命中率:
hit_rate = keyspace_hits / (keyspace_hits + keyspace_misses)
2. 本地缓存指标
Caffeine:
caffeine_cache_size - 缓存大小
caffeine_hit_count - 命中次数
caffeine_miss_count - 未命中次数
caffeine_eviction_count - 淘汰次数
命中率计算:
hit_rate = hit_count / (hit_count + miss_count)
消息队列指标
1. Kafka 指标
生产指标:
kafka_produce_rate - 生产速率
kafka_produce_latency - 生产延迟
消费指标:
kafka_consume_rate - 消费速率
kafka_consume_latency - 消费延迟
kafka_lag - 消费积压
Topic 指标:
kafka_topic_partitions - 分区数
kafka_topic_replicas - 副本数
2. RocketMQ 指标
生产指标:
rocketmq_tps - 生产 TPS
rocketmq_latency - 生产延迟
消费指标:
rocketmq_consume_tps - 消费 TPS
rocketmq_consume_latency - 消费延迟
rocketmq_message_accumulation - 消息积压
自定义指标
1. 业务指标
订单指标:
@Component
public class OrderMetrics {
@Autowired
private MeterRegistry meterRegistry;
private Counter orderCreated;
private Counter orderFailed;
private Timer orderProcessTime;
@PostConstruct
public void init() {
orderCreated = Counter.builder("order.created")
.description("订单创建数")
.register(meterRegistry);
orderFailed = Counter.builder("order.failed")
.description("订单失败数")
.register(meterRegistry);
orderProcessTime = Timer.builder("order.process.time")
.description("订单处理时间")
.publishPercentileHistogram()
.register(meterRegistry);
}
public void recordOrderCreated() {
orderCreated.increment();
}
public void recordOrderFailed() {
orderFailed.increment();
}
public <T> T recordProcess(Supplier<T> supplier) {
return orderProcessTime.recordSupplier(supplier);
}
}
2. 指标上报
通过 Micrometer 上报:
management:
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
instance: ${spring.cloud.client.ip-address}
SkyWalking 接收:
# oap/application.yml
receiver-sharing-server:
default:
receiverHost: ${SW_RECEIVER_GRPC_HOST:"0.0.0.0"}
receiverPort: ${SW_RECEIVER_GRPC_PORT:11800}
仪表盘配置
1. 服务仪表盘
{
"configuration": {
"name": "服务监控",
"description": "服务核心指标监控"
},
"components": [
{
"type": "LineChart",
"title": "QPS 趋势",
"metrics": ["service_cpm"],
"duration": "LAST_HOUR"
},
{
"type": "LineChart",
"title": "响应时间",
"metrics": ["service_resp_time", "service_p90", "service_p95"],
"duration": "LAST_HOUR"
},
{
"type": "Gauge",
"title": "成功率",
"metrics": ["service_sla"],
"threshold": 99
}
]
}
2. JVM 仪表盘
{
"configuration": {
"name": "JVM 监控",
"description": "JVM 核心指标监控"
},
"components": [
{
"type": "LineChart",
"title": "堆内存使用",
"metrics": ["jvm_memory_used"],
"duration": "LAST_HOUR"
},
{
"type": "LineChart",
"title": "GC 次数",
"metrics": ["jvm_gc_count"],
"duration": "LAST_HOUR"
},
{
"type": "Table",
"title": "线程状态",
"metrics": [
"jvm_thread_runnable",
"jvm_thread_blocked",
"jvm_thread_waiting"
]
}
]
}
3. 数据库仪表盘
{
"configuration": {
"name": "数据库监控",
"description": "数据库性能指标监控"
},
"components": [
{
"type": "LineChart",
"title": "SQL 执行时间",
"metrics": ["database_resp_time"],
"duration": "LAST_HOUR"
},
{
"type": "Table",
"title": "慢 SQL 排行",
"query": "SELECT * FROM slow_query ORDER BY avg_time DESC LIMIT 10"
},
{
"type": "Gauge",
"title": "连接池使用率",
"metrics": ["hikaricp_active_connections"]
}
]
}
告警配置
1. 服务告警
# alarm-settings.yml
rules:
# 服务响应时间告警
service_resp_time_rule:
metrics-name: service_resp_time
op: ">"
threshold: 1000
period: 10
count: 3
silence-period: 5
message: 服务 {name} 响应时间超过 1 秒
# 服务成功率告警
service_sla_rule:
metrics-name: service_sla
op: "<"
threshold: 99
period: 10
count: 2
silence-period: 5
message: 服务 {name} 成功率低于 99%
2. JVM 告警
rules:
# 内存使用率告警
jvm_memory_rule:
metrics-name: jvm_memory_used
op: ">"
threshold: 85
period: 5
count: 2
silence-period: 10
message: JVM 内存使用率超过 85%
# GC 时间告警
jvm_gc_time_rule:
metrics-name: jvm_gc_time
op: ">"
threshold: 1000
period: 5
count: 3
silence-period: 5
message: GC 时间超过 1 秒
3. 数据库告警
rules:
# 慢 SQL 告警
database_slow_query_rule:
metrics-name: database_resp_time
op: ">"
threshold: 500
period: 5
count: 5
silence-period: 5
message: 数据库响应时间超过 500ms
# 连接池告警
connection_pool_rule:
metrics-name: hikaricp_active_connections
op: ">"
threshold: 80
period: 5
count: 2
silence-period: 10
message: 连接池使用率超过 80%
性能分析
1. 性能趋势分析
同比分析:
- 与上周同期对比
- 与上月同期对比
- 发现性能变化
环比分析:
- 与上一时段对比
- 发现性能波动
2. 性能瓶颈定位
调用链分析:
- 查看慢调用链路
- 分析耗时分布
- 定位瓶颈服务
数据库分析:
- 查看慢 SQL
- 分析执行计划
- 优化索引
JVM 分析:
- 查看 GC 日志
- 分析内存使用
- 优化 JVM 参数
3. 容量规划
趋势预测:
- 基于历史数据预测
- 评估容量需求
- 规划扩容时间
压力测试:
- 模拟峰值流量
- 评估系统容量
- 发现性能瓶颈
最佳实践
1. 指标选择
关键指标:
- QPS、响应时间、成功率
- JVM 内存使用率
- 数据库连接池使用率
- 慢 SQL 数量
辅助指标:
- 线程数
- GC 频率
- 缓存命中率
2. 告警优化
告警分级:
- P0:核心功能不可用
- P1:重要指标异常
- P2:次要指标异常
- P3:预警信息
告警降噪:
- 设置合理的阈值
- 配置静默期
- 避免告警风暴
3. 性能优化
定期分析:
- 每周性能报告
- 每月性能 review
- 季度性能优化
持续改进:
- 建立性能基线
- 跟踪性能变化
- 持续优化改进
总结
SkyWalking 提供丰富的性能指标监控功能,涵盖服务、JVM、数据库、消息队列等各个方面。
通过合理的指标选择和告警配置,可以全面了解系统运行状态,及时发现和处理性能问题。
建立完善的性能分析机制,定期 review 性能指标,持续优化系统性能。