golang调用java的函数_大话golang性能分析(一):profile基本原理

引言:好久没分享了,不多废话了,准备一个专题分三期来分享下golang的性能分析。

O 专题目标

  • 理解profile基本原理
  • 熟悉go常用性能分析工具pprof
  • 快速对线上服务的cpu、内存、goroutine的问题进行分析和排查

对性能分析,golang是采取采样分析的方式,语言原生支持对运行的程序进行采样,收集采样数据通过累加计算并通过提供相应的工具来分析堆栈信息。【对比java:java通过发布jdk周边工具jps jmap jstack等,在问题分析前先将内存中的数据进行dump的方式进行分析】

一 profile原理

A Profile is a collection of stack traces showing the call sequences that led to instances of a particular event, such as allocation. Packages can create and maintain their own profiles; the most common use is for tracking resources that must be explicitly closed, such as files or network connections.

go默认会初始化六种profile, 每种profile存储的实际内容被抽象为 ​countProfile​,存储栈帧地址,堆栈地址通过调用​runtime.CallersFrames(stk)​可以获取堆栈信息,下面主要讲最常用的三种方式:内存、CPU和协程

type countProfile interface {  Len() int Stack(i int) []uintptr}// A countProfile is a set of stack traces to be printed as counts grouped by stack trace. There are multiple implementations:all that matters is that we can find out how many traces there are and obtain each trace in turn.
  • 内存采样

go程序启动后,runtime会按照一定频率对内存的分配进行采样记录,当内存分配每达到一定值(默认是512KB,参数由​runtime.MemProfileRate​设定), runtime就会记录下当前这次内存分配的大小、stack等信息到profile

type MemProfileRecord struct { AllocBytes, FreeBytes int64 // number of bytes allocated, freed AllocObjects, FreeObjects int64 // number of objects allocated, freed Stack0 [32]uintptr // stack trace for this record; ends at first 0 entry}
  • CPU采样

cpu的采样是通过调用函数​StartCPUProfile​来启动采样的,结束调用​StopCPUProfile​调用链如下StartCPUProfile​->​runtime.SetCPUProfileRate​->​sighandler​;采样频率是100hz

// The runtime routines allow a variable profiling rate,// but in practice operating systems cannot trigger signals// at more than about 500 Hz, and our processing of the// signal is not cheap (mostly getting the stack trace).// 100 Hz is a reasonable choice: it is frequent enough to// produce useful data, rare enough not to bog down the// system, and a nice round number to make it easy to// convert sample counts to seconds. Instead of requiring// each client to specify the frequency, we hard code it.const hz = 100// readProfile, provided by the runtime, returns the next chunk of// binary CPU profiling stack trace data, blocking until data is available.// If profiling is turned off and all the profile data accumulated while it was// on has been returned, readProfile returns eof=true.// The caller must save the returned data and tags before calling readProfile again.func readProfile() (data []uint64, tags []unsafe.Pointer, eof bool)
  • goroutine采样

GMP模型中,G goroutine P context M thread,采样数据来源于P,运行中的协程上下文堆栈。P会维护当前执行队列,队列中是M对应的G队列。自行检索GPM原理(关键字:窃取、61分之一全局队列)

如何将采样内容汇总?

假设我们在程序执行的某个时刻取样得到一个栈帧序列是ABC,可以得到的信息包括:此刻运行的函数是C,是从函数B调用到C的。当取样很多次后进行统计,就可以得到调用的信息。比如对下面这段代码的取样:

  • void A() { B(); for (int i=0; i<3; i++) C(); } void B() { for (int i=0; i<5; i++) C(); }
  • 将得到
  • A AB ABC ABC ABC AC 根据统计信息: 函数累加耗时和调用关系,根据这些数据可以构造有向图
2c3f37c6bb06a41ef983c42e9eeeec1d.png

profiles采样后会以pprof-formatted格式存储起来,分析这些数据需要用到golang的分析工具。

下一节分享golang常用的分析工具,敬请期待。欢迎关注"大龄码农

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

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

相关文章

奥拉星插件flash下载手机版下载安装_终于等到你!安卓微信7.0.13内测版发布 支持夜间模式 附下载地址!...

3月22日&#xff0c;iOS版微信迎来了7.0.12正式版更新&#xff0c;最大的亮点在于为iOS13设备加入了“深色模式”功能&#xff0c;虽然没有独立的控制开关&#xff0c;但可以跟随系统开启或关闭夜间模式。此外&#xff0c;iOS版微信7.0.12还优化了语音消息的发送体验&#xff0…

boost::weak_ptr和enable_shared_from_this

boost::weak_ptr和enable_shared_from_this shared_ptr在我的实践中使用很广,在接口层面上,我基本都会默认的使用shared_ptr.而weak_ptr则很少使用;即便使用,也是间接的使用,例如使得class A继承自boost::enable_shared_from_this,这样A便具有了一个weak_ptr的成员对象,我便可以…

linux(centos7)安装jdk

一、下载jdk1.8压缩包 官网链接如下&#xff1a; jdk官网 用xftp直接传输文件&#xff0c; 把下载好的jdk压缩包上传到Linux的文件夹下去到我们存放软件的文件夹下面&#xff0c;将刚刚下载好的压缩包通过如下命令进行解压&#xff1a; tar -zxvf jdk-8u321-linux-x64.tar.g…

inner join 和join的区别_left join、right join和join ???

点击上方“JAVA”&#xff0c;星标公众号重磅干货&#xff0c;第一时间送达有个困扰 说到SQL&#xff0c;很多人可能用了挺久&#xff0c;但依然有个问题一直困扰着&#xff0c;那就是 left join、 join、 right join和 inner join等等各种 join的区别。网上搜&#xff0c;最常…

linux(centos7)安装MySQL

一、删除MariaDB的文件 通过命令查询MariaDB&#xff1a;rpm -pa | grep mariadb 通过命令删除查找到的程序rpm -e 查找到的文件名 如果删除失败&#xff0c;就通过下面的命令强制删除&#xff1a;rpm -e --nodeps 查找到的文件名 二、安装MySQL 1、安装mysql repo源 …

我有机器人合体成一个大力神_史上最菜大力神(三)——SS加强级高塔

史上最菜大力神&#xff08;三&#xff09;——SS加强级高塔​mp.weixin.qq.com上次开箱废渣和狂暴的时候&#xff0c;误把电影中出现的高塔当作废渣&#xff0c;犯下了一个不大不小的错误&#xff0c;如今真正的高塔终于来了。史上最菜大力神&#xff08;一&#xff09;——SS…

c语言判断闰年_C语言1博客作业06 - D丶千思

1.作业头实验作业输入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)给出日期。注意&#xff1a;闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。闰年的2月有29天。.1数据处理数据表达&#xff1a;采用整形定义变量Y(year)&#xff0c;M(month)&#x…

新版本idea的run/debug configuration

点击Edit Configuration点击modify options的下拉选项根据需要勾选相应的选项

无法渲染窗口发黄_基础c4d教程:OC渲染器的立体光照

一、效果图昨天才把C4DR19安装好&#xff0c;之前安装一直在说无法找到系统的什么dll&#xff0c;后面查了好多方法终于弄好了&#xff0c;今天我也是第一次使用OC渲染&#xff0c;所以可能调节就没有那么好&#xff0c;大家一起进步吧&#xff01;二、教程1、首先打开我们的C4…

java8 list 去重_Java8-Stream在集合中的8种应用案例

前言Java8新特性我们使用的应该比较多了&#xff0c;今天这里整理了个人使用最多的8种场景&#xff0c;希望对大家有所帮助。Java Stream在集合中的运用案例遍历遍历也许是我们使用最多的功能了&#xff0c;在Java8之前我们遍历集合通常会采用for循环&#xff0c;迭代器&#x…

springboot——热部署

一、手动启动热部署 在进行 Spring Boot 的 Web 项目开发中&#xff0c;我们经常会遇到源代码文件、 配置文件等的修改&#xff0c;但每次修改后都会重启 Web 服务器才能修改后的文件生效&#xff0c; 这样很耗时&#xff0c;影响开发效率。而热部署就是不需要重启 Web 服务器就…

(转载)ubuntu开启SSH服务

&#xff08;转载&#xff09; http://www.cnblogs.com/xiazh/archive/2010/08/13/1798844.htmlSSH分客户端openssh-client和openssh-server如果你只是想登陆别的机器的SSH只需要安装openssh-client&#xff08;ubuntu有默认安装&#xff0c;如果没有则sudo apt-get install op…

c++邮递员投递经过特定点_厉害了斑马鱼,动物实验体天团C位

明明是一条鱼&#xff0c;为什么在保健食品以及药品领域即将成为实验动物C位&#xff1f;越来越多的药品及保健食品企业&#xff0c;都想邀请它们成为座上宾&#xff0c;是时候展示真正的技术了&#xff01;透明就是很厉害斑马鱼从胚胎阶段至未来的成熟阶段&#xff0c;身体中有…

选了combobox里的选项后没激发change事件_备胎测试:来测测你被备胎了没?

很多人在感情里被备胎而不自知&#xff0c;今天就来教大家如何辨别备胎。你知道备胎的最大特征是什么吗&#xff1f;是在面对关系定位时&#xff0c;态度上的模棱两可。想想你身边养备胎的人&#xff0c;如果没有的话&#xff0c;想想电视剧或小说里养备胎的人&#xff0c;想想…

halcon旋转后坐标_FPGA大赛【八】具体模块设计图像旋转方案

【注】该项目是我们团队参加2019届全国大学生FPGA大赛的作品&#xff0c;系统主要实现视频任意角度旋转。该项目最终晋级决赛&#xff0c;并获得紫光同创企业特别奖。该系列文章介绍我们团队的作品。关注公众号“数字积木”对话框回复 FPGA2019 &#xff0c;即可获得该项目的工…

hashmap value占用空间大小_HashMap的put和get实现原理及源码分析

水平有限&#xff0c;难免会有疏漏之处&#xff0c;如有错误&#xff0c;还请指出&#xff0c;感谢&#xff01;前言HashMa是Java中最常用的集合类框架&#xff0c;也是Java语言中非常典型的数据结构&#xff0c;同时也是我们需要掌握的数据结构&#xff0c;更重要的是进大厂面…

c#sql防注入模糊查询_SQL中利用LIKE实现模糊查询的功能

大家好&#xff0c;今日继续讲解《VBA数据库解决方案》&#xff0c;今日讲解的内容是&#xff1a;利用ADO,实现模糊查询。在上一讲中&#xff0c;我们实现了利用ADO快速查找的功能&#xff0c;今日我们实现工作表中模糊查找的功能。我们仍是利用上一讲的数据实现, 在"两表…

idea断点_IDEA Debug 无法进入断点的解决方法

前言某个多模块项目中使用多个版本的 Spring&#xff0c;如 Spring 4&#xff0c;Spring 5&#xff0c;在使用 IDEA Debug 过程中发现&#xff0c;Spring 部分 jar 如 spring-core 中的上面断点&#xff0c;IDEA 可以成功进入。但是有部分如 spring-context IDEA 始终无法进入断…

win10taskkill无法终止进程_Win10无法终止进程拒绝访问

用任务管理器强制结束一些已经不使用程序的进程&#xff0c;是很多用户会用的功能之一&#xff0c;但是最近有使用win10系统的用户&#xff0c;遇到结束进程的时候&#xff0c;被拒绝访问。遇到这样的问题&#xff0c;给大家带来了这篇文章的方法&#xff0c;希望能帮助到大家。…