09.14性能优化

分类: 后端集成 Java Spring Boot OpenTelemetry

性能优化

欢迎回到第 9 章的学习。在上一节,我们学习了微服务间追踪传播。现在我们要学习性能优化,这对于在生产环境中运行可观察性系统非常重要。

本节将学习:采样优化、批处理优化、异步导出、以及资源监控。

采样优化

采样优化的目标是什么? 在保证可观察性的同时,减少数据量和成本,降低 Collector 负载,提高系统性能。

采样优化策略有哪些呢?

第一种:调整采样率。 根据实际需求调整采样率,比如从 100% 降到 10%,减少 90% 的数据量。

第二种:基于条件的采样。 只采样重要的请求,比如错误请求、慢请求、特定路径的请求。更智能,但配置复杂。

第三种:基于父级的采样。 使用

parentbased_traceidratio
,如果父 Span 被采样,子 Span 也被采样,保证链路完整性。

优化建议: 从高采样率开始,逐步降低,监控可观察性是否受影响,找到平衡点。

配置代码:

文件路径:

src/main/resources/application.properties

# Reduce the sampling rate to 5%
otel.traces.sampler=traceidratio
otel.traces.sampler.arg=0.05

# Or use parent-based sampling (recommended for distributed systems))
# otel.traces.sampler=parentbased_traceidratio
# otel.traces.sampler.arg=0.05

批处理优化

批处理优化的目标是什么? 平衡性能和延迟,提高吞吐量,降低网络调用,减少资源使用。

批处理参数优化:

第一个:批次延迟(schedule.delay)。 增加延迟(如 10 秒)可以提高批次大小,减少网络调用,但增加延迟。

第二个:最大批次大小(max.export.batch.size)。 增加批次大小(如 1024)可以提高吞吐量,但增加内存使用。

第三个:最大队列大小(max.queue.size)。 增加队列大小可以缓冲更多数据,但增加内存使用。

优化建议: 从默认值开始,根据实际负载调整,测试不同配置,找到性能和延迟的平衡点。

配置代码:

文件路径:

src/main/resources/application.properties

# Batch processing optimization configuration
otel.bsp.schedule.delay=10000
otel.bsp.max.queue.size=4096
otel.bsp.max.export.batch.size=1024
otel.bsp.export.timeout=30000

异步导出

异步导出的作用是什么? 避免阻塞业务逻辑,在后台异步处理数据导出,减少对应用性能的影响。

异步导出机制: OpenTelemetry 默认使用异步导出,数据收集和导出是异步的,不会阻塞业务逻辑。

批处理与异步导出的关系: 批处理是异步导出的一部分,数据先收集到内存队列,然后批量导出。

优化建议: 确认使用异步导出(默认),配置批处理参数优化导出性能,监控导出线程使用情况,确保不会阻塞业务逻辑。

验证命令:

# utilized jstack View thread usage
jstack <pid> | grep -A 10 "otel"

# utilized jvisualvm or JProfiler View thread status
# Verify that the export thread does not block the business thread

资源监控

资源监控的作用是什么? 监控可观察性系统本身的资源使用情况,确保系统稳定运行,及时发现资源问题。

监控的指标有哪些呢?

第一个:内存使用。 使用

jstat -gc <pid>
监控 JVM 内存使用,监控堆内存、非堆内存、GC 情况。

第二个:CPU 使用。 使用

top
htop
监控 CPU 使用率,监控线程 CPU 使用。

第三个:网络流量。 使用

netstat
ss
监控网络连接,监控数据传输量。

第四个:可观察性指标。 在 Grafana 中创建 Dashboard,监控可观察性系统的指标,设置告警。

监控命令示例:

# surveillance JVM memory usage
jstat -gc <pid> 1000

# surveillance CPU utilized
top -p <pid>
# or use htop
htop -p <pid>

# Monitor network connections
netstat -an | grep 4317  # OTLP gRPC ports
ss -tn | grep 4317

# Monitor network traffic
iftop -i eth0

本节小结

在本节中,我们学习了性能优化:

第一个是采样优化。 调整采样率、基于条件的采样、基于父级的采样,减少数据量,保持可观察性。

第二个是批处理优化。 优化批次延迟、批次大小、队列大小,平衡性能和延迟,提高吞吐量。

第三个是异步导出。 使用异步导出,避免阻塞业务逻辑,在后台处理数据导出。

第四个是资源监控。 监控内存、CPU、网络使用,创建 Dashboard,设置告警,确保系统稳定运行。

性能优化流程: 采样优化 → 批处理优化 → 异步导出 → 资源监控 → 稳定运行。

这就是性能优化。通过合理的优化,我们可以在生产环境中稳定运行可观察性系统。

在下一节,我们将进行练习:构建完整的后端服务。通过完整的练习,巩固前面学习的知识。