![](https://img-blog.csdnimg.cn/direct/f69e87255884483390ece98b370c5208.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Golang
文章平均质量分 95
Golang
蓝胖子的编程梦
多年互联网大厂开发经验,深耕后端领域,擅长golang、云原生技术栈。对性能优化和服务监控方向颇有心得,对分布式链路追踪,故障诊断,实时数据分析,监控告警平台建设,性能优化及架构设计有深入研究
展开
-
万字长文讲解Golang pprof 的使用
大家好,我是蓝胖子,说到golang的性能分析,不得不提的就是其自身拥有的pprof,它提供了从cpu,内存,阻塞情况,协程,线程,乃至程序运行轨迹trace的分析,可以说相当强大了。今天我将会用较长的篇幅阐述 应该如何使用pprof工具来 对cpu,内存,阻塞情况,协程,线程 这几个维度去进行分析。其实总结出来Golang pprof的使用方式,可以用下面的思维导图来表示,原创 2024-03-07 17:35:26 · 2274 阅读 · 0 评论 -
程序从编译到被执行的流程
源码编译成可执行文件的过程。原创 2023-05-29 11:27:12 · 55 阅读 · 0 评论 -
go 实现ringbuffer以及ringbuffer使用场景介绍
ringbuffer因为它能复用缓冲空间,通常用于网络通信连接的读写,虽然市面上已经有了go写的诸多版本的ringbuffer组件,虽然诸多版本,实现ringbuffer的核心逻辑却是不变的。但发现其内部提供的方法并不能满足我当下的需求,所以还是自己造一个吧。源码已经上传到github。原创 2023-06-05 13:59:29 · 206 阅读 · 0 评论 -
golang pprof监控系列(2) —— memory,block,mutex 使用
经过上述的讲解,应该是能够明白相关的指标究竟是采集了哪些内容并且何时采集的了,而go tool pprof 工具的使用不是此文的重点,所以我直接省略掉了,也是没想到即使省略了,还是内容有那么多,那就把这部分的统计原理留到下一篇文章了,下一篇,memory,block,mutex 统计的原理介绍。原创 2023-04-05 15:25:14 · 416 阅读 · 0 评论 -
golang pprof 监控系列(1) —— go trace 统计原理与使用
平时在使用prometheus对应用服务进行监控时,我们主要还是采用埋点的方式,同样,go runtime内部也是采用这样的方式对代码运行过程中的各种事件进行埋点,最后读取 整理后的埋点数据,形成我们在网页上看的trace监控图。每次要记录相应的事件时,都会调用traceEvent方法,ev代表的是事件枚举,skip 是看栈帧需要跳跃的层数,args 在某些事件需要传入特定参数时传入。原创 2023-03-24 18:09:27 · 569 阅读 · 0 评论 -
golang pprof 监控系列(4) —— goroutine thread 统计原理
进入到了一个这样的界面,我们挨个分析下网页展现出来的信息:首先地址栏 /debug/pprof/goroutine?debug= 1 代表这是在访问goroutine指标信息,debug =1 代表访问的内容将会以文本可读的形式展现出来。debug=0 则是会下载一个goroutine指标信息的二进制文件,这个文件可以通过go tool pprof 工具去进行分析,关于go tool pprof 的使用网上也有相当多的资料,这里就不展开了。原创 2023-04-06 14:46:22 · 403 阅读 · 0 评论 -
golang pprof 监控系列(6) 内置的 metric指标 统计原理
至此,golang runtime 是如何设计 metrics 这个模块的?这个问题应该能回答了。简而言之,runtime将metrics归为3种类型,其实也可以说成是2种:一种是数值类型,数值类型分别是整形和浮点类型,分别是 metricKindUint64和metricKindFloat64,数值类型可以是累加值,也可以是当前值。一种是直方图类型,这类型一般用于统计百分位数据,比如协程调度延迟时间,gc停顿时间 p99,p95的值,诸如此类。原创 2023-04-14 17:40:17 · 538 阅读 · 0 评论 -
从源码角度剖析 golang 如何fork一个进程
可以看出,golang在execve前, 通过dup系统调用达到了继承父进程文件描述符的目的,最终达到的效果是继承attr.Files 参数里的文件描述符,期间由于dup的使用 产生的多余的文件描述符也标记为了O_CLOEXEC,在SYS_EXECVE 系统调用时,便会关闭掉。让我们再回到创建进程的主流程上,刚刚仅仅是分析出了,父进程将会为子进程创建它自己的标准输入输出流,虽然是通过管道包装的,但还没详细分析出os.StartProcess 方法究竟通过了哪些手段来让父进程的文件描述符传递给子进程。原创 2023-06-01 17:40:26 · 376 阅读 · 0 评论 -
golang trace view 视图详解
在go代码里,我们可以通过trace.Start和trace.Stop方法开启和关闭trace统计,之后我们会得到一个trace文件,可以用go tool trace命令打开它·。在浏览器的打开界面,可以看到trace view视图包含了几个维度的统计信息。view trace 和 goroutine analysis 都是时间线的视图,不过观看的角度不同,view trace 是从processor(Gpm模型中的p) 角度,goroutine analysis 则是从协程角度。原创 2023-08-08 16:22:27 · 518 阅读 · 2 评论 -
golang pprof 监控系列(3) —— memory,block,mutex 统计原理
挨个详细解释下这个bucket结构体:首先是两个指针,一个next 指针,一个allnext指针,allnext指针的作用就是形成一个链表结构,刚才提到的每次记录分配信息时,如果新增了bucket,那么这个bucket的allnext指针将会指向 bucket的链表头部。不同的指标类型拥有不同的链表头部变量,mbuckets 是内存指标的链表头,bbuckets 是block指标的链表头,xbuckets 是mutex指标的链表头。原创 2023-04-05 15:28:54 · 344 阅读 · 0 评论 -
golang pprof 监控系列(5) —— cpu 占用率 统计原理
cpu的统计原理与前面所讲的指标统计的原理稍微复杂点,涉及到了linux信号处理相关的内容,cpu统计的原理,简而言之,就是通过设置一个发送SIGPROF信号的定时器,然后用户程序通过接收操作系统定时发送的SIGPROF信号来对用户程序正在执行的堆栈函数进行统计。在采样时间内,同一个函数被统计的越多,说明该函数占用的cpu工作时长就越长。原创 2023-04-07 14:14:56 · 981 阅读 · 0 评论