Golang的trace性能分析

这篇具有很好参考价值的文章主要介绍了Golang的trace性能分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、trace概述

      上一篇是pprof的性能分析,通过pprof找到我们服务中的瓶颈点来进行优化。Golang的pprof性能分析

      一般我们使用pprofprofile来分析服务的性能,主要是CPU方面的耗时和调用链路等。但是光靠profile是不够的,细节方面还是要使用trace分析并发和阻塞事件,goroutine的调度和GC情况。

相比profile,通过trace我们能看到什么呢?

1、程序运行中的goroutine数量分布
2、GC的频率和Heap的占比
3、goroutine的调度和运行,阻塞情况

二、trace的使用方式

代码中trace采集

import (
    "os"
    "runtime/trace"
)

func main() {
    trace.Start(os.Stderr)
    defer trace.Stop()
}

// 生成trace
go run main.go 2> trace.out

通过pprof采集

// trace采样
浏览器下载: http://127.0.0.1:6060/debug/pprof/trace?seconds=20
命令行采样: curl http://127.0.0.1:6060/debug/pprof/trace\?seconds\=20 > trace.out

// 运行采样的trace文件,会自动打开浏览器页面
go tool trace trace.out

三、trace分析细节

trace的web界面

参考:Go 大杀器之跟踪剖析 trace

https://eddycjy.gitbook.io/golang/di-9-ke-gong-ju/go-tool-trace

View trace:查看跟踪
Goroutine analysis:Goroutine 分析
Network blocking profile:网络阻塞概况
Synchronization blocking profile:同步阻塞概况
Syscall blocking profile:系统调用阻塞概况
Scheduler latency profile:调度延迟概况
User defined tasks:用户自定义任务
User defined regions:用户自定义区域
Minimum mutator utilization:最低 Mutator 利用率

trace中需要关注的

关注GC的频率

Golang的trace性能分析

      GC的频率过大,会导致大量的资源用于GC阶段,影响程序性能。另外要关注Heap的释放情况,Heap经过GC之后不释放那就需要关注内存泄漏问题了。内存泄漏大部分是查看goroutine释放和服务占用内存情况,可以参考Golang的pprof性能分析

关注goroutine调度情况

鼠标放着不动,w是放大,s是缩小。一直放大可以查看具体goroutine的执行细节:
Golang的trace性能分析

关注goroutine的数量

Golang的trace性能分析

理想情况
1、GC次数适中,要多或者太小都不行
2、goutinue数量不会突增或者持续增加
3、goroutine的调度密集且有规律

      下面这个就是GC过于频繁的例子。goroutine的调度还是不错的,有规律且密集
Golang的trace性能分析

四、GC分析

当前服务GC情况

Golang的trace性能分析

可以看到GC很频繁。查看监控发现,服务内存只用到了几十M.
Golang的trace性能分析

这种情况只能手动改动GC的阈值了。

GOGC 变量设置初始垃圾收集目标百分比。当新分配的数据与上次收集后剩余
的实时数据的比率达到此百分比时,将触发收集。
默认值为 GOGC=100。

比如上次gc之后剩余10M,那么下次GC的阈值就是10M+10*100% = 20M

设置GOGC

// 调整gc阈值的源码
func readGOGC() int32 {
	p := gogetenv("GOGC")
	if p == "off" {
		return -1
	}
	if n, ok := atoi32(p); ok {
		return n
	}
	return 100
}

设置环境变量GOGC,然后查看trace:
Golang的trace性能分析

设置GOMEMLIMIT

程序中GOGC设置成3000,实际上内存利用率还是很低,只有200M,服务给定的资源是4G
Golang的trace性能分析

GOMEMLIMIT : 设置GC的阈值(go 1.19提供),设置为服务限定资源的一半
GOGC=off : 关闭自动GC。

效果如下:
Golang的trace性能分析

GC阈值的讨论

参考:官方对于GC的详细解释

GC的特点
1、当 GC 在标记和清除阶段之间转换时,短暂的 stop-the-world 暂停,
2、调度延迟,因为在标记阶段GC占用了25%的CPU资源,
3、用户 goroutines 协助 GC 响应高分配率,
4、当 GC 处于标记阶段时,指针写入需要额外的工作,并且
5、运行的 goroutines 必须暂停以扫描它们的根。

      过多的GC会占用CPUgoroutine的资源。但是过少的GC会导致每次GCstw时间变长,因为要标记和清楚的内存过多。因此GC阈值设置多大,也是个选择题。

五、goroutinue分析

参考:Golang GC核心要点和度量方法

goroutine概览

      通过放大可以看到,goroutine的状态,有Dedicated的,有Idle的。还有处于mark标记状态的,有sweep的。
Golang的trace性能分析

      GC的三个主要阶段:mark(标记)、sweep(清扫)和 scan(扫描)。好了,跟八股文完美对上了。
红框中还有大名鼎鼎的STW

Golang的trace性能分析

标记阶段会将大概25%(gcBackgroundUtilization)的P用于标记对象,
逐个扫描所有G的堆栈,执行三色标记,在这个过程中,所有新分配的对象
都是黑色,被扫描的G会被暂停,扫描完成后恢复,这部分工作叫
后台标记(gcBgMarkWorker)。
这会降低系统大概25%的吞吐量,比如MAXPROCS=6,那么GC 
P期望使用率为6*0.25=1.5,这150%P会通过专职(Dedicated)/
兼职(Fractional)/懒散(Idle)三种工作模式的Worker共同来完成。

Sync block耗时分析

      从tracegoroutine analysis 点进去查看主要的goroutine列表。
Golang的trace性能分析

点进去就可以查看具体的goroutine执行情况。
Golang的trace性能分析

点击查看goroutine,发现trace如下:
Golang的trace性能分析

      看起来146210这个goroutine进入了专职Dedicated GC处理工作模式。查看几个Sync block耗时比较长的发现都是在GC的时候,goroutine开始处理GC而暂停处理业务,等GC结束才会继续执行业务。 在优化过GC之后,Sync block耗时大幅度下降。

Scheduler wait耗时分析

大量的Scheduler wait如下:
Golang的trace性能分析

      关于调度,我们都知道GoGMP模型的调度,那么P的大小和goroutine的数量都会影响到调度性能。推荐使用uber的自动设置GOMAXPROCS的库。
uber开源的自动设置maxprocs的库
注意: 在服务分配的CPU不足1核的情况下,使用automaxprocs没什么提升。反而在多核的情况下,需要通过这个库来设置最佳的GOMAXPROCS

end文章来源地址https://www.toymoban.com/news/detail-488464.html

到了这里,关于Golang的trace性能分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一文1800字解读性能指标与性能分析

    1、系统指标:与⽤户场景与需求直接相关的指标 2、服务器资源指标:硬件服务器的资源使⽤情况的指标 3、JAVA应⽤ : JAVA应⽤程序在运⾏时的各项指标 4、数据库:数据库服务器运⾏时需要监控的指标 5、压测机资源指标:测试机在模拟⽤户负载时的资源使⽤情况 ⼀般情况下,测试

    2024年02月08日
    浏览(61)
  • 辅助性能优化——长安链性能分析工具原理及用法

    如何提升区块链系统性能是很多开发者都会关注的事,但是有些对区块链并非十分熟悉的开发者可能会感到没有头绪。长安链提供了性能分析工具帮助开发者梳理系统耗时,优化系统性能。下面对长安链性能分析工具原理及使用进行介绍。 time_counter.sh是长安链性能分析工具,

    2024年02月13日
    浏览(57)
  • Linux性能瓶颈分析之TOP指标分析

    1.查看cpu基础信息 2.查看cpu详细信息 3.统计cpu信息 如图所示: us :表示 CPU 在用户态运行的时间百分比,通常用户态 CPU 高表示有应用程序比较繁忙。 sy :表示 CPU 在内核态运行的时间百分比,通常内核态 CPU 越低越好,否则表示系统存在某些瓶颈。 ni :表示用 nice 修正进程

    2024年02月11日
    浏览(72)
  • Mysql的SQL性能分析【借助EXPLAIN分析】

    要说sql有问题,需要拿出证据,因此需要性能分析 Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划(它认为最优的数据检索方式,不见得是DBA认为是最优的,这部分最耗费时间,

    2024年02月12日
    浏览(76)
  • SQL性能分析手段

    MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供整个服务器执行sql的状态信息。通过如下指令,可以查看当前数据库的 INSERT、UPDATE、DELETE、SELECT 的访问频次: Com_delete : 删除次数 Com_insert : 插入次数 Com_select : 查询次数 Com_update : 更新次数 通过查看这些次数

    2024年01月19日
    浏览(50)
  • SQL性能分析-整理

    昨日对MySQL的索引整理了一份小文档,对结构/分类/语法等做了一个小总结,具体文章可点击:MySQL-索引回顾,索引知识固然很重要,但引入运用到实际工作中更重要。 参考之前的文章:SQL优化总结以及参考百度/CSDN/尚硅谷/黑马程序员/阿里云开发者社区,我个人把SQL性能分析

    2024年01月23日
    浏览(53)
  • 性能分析-docker知识

    docker是一个做系统虚拟化的软件,跟vmware类似,虚拟出来的也是操作系统。我们现在在企业中, 使用docker虚拟出来的系统,大多都是linux系统。 docker镜像image:就是虚拟一个docker容器需要的操作系统、服务的依赖、服务包,打包成的一个文 件。 docker容器 container:就是用doc

    2024年04月08日
    浏览(52)
  • 磁盘性能分析

    %iowait并不能反应磁盘瓶颈 iowait实际测量的是cpu时间: %iowait = (cpu idle time)/(all cpu time) 这个文章说明:高速cpu会造成很高的iowait值,但这并不代表磁盘是系统的瓶颈。唯一能说明磁盘是系统瓶颈的方法,就是很高的read/write时间,一般来说超过20ms,就代表了不太正常的磁盘性能

    2024年02月11日
    浏览(57)
  • ubuntu程序性能分析

    在Ubuntu上,可以使用一些工具来测量两段程序的计算量,如下所示: time命令:time命令可以用于测量程序的执行时间。在终端中运行以下命令来执行程序并测量其执行时间: 这将输出程序的执行时间,包括用户时间、系统时间和实际时间。 在运行的程序之前加 time 最后得出

    2024年01月16日
    浏览(58)
  • 算法性能分析

          时间复杂度是一个函数,它定性描述该算法的运行时间。假设算法的问题规模为n,那么操作单元数量便用函数f(n)来表示,随着数据规模n的增大,算法执行时间的增长率和f(n)的增长率相同,这称作为算法的渐近时间复杂度,简称时间复杂度,记为 O(f(n)) 算法导论给出的

    2024年02月08日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包