cgo内存泄漏排查

示例程序:

package main

/*
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char* cMalloc() {
	char *mem = (char*)malloc(1024 * 1024 * 16);
	return mem;
}
void cMemset(char* mem) {
	memset(mem, '-', 1024 * 1024 * 16);
}
int arrLen = 1000;
int arrIndex;
char* globalMemAddr[1000];
void printAddr(char* mem) {
	if (arrIndex+1 >= arrLen) {
		arrIndex = 0;
	} else {
		arrIndex++;
	}
	globalMemAddr[arrIndex] = mem;
	printf("index: %d, addr: %p\n", arrIndex, globalMemAddr[arrIndex]);
}
*/
import "C"
import (
	"fmt"
	"net/http"
	_ "net/http/pprof"
	"os"
	"runtime"
	"sync"
	"time"
	"unsafe"
)

var size int = 1024 * 1024 * 16
var memStat runtime.MemStats

func main() {
	go func() {
		_ = http.ListenAndServe("0.0.0.0:9091", nil)
	}()
	if len(os.Args) > 1 && os.Args[1] == "1" {
		var wg sync.WaitGroup
		for {
			wg.Add(1)
			runtime.ReadMemStats(&memStat)
			fmt.Printf("total memory begin: %v mb\n", memStat.TotalAlloc/1024/1024)
			go doCMalloc(&wg)
			wg.Wait()
			runtime.ReadMemStats(&memStat)
			fmt.Printf("total memory   end: %v mb\n", memStat.TotalAlloc/1024/1024)
			time.Sleep(2000 * time.Millisecond)
		}
	} else {
		var wg sync.WaitGroup
		for {
			wg.Add(1)
			go doGoMalloc(&wg)
			wg.Wait()
			time.Sleep(2000 * time.Millisecond)
		}
	}
}

// 无泄漏
func doCMalloc(wg *sync.WaitGroup) {
	defer wg.Done()
	cptr := C.cMalloc()
	C.cMemset(cptr)
	C.printAddr(cptr)
	bs := C.GoBytes(unsafe.Pointer(cptr), C.int(size))
	fmt.Printf("1: %s .. %s\n", string(bs[0:8]), string(bs[size-8:size]))
	C.free(unsafe.Pointer(cptr))
}

// 无泄漏
func doGoMalloc(wg *sync.WaitGroup) {
	defer wg.Done()
	bs := make([]byte, size, size)
	cptr := (*C.char)(unsafe.Pointer(&bs[0]))
	C.cMemset(cptr)
	C.printAddr(cptr)
	fmt.Printf("2: %s .. %s\n", string(bs[0:8]), string(bs[size-8:size]))
}

运行分支1:

将doCMalloc函数内的C.free注释掉。

go build memleak.go
./memleak 1

查看控制台输出:

查看top输出:

查看pprof输出:

#yum install graphviz

go tool pprof -http=192.168.36.5:9000 http://127.0.0.1:9091/debug/pprof/allocs

常规go工具链无法监测cgo内存:

可以发现:不管是runtime.ReadMemStats还是pprof都不包含cgo的内存占用情况。

内存泄漏检测之valgrind

centos8安装:

yum install valgrind --nogpgcheck

执行泄漏检测:

将doCMalloc函数内的C.free注释掉。

将代码中的arrLen调小便于出现泄漏,如调成10。

valgrind --tool=memcheck --leak-check=full --error-limit=no --trace-children=yes --show-leak-kinds=all --track-origins=yes --log-file=./log.txt ./memleak 1

检测结果:

给出了泄漏位置:at 0x4C38185: malloc (vg_replace_malloc.c:442)

内存泄漏检测之bcc/tools/memleak

centos8(kernel:4.18.0)安装:

(centos7不支持,需要自己升级内核到4.x版本)

bcc/INSTALL.md at master · iovisor/bcc · GitHub

yum install bcc-tools --nogpgcheck

执行泄漏检测:

将doCMalloc函数内的C.free注释掉。

将代码中的arrLen调小便于出现泄漏,如调成10。

/usr/share/bcc/tools/memleak -a -p `pidof memleak`

对于golang来说如果从程序一启动就执行监测,效果不理想,因为top10可能都是golang正常管理的内存,需要等到所有运行需要的golang管理的内存都预热到go的三级cache中,此时golang很少需要向系统申请内存了,再监测cgo的内存泄漏。

如从启动开始监测:

最好在golang稳定运行后再开始监测,如:

清晰的定位到泄漏位置:0x00007faa43885a71      sysmalloc+0x7d1 [libc-2.28.so]

还可以指定监测最小的内存泄漏单位(byte),如我们监测大于等于16MB的泄漏:

/usr/share/bcc/tools/memleak --min-size 16777216 -a -p `pidof memleak`

恢复doCMalloc函数内的C.free,再执行监测:

未发现泄漏。

--end--

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法】【优选算法】位运算(下)

目录 一、&#xff1a;⾯试题 01.01.判定字符是否唯⼀1.1 位图1.2 hash思路1.3 暴力枚举 二、268.丢失的数字2.1 位运算&#xff0c;异或2.2 数学求和 三、371.两整数之和四、137.只出现⼀次的数字 II五、⾯试题 17.19.消失的两个数字 一、&#xff1a;⾯试题 01.01.判定字符是…

Tomcat 都有哪些核心组件

优质博文&#xff1a;IT-BLOG-CN 【1】Server&#xff1a;Server元素在最顶层&#xff0c;代表整个 Tomcat容器&#xff0c;因此他必须是 server.xml中唯一一个最外层的元素。一个 Server元素可以有一个或多个 Service元素。 <Server port"8005" shutdown"…

前端开发 之 15个页面加载特效中【附完整源码】

前端开发 之 15个页面加载特效中【附完整源码】 文章目录 前端开发 之 15个页面加载特效中【附完整源码】八&#xff1a;圆环百分比加载特效1.效果展示2.HTML完整代码 九&#xff1a;毒药罐加载特效1.效果展示2.HTML完整代码 十&#xff1a;无限圆环加载特效1.效果展示2.HTML完…

单张照片生成3D互动场景:李飞飞团队AI 3D技术引领未来

近日,由斯坦福大学教授李飞飞领导的团队推出了一项革命性的AI 3D重建技术,该技术能够从多张未知姿态的照片中自动生成高质量的3D互动场景。这项技术不仅标志着计算机视觉领域的一大进步,也为元宇宙虚拟空间、沉浸式看房、XR(扩展现实)+文旅等应用带来了新的可能性。 技术…

洛谷P2670扫雷游戏(Java)

三.P2670 [NOIP2015 普及组] 扫雷游戏 题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n 行 m列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。玩…

【机器学习】机器学习的基本分类-监督学习-决策树-CART(Classification and Regression Tree)

CART&#xff08;Classification and Regression Tree&#xff09; CART&#xff08;分类与回归树&#xff09;是一种用于分类和回归任务的决策树算法&#xff0c;提出者为 Breiman 等人。它的核心思想是通过二分法递归地将数据集划分为子集&#xff0c;从而构建一棵树。CART …

商汤完成组织架构调整,改革完成的商汤未来何在?

首先&#xff0c;从核心业务的角度来看&#xff0c;商汤科技通过新架构明确了以AI云、通用视觉模型等为核心业务的战略方向。这一举措有助于商汤科技集中资源&#xff0c;加强在核心业务领域的研发和市场拓展&#xff0c;提高市场竞争力。同时&#xff0c;坚定生成式AI为代表的…

python学opencv|读取视频(二)制作gif

【1】引言 前述已经完成了图像和视频的读取学习&#xff0c;本次课学习制作gif格式动图。 【2】教程 实际上想制作gif格式动图是一个顺理成章的操作&#xff0c;完成了图像和视频的处理&#xff0c;那就自然而然会对gif的处理也产生兴趣。 不过在opencv官网、matplotlib官网…

【Pytorch】torch.reshape与torch.Tensor.reshape区别

问题引入&#xff1a; 在Pytorch文档中&#xff0c;有torch.reshape与torch.Tensor.reshape两个reshape操作&#xff0c;他们的区别是什么呢&#xff1f; 我们先来看一下官方文档的定义&#xff1a; torch.reshape&#xff1a; torch.Tensor.reshape: 解释&#xff1a; 在p…

ArcGIS对地区进行筛选提取及投影转换

首先我们需要对坐标系和投影这些概念做进一步的解释。 1、基本概念&#xff1a; 想要理解坐标系和投影的概念&#xff0c;首先我们需要先理解什么是坐标。顾名思义&#xff0c;坐标就是指我们所在的位置&#xff0c;比如我在离旗杆东北部50m处&#xff0c;其实就是离旗杆东边…

qt QRadialGradient详解

1、概述 QRadialGradient是Qt框架中QGradient的一个子类&#xff0c;它用于创建径向渐变效果。径向渐变是从一个中心点向外扩散的颜色渐变&#xff0c;通常用于模拟光源或创建类似于高光和阴影的效果。QRadialGradient允许你定义渐变的中心点、焦距&#xff08;控制渐变扩散的…

Docker--Docker Image(镜像)

什么是Docker Image&#xff1f; Docker镜像&#xff08;Docker Image&#xff09;是Docker容器技术的核心组件之一&#xff0c;它包含了运行应用程序所需的所有依赖、库、代码、运行时环境以及配置文件等。 简单来说&#xff0c;Docker镜像是一个轻量级、可执行的软件包&…

《C++ Primer Plus》学习笔记|第1章 预备知识 (24-12-2更新)

文章目录 1.2.4 1.4 程序创建1.4.2 编译和链接 1.2.4 泛型编程 它允许程序员在编写代码时不指定具体的数据类型&#xff0c;而是使用一种通用的模板来处理多种不同的数据类型。以提高代码的复用性 C模板提供了完成这种任务的机制。 1.4 程序创建 使用文本编辑器编写程序&…

string类函数的手动实现

在上一篇文章中&#xff0c;我们讲解了一些string类的函数&#xff0c;但是对于我们要熟练掌握c是远远不够的&#xff0c;今天&#xff0c;我将手动实现一下这些函数~ 注意&#xff1a;本篇文章中会大量应用复用&#xff0c;这是一种很巧妙的方法 和以往一样&#xff0c;还是…

架构06-分布式共识

零、文章目录 架构06-分布式共识 1、分布式共识 &#xff08;1&#xff09;基本概念 **分布式共识&#xff1a;**在分布式系统中&#xff0c;多个节点之间达成一致的过程。**复杂性来源&#xff1a;**网络的不可靠性和请求的并发性。**应用场景&#xff1a;**如何确保重要数…

USB 声卡全解析:提升音频体验的得力助手

在当今数字化的时代&#xff0c;音频领域的追求愈发多元。无论是热衷聆听高品质音乐的爱好者&#xff0c;还是在专业音频工作中精雕细琢的人士&#xff0c;亦或是在游戏世界里渴望极致音效沉浸的玩家&#xff0c;都始终在寻觅能让音频体验更上一层楼的妙法。而 USB 声卡&#x…

系统--线程互斥

1、相关背景知识 临界资源多线程、多执行流共享的资源,就叫做临界资源临界区每个线程内部,访问临界资源的代码互斥在任何时刻,保证有且只有一个执行流进入临界区,访问临界资源,对临界资源起到保护作用原子性不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么…

【短视频矩阵系统==saas技术开发】

在数字媒体领域&#xff0c;短视频的崛起已不可忽视。对于商业实体而言&#xff0c;掌握如何通过短视频平台有效吸引潜在客户并提高转化率&#xff0c;已成为一项关键课题。本文旨在深入剖析短视频矩阵系统的构成与作用机制&#xff0c;以期为企业提供一套系统化的策略&#xf…

Python语法基础(八)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 异常处理 这一个部分&#xff0c;我们来讲一下异常处理这部分。 异常特点 当程序执行的过程中&#xff0c;我们遇到了异常&#xff0c;而且异常未被处理&#xff0c;那么程序…

burp2

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…