当前位置: 首页 > news >正文

Gin框架接入pyroscope完美替代pprof实现检测内存泄露

传统检测内存泄露可以看一下我这篇文章Gin框架接入Prometheus,grafana辅助pprof检测内存泄露-CSDN博客

pyroscope被Grafana收购,GPT来总结一下pyroscope的强大之处🐶

pyroscope github地址

pyroscope与grafana的安装

docker compose安装,这里我们其实可以不使用grafana,pyroscope已经是一个很完整的产品,但是我们在grafana里面可以配置数据源,也可以在grafana里面查看,grafana暂时还没有好的pyroscope dashboard

version: '3.8'services:grafana:image: grafana/grafanacontainer_name: grafanaports:- "3000:3000"networks:- monitoringdepends_on:- prometheuspyroscope:image: grafana/pyroscopecontainer_name: pyroscopeports:- "4040:4040"networks:- monitoring    networks:monitoring:driver: bridge

 执行

docker-compose up -d 

 访问Pyroscope   http://localhost:4040/ 我们可以看到go语言的各种性能指标与pprof检测的各类指标差不多

Gin框架中间件配置

我们在gin框架中间件中集成这个检测插件

ApplicationName: "simple.golang.app.golang",用于在Pyroscope筛选服务

package initializationimport ("awesomeProject3/middware""awesomeProject3/router""github.com/Depado/ginprom""github.com/gin-gonic/gin""github.com/grafana/pyroscope-go"_ "net/http/pprof""runtime"
)func Routers() *gin.Engine {r := gin.New()r.Use(p.Instrument())runtime.SetMutexProfileFraction(5)runtime.SetBlockProfileRate(5)pyroscope.Start(pyroscope.Config{ApplicationName: "simple.golang.app.golang",// replace this with the address of pyroscope serverServerAddress: "http://localhost:4040",// you can disable logging by setting this to nilLogger: pyroscope.StandardLogger,// you can provide static tags via a map:Tags: map[string]string{"hostname": "ginapp"},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,},})return r
}

模拟内存泄露

我们来模拟内存泄露 对下面接口压测,压测粒度小一点,来看pyroscope的作用。

我们生产项目中出现过一次严重的内存泄露,例子如下图所示,该接口qps非常高

pyroscope监控查看内存泄露

我们点击Single可以看到详细的火焰图以及性能瓶颈,内存泄露的方法集代码,也就是产生goroutine泄露的地方

结论

我们在使用golang 高并行处理下游任务的时候,一定要对下游基础设施要有敬畏之心,调用时限制goroutine的运行数量并且设置上context超时控制,做好超时熔断措施,做好监控警告,下游基础设施如果达到瓶颈,我们可对下游基础进行主从 水平扩容等。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 离职保密协议是什么?怎么样才是合法的?如何维护公司权益?
  • DataGear 企业版 1.2.0 发布,数据可视化分析平台
  • django常用的组合搜索组件
  • 【区块链+金融服务】山西省信易贷平台 | FISCO BCOS应用案例
  • redis面试(九)锁重入和互斥
  • 基于PCA-BP的数据多变量回归预测 Matlab代码(多输入单输出)[可显示原始特征贡献率+贡献率排序+累计贡献率]
  • 【Git】远程仓库新建分支后,拉到本地开发
  • 音视频概要
  • 主机防火墙测试--IPV6地址TCP/UDP/ICMP协议测试方法
  • 应对FingerprintJS反爬:Selenium的破解策略与技术详解
  • 【零基础学习CAPL语法】——TestWaitForMessage:等待指定报文
  • MongoDB教程
  • Elasticsearch 桶(Bucket)聚合详解及示例
  • 基于vue框架的XXXX勤工助学管理系统vl6ft(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • Unity3D Rect Transform 组件详解
  • 4个实用的微服务测试策略
  • Babel配置的不完全指南
  • co.js - 让异步代码同步化
  • ES6语法详解(一)
  • HTTP 简介
  • HTTP中GET与POST的区别 99%的错误认识
  • input的行数自动增减
  • MD5加密原理解析及OC版原理实现
  • opencv python Meanshift 和 Camshift
  • SwizzleMethod 黑魔法
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 记一次用 NodeJs 实现模拟登录的思路
  • 利用jquery编写加法运算验证码
  • 面试遇到的一些题
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 通信类
  • 学习笔记:对象,原型和继承(1)
  • 优化 Vue 项目编译文件大小
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #define、const、typedef的差别
  • #mysql 8.0 踩坑日记
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (Ruby)Ubuntu12.04安装Rails环境
  • (二)hibernate配置管理
  • (二)正点原子I.MX6ULL u-boot移植
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (三)终结任务
  • (十三)Maven插件解析运行机制
  • (转)memcache、redis缓存
  • (转)大道至简,职场上做人做事做管理
  • (自适应手机端)行业协会机构网站模板
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • *算法训练(leetcode)第四十五天 | 101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104. 建造最大岛屿
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务