首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >打破性能分析困境:探索高效持续分析平台

打破性能分析困境:探索高效持续分析平台

原创
作者头像
不做虫子
发布2025-09-12 17:34:34
发布2025-09-12 17:34:34
1380
举报

问题

由于海外业务的特殊性,峰值流量经常是发生在国内夜间,往往出现性能问题时,开发可能都在睡觉,早上才能发现机器性能告警,但此时现场已经不复存在,性能分析难上加难,效率比较低。

解决方案

持续分析(Continuous profiling)是在生产环境中持续 收集应用程序性能数据,并将这些数据提供给开发人员进行深入分析的过程。

另外我们可能需要不同时段的profile进行对比,进行比较才能发现问题,比如内存泄露的问题。

持续分析平台调研

Pyroscope是一个开源的持续分析系统,使用Go语言实现。服务端使用web页面查看,提供丰富的分析的功能,客户端提供Go、Java、Python、Ruby、PHP、.NET等多种语言的支持,并且支持PUSH、PULL两种采集方式。

架构图
架构图

支持的指标

目前go SDK支持以下指标

代码语言:javascript
复制
    ProfileCPU           ProfileType = "cpu"
    ProfileInuseObjects  ProfileType = "inuse_objects"
    ProfileAllocObjects  ProfileType = "alloc_objects"
    ProfileInuseSpace    ProfileType = "inuse_space"
    ProfileAllocSpace    ProfileType = "alloc_space"
    ProfileGoroutines    ProfileType = "goroutines"
    ProfileMutexCount    ProfileType = "mutex_count"
    ProfileMutexDuration ProfileType = "mutex_duration"
    ProfileBlockCount    ProfileType = "block_count"
    ProfileBlockDuration ProfileType = "block_duration"

1. ProfileCPU ("cpu")-官方默认

  • 含义: CPU 使用率分析
  • 作用: 记录程序在 CPU 上执行的时间分布,显示哪些函数消耗了最多的 CPU 时间
  • 用途: 识别性能瓶颈,优化热点代码

2. ProfileInuseObjects ("inuse_objects")-官方默认

  • 含义: 当前正在使用的对象数量
  • 作用: 统计程序运行时刻内存中活跃的对象数量
  • 用途: 内存泄漏检测,了解内存使用模式

3. ProfileAllocObjects ("alloc_objects")-官方默认

  • 含义: 对象分配数量统计
  • 作用: 记录程序运行期间分配的对象总数
  • 用途: 分析内存分配模式,优化对象创建频率

4. ProfileInuseSpace ("inuse_space")-官方默认

  • 含义: 当前正在使用的内存空间大小
  • 作用: 统计程序运行时刻内存中活跃对象占用的字节数
  • 用途: 内存使用量监控,内存优化

5. ProfileAllocSpace ("alloc_space")-官方默认

  • 含义: 内存分配空间统计
  • 作用: 记录程序运行期间分配的总内存字节数
  • 用途: 分析内存分配量,识别大内存分配

6. ProfileGoroutines ("goroutines")-官方建议可选

  • 含义: Goroutine 数量统计
  • 作用: 监控程序中运行的 goroutine 数量
  • 用途: 并发性能分析,goroutine 泄漏检测

7. ProfileMutexCount ("mutex_count")-官方建议可选

  • 含义: 互斥锁竞争次数统计
  • 作用: 记录程序运行期间发生的互斥锁竞争次数
  • 用途: 并发性能分析,识别锁竞争热点

8. ProfileMutexDuration ("mutex_duration")-官方建议可选

  • 含义: 互斥锁等待时间统计
  • 作用: 记录程序在等待互斥锁时花费的时间
  • 用途: 分析锁性能,优化并发代码

9. ProfileBlockCount ("block_count")-官方建议可选

  • 含义: 阻塞事件次数统计
  • 作用: 记录程序运行期间发生的阻塞事件次数
  • 用途: 分析程序阻塞原因,优化 I/O 操作

10. ProfileBlockDuration ("block_duration")-官方建议可选

  • 含义: 阻塞时间统计
  • 作用: 记录程序在阻塞状态下花费的总时间
  • 用途: 分析阻塞性能,优化等待时间

性能损耗

官方文档说明性能损耗在3~5%之间,比其他的分析平台要低很多。

默认每 15 秒收集一次性能数据并上传,可调整。

分析效果展示

可以选择火焰图

也可以选取不同的时间段进行比较, 左右的图形的时间只需在时间线上拖拽选取即可。

还可以进行diff视图进行分析(内存泄露需要用到

快速开始

安装server

server端主要是收集各个SDK端发送过来的数据并提供UI界面进行分析。

我本地是安装了docker,所以直接运行docker镜像

代码语言:javascript
复制
docker pull grafana/pyroscope:latest
docker network create pyroscope-demo
docker run --rm --name pyroscope --network=pyroscope-demo -p 4040:4040 grafana/pyroscope:latest

go服务启动agent

代码语言:javascript
复制
pyroscope.Start(pyroscope.Config{
        ApplicationName: "scope_demo2",

        // replace this with the address of pyroscope server
        ServerAddress: "http://localhost:4040",

        // you can disable logging by setting this to nil
        Logger: pyroscope.StandardLogger,

        // you can provide static tags via a map:
        Tags: map[string]string{"hostname": "song_mac"},

        ProfileTypes: []pyroscope.ProfileType{
            // these profile types are enabled by default:
            pyroscope.ProfileCPU,
            pyroscope.ProfileAllocObjects,
            pyroscope.ProfileAllocSpace,
            pyroscope.ProfileInuseObjects,
            pyroscope.ProfileInuseSpace,

            // these profile types are optional:
            pyroscope.ProfileGoroutines,
            pyroscope.ProfileMutexCount,
            pyroscope.ProfileMutexDuration,
            pyroscope.ProfileBlockCount,
            pyroscope.ProfileBlockDuration,
        },
    })
    fmt.Println("Pyroscope started")

结语

综上所述,Pyroscope 作为一款开源的持续分析系统,为解决海外业务性能分析困境提供了有效的方案。它支持多种语言,具备丰富的分析功能与多样的采集方式,性能损耗低。

通过其提供的多种指标,如 CPU 使用率、内存使用情况、并发性能指标等,开发人员能够深入剖析应用程序性能。无论是火焰图、链路图,还是时段对比及 diff 视图等分析方式,都为性能优化提供了有力支持。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 解决方案
  • 持续分析平台调研
    • 支持的指标
      • 1. ProfileCPU ("cpu")-官方默认
      • 2. ProfileInuseObjects ("inuse_objects")-官方默认
      • 3. ProfileAllocObjects ("alloc_objects")-官方默认
      • 4. ProfileInuseSpace ("inuse_space")-官方默认
      • 5. ProfileAllocSpace ("alloc_space")-官方默认
      • 6. ProfileGoroutines ("goroutines")-官方建议可选
      • 7. ProfileMutexCount ("mutex_count")-官方建议可选
      • 8. ProfileMutexDuration ("mutex_duration")-官方建议可选
      • 9. ProfileBlockCount ("block_count")-官方建议可选
      • 10. ProfileBlockDuration ("block_duration")-官方建议可选
    • 性能损耗
    • 分析效果展示
    • 快速开始
      • 安装server
      • go服务启动agent
  • 结语
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档