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

news2024/11/13 22:37:41

传统检测内存泄露可以看一下我这篇文章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/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    networks:
      - monitoring
    depends_on:
      - prometheus



  pyroscope:
    image: grafana/pyroscope
    container_name: pyroscope
    ports:
      - "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 initialization

import (
	"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 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": "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超时控制,做好超时熔断措施,做好监控警告,下游基础设施如果达到瓶颈,我们可对下游基础进行主从 水平扩容等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038165.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GET和POST这两种常用的HTTP请求方法的区别

GET和POST是HTTP协议中最常用的两种请求方法,它们在使用场景、安全性、数据传输等方面有很大的不同。让我从以下几个方面来比较GET和POST: 1.「用途和语义」 「GET」: 主要用于获取资源 应该是幂等的,即多次请求应该返回相同的结果 通常用…

超详细!!!electron-vite-vue开发桌面应用之开启调试工具(二)

云风网 云风笔记 云风知识库 上篇已经初步搭建完项目,这次配置比较重要的一部分,那就是开启调试工具,这是开发项目比较重要且基础的部分 vite.config.ts配置更新 main: {// Shortcut of build.lib.entry.entry: electron/main.ts,onstart(ar…

2003-2023年高铁数据高铁开通时间数据

2003-2023年高铁数据高铁开通时间数据 1、时间:2003-2023年 2、来源:整理自高铁航线数据库(Chinese High-speed Rail and Airline Database,CRAD) 3、指标:高铁站名称、开通时间、所在省份、所在城市、所…

通过网关将数据上传到两台eqmx服务器上

我们是通过WAN 来读取数据。 线连接以后打开 然后要配置上去服务器 在这里遇到的问题是我自己搭emqx服务器的时候,没有固定ip地址,这个ip地址要通过ipconfig来获取,然后将其设置为静态IP地址,才可以的。让后emqx服务器还要重新启…

美股开户:新手投资者的完整入门教程

炒美股是许多投资者心中的梦想,但对于新手小白来说,如何开户炒美股可能会显得有些复杂和困难。本文将为您提供一份完整的入门教程,详细介绍从选择券商到完成开户的步骤,帮助您顺利进入美股市场。 选择合适的券商 在开户之前&…

【Linux基础】Linux中的开发工具(1)--yum和vim

目录 ✈️前言一,Linux 软件包管理器 yum1. 什么是软件包2. 如何安装软件3. 如何卸载软件 二,Linux编辑器-vim使用1. vim的基本概念1.1 命令/正常/普通模式1.2 插入模式1.3 底行模式 三,vim命令模式命令集1. 移动光标2. 删除字符3. 复制4. 替…

后端调优——分布式锁选型——入门

文章目录 引言正文分布式锁的定义分布式锁的具体应用场景如何实现分布式锁主动轮询型分布式锁实现思路一、MySQL分布式锁二、Redis分布式锁 监听回调型分布式锁Etcd分布式锁Zookeeper分布式锁 锁的对比 总结 引言 最近面试,一直被问到分布式锁,然后仅仅…

基于Martin实现MapboxGL自定义底图

概述 本文分享基于Martin实现MapboxGL底图的自定义。 实现后效果 Martin简介 Martin 是一个瓦片服务器,它能够从 PostGIS 数据库、PMTiles(本地或远程)以及 [MBTiles] (https://github.com/mapbox/mbtiles-spec) 文件中快速生成并提供矢量瓦…

七人共享拼团:社交电商的裂变新引擎

在当今电商市场中,七人共享拼团模式以其独特的社交属性和裂变机制,正成为一股不可忽视的力量。这一模式巧妙融合了社交电商的互动性与拼购的实惠性,通过平台利润回馈用户的方式,构建了一个既人性化又高效的奖励体系,旨…

QT 添加程序图标

1. 使用免费网站将其他图片格式转化成ico格式 Ico转换器 : https://cn.free-converter.com/ico-converter 2.qmake项目添加程序图标 在.pro文件内添加语句,如下图 RC_ICONS favicon.ico2.1 程序图标文件添加到项目目录内 2.2 通过windeployqt xxx.exe构建生成的…

动手研发实时口译系统

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

一文通晓 AI 框架

首先深度学习是机器学习研究领域中的一种范式,而深度学习的概念源于对人工神经网络的研究,很多深度学习算法都使用神经网络进行表示,因为神经网络的性能精度和通用效果都非常好,于是业界习惯性地把深度学习算法等同于 AI。 深度学…

GNSS位移监测站:高精度、高稳定性、高安全性

在现代工程与自然灾害监测领域,GNSS位移监测站以其卓越的功能优势,正逐步成为守护安全、预防灾害的重要工具。其采用的直径114mm加强型立杆,不仅坚固耐用,更严格遵循《地质灾害专群结合监测领警技术指南(试行&#xff…

企业建设零信任体系的核心思路

根据安全牛的调查研究发现,零信任安全理念已经较广泛得到国内各类型企业用户的认可,组织对应用零信任进行网络安全建设已经初具信心,零信任理念对网络安全防护工作的价值开始多方面的展现。 企业开展零信任网络建设的需求和驱动因素 本次调…

86.SAP ME工艺路线打开错误

目录 1.SAP ME工艺路线维护界面 2.错误情况 3.解决方法 1.SAP ME工艺路线维护界面 这个功能设计采用jnlp的方式打开,JNLP(Java Network Launching Protocol )是java提供的一种可以通过浏览器直接执行java应用程序的途径,它使你…

图论------如何使用矩阵来存储图的信息(邻接矩阵表示法)。

文章概述: 刚开始图论我们先不急于解决实际的问题,先去搞明白如何存储图的信息。实际上我们早就接触过类似的内容,比如上一篇文章的开灯关灯游戏中,我们使用一维数组来表示一排灯的状态,但是如果要表示更加复杂的内容怎…

【STM32】ADC模拟数字转换(规则组单通道)

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发 目录 ADC简介 ADC时钟配置 引脚模拟输入模式 规则组通道选择 ADC初始化 工作模式 数据对齐 触发转换方式 连续与单次转换模式 扫描模式 组内的通道个数 ADC初始化框架 ADC上电 ADC校…

高质量翻译对高质量内容和用户体验的影响

在当今全球化的数字环境中,高质量翻译在塑造高质量内容和用户体验方面的重要性怎么强调都不为过。随着公司和开发人员在不同地区和文化中扩大影响力,有效地翻译成为确保内容与不同受众产生共鸣的关键因素。高质量的翻译不仅保留了原始内容的完整性&#…

【网络层】上

目录 一. 网络层功能概述二. SDN的基本功能2.1 数据平面2.2 控制平面(传统方法/每路由器法)2.3 控制平面(SDN方法) 三. 路由算法与路由协议四. IP数据报4.1 IP数据报格式4.2 IP数据报分片4.3 IP地址 (IPV4)…

2024年华为认证H12-811题库(超级好用的刷题软件)

某个ACL规则如下:则下列哪些IP地址可以被permit规则匹配: rule 5 permit ip source 10.0.2.0 0.0.254.255 A、10.0.4.5 B、10.0.5.6 C、10.0.6.7 D、10.0.2.1 试题答案:A;C;D 试题解析: 10.0.2.000001010.00000000.00000010.0000000…