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,一经查实,立即删除!

相关文章

Boost智能指针——weak_ptr

循环引用&#xff1a; 引用计数是一种便利的内存管理机制&#xff0c;但它有一个很大的缺点&#xff0c;那就是不能管理循环引用的对象。一个简单的例子如下&#xff1a; #include<string> #include<iostream> #include<boost/shared_ptr.hpp> #include<b…

Linux下,C++编程论坛题目抽取

从一个论坛主页开始&#xff08;固定的一个&#xff0c;比如学校的论坛&#xff09;&#xff0c;输出各个&#xff08;不用全部&#xff09;板块下若干个主题帖子&#xff08;比如1000个&#xff09;的题目&#xff0c;按功能模块保存在txt文件中。 输入关键词&#xff0c;在上…

lisp eval apply_SICP远古魔法-LISP概览(1-2)

我们之所以能够像今天这样构建丰富多彩的应用是因为&#xff0c;我们有大系统中控制复杂度技术。实际上这种技术在其它领域早已存在。例如造火箭&#xff0c;盖房子。但是计算机科学又和他们不太一样&#xff0c;因为计算机科学处理的不是真实的情况&#xff0c;而是虚拟的。 例…

奥拉星插件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的成员对象,我便可以…

WebSite和Web Application\网站与Web项目的区别

简要记录下&#xff1a;1、web应用程序Default.aspx显示有两个原有文件及Default.aspx.cs和Default.aspx.designer.cs&#xff1b;1、Web网站Default.aspx显示有一个原有文件Default.aspx.cs。 2、web应用程序有重新生成和发布两项&#xff1b;Web网站只有一个发布网站。 3、we…

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;最常…

黑马程序员顺义校区php_黑马程序员:从PHP零基础到月薪11K为何送锦旗给班主任?...

2016年我在传智播客学习完PHP以后&#xff0c;特意给班主任王智慧老师送了一面锦旗。为什么我会送锦旗&#xff0c;那是因为从她当我们班主任开始&#xff0c;就非常的负责&#xff0c;对我们非常的好&#xff0c;这个可以随便问问班里的同学。而且我能找到高薪工作跟她对我的鼓…

C++中std::tr1::function和bind 组件的使用

在C的TR1中(Technology Report)中包含一个function模板类和bind模板函数&#xff0c;使用它们可以实现类似函数指针的功能&#xff0c;但却却比函数指针更加灵活&#xff0c;特别是函数指向类的非静态成员函数时。可以参考Scott Meyers. <<Effective C (3rd Edition)>…

linux(centos7)安装MySQL

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

python ddos攻击脚本_python版本DDOS攻击脚本

今天为了休息下&#xff0c;换换脑子&#xff0c;于是就找到了我之前收藏的一篇python的文章&#xff0c;是关于ddos攻击的一个脚本&#xff0c;正好今天有空&#xff0c;就实践下了。 附上源码pyDdos.py:#!/usr/bin/env python import socket import time import threading #P…

设计模式 - Command

意图&#xff1a;将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤消的操作。 class Receiver { public:Receiver(){}virtual ~Receiver(){}virtual void Action(){cout<<&quo…

代码中特殊的注释技术——TODO、FIXME和XXX的用处

前言&#xff1a;今天在阅读Qt Creator的源代码时&#xff0c;发现一些注释中有FIXME英文单词&#xff0c;用英文词典居然查不到其意义&#xff01;实际上&#xff0c;在阅读一些开源代码时&#xff0c;我们常会碰到诸如&#xff1a;TODO、FIXME和XXX的单词&#xff0c;它们是…

我有机器人合体成一个大力神_史上最菜大力神(三)——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的下拉选项根据需要勾选相应的选项

登录用户Eclipse中SVN访问用户的变更办法

废话就不多说了&#xff0c;开始。。。 有点标题党了&#xff0c;呵呵 其实不止Eclipse成集SVN&#xff0c;全部SVN拜访用户的更变&#xff0c;都可以参照面下的式方 每日一道理 谁说人与人隔着遥远的重洋&#xff0c;谁说心与心设着坚固的堤防&#xff1f;十六岁的鸟儿飞上天空…

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

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