Golang的trace性能分析

文章目录

    • 一、trace概述
    • 二、trace的使用方式
      • 代码中trace采集
      • 通过pprof采集
    • 三、trace分析细节
      • trace的web界面
      • trace中需要关注的
        • 关注GC的频率
        • 关注goroutine调度情况
        • 关注goroutine的数量
        • 理想情况
    • 四、GC分析
      • 当前服务GC情况
      • 设置GOGC
      • 设置GOMEMLIMIT
      • GC阈值的讨论
        • GC的特点
    • 五、goroutinue分析
      • goroutine概览
      • Sync block耗时分析
      • Scheduler wait耗时分析

一、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的频率

在这里插入图片描述

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

关注goroutine调度情况

鼠标放着不动,w是放大,s是缩小。一直放大可以查看具体goroutine的执行细节:
在这里插入图片描述

关注goroutine的数量

在这里插入图片描述

理想情况

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

      下面这个就是GC过于频繁的例子。goroutine的调度还是不错的,有规律且密集
在这里插入图片描述

四、GC分析

当前服务GC情况

在这里插入图片描述

可以看到GC很频繁。查看监控发现,服务内存只用到了几十M.
在这里插入图片描述

这种情况只能手动改动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:
在这里插入图片描述

设置GOMEMLIMIT

程序中GOGC设置成3000,实际上内存利用率还是很低,只有200M,服务给定的资源是4G
在这里插入图片描述

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

效果如下:
在这里插入图片描述

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的。
在这里插入图片描述

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

在这里插入图片描述

标记阶段会将大概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列表。
在这里插入图片描述

点进去就可以查看具体的goroutine执行情况。
在这里插入图片描述

点击查看goroutine,发现trace如下:
在这里插入图片描述

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

Scheduler wait耗时分析

大量的Scheduler wait如下:
在这里插入图片描述

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

end

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

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

相关文章

前端学习——jsDay5

对象 对象使用 小练习 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"width…

Spring Boot中的请求参数绑定及使用

Spring Boot中的请求参数绑定及使用 在Web应用程序中&#xff0c;请求参数绑定是非常重要的操作。Spring Boot框架使得请求参数绑定变得非常简单&#xff0c;通过使用注解和预定义的类可以轻松地实现此操作。本文将介绍Spring Boot中的请求参数绑定及其使用。 请求参数绑定 在…

银河麒麟服务器v10 sp1 部署 Net6.0 项目

上一篇已经部署了Net6.0环境&#xff0c;本节将实现Net6.0程序部署&#xff0c;打开或新建项目&#xff0c;修改appsettings.json配置&#xff1a; 添加&#xff1a;"urls": "http://*:8061",//linux部署使用&#xff0c;端口可根据需求修改为自己的 在项…

关于数据库SQL优化

简介 在项目上线初期&#xff0c;业务数据量相对较少&#xff0c;SQL的执行效率对程序运行效率的影响可能不太明显&#xff0c;因此开发和运维人员可能无法判断SQL对程序的运行效率有多大。但随着时间的积累&#xff0c;业务数据量的增多&#xff0c;SQL的执行效率对程序的运行…

简要介绍 | 基于深度学习的姿态估计技术

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对基于深度学习的姿态估计技术进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 注2&#xff1a;"简要介绍"系列的所有创作均使用了AIGC工具辅助 基于深度学习的姿态估计技术 背景介绍 …

前端 | windows安装nvm管理node.js

文章目录 01 nvm介绍02 安装03 设置镜像04 安装与版本管理05 基础使用 01 nvm介绍 nvm&#xff0c;即node version manager&#xff0c;是一个方便切换和管理node.js版本的工具。 安装nvm前的注意事项&#xff1a; 卸载掉现有的node.js所有安装目录避免出现空格和中文选用管理…

用vue3+elementplus做的一个滚动菜单栏的组件

目录 起因概览设计及解决思路1.滚动条竖起来2.绑定菜单3.吸附优化 组件全部代码 起因 在elementplus中看到了滚动条绑定了slider&#xff0c;但是这个感觉很不实用&#xff0c;在底部&#xff0c;而且横向滚动&#xff0c;最常见的应该是那种固定在左上角的带着菜单的滚动条&a…

Windows 10睡眠失效解决办法

第一步 检查是否有程序阻止睡眠 打开终端,执行如下命令 powercfg /requests如果返回结果不为空说明有程序阻止睡眠 找到对应的程序将其退出即可 如果返回结果为空则进行下一步 第二步 检查网易UU加速器 如果你安装了UU加速器 打开网易UU加速器 打开系统设置,将休眠不断…

MySQL压测实战

写作目的 最近看到一句话是MySQL的TPS是4000&#xff0c;这句话是不严谨的&#xff0c;因为没有说服务器的配置。所以自己买了个服务器做了一个压测。希望自己对数据有一个概念。 注意&#xff1a;服务器不同结果不同&#xff0c;结果不具有普适性。 服务器配置 配置参数CPU…

【数据结构】堆的实现(向下调整和向上调整法)和堆排序的实现

目录 一、堆的概念引入 二、小堆的实现 首先&#xff0c;我们会跟线性表一样建立一个动态数组来存堆的数据 ①、堆的初始化--HeapInit ②、小堆的向下调整法的实现 ③、堆排序的实现 ④、堆的插入和向上调整法 ⑤、删除堆顶数据 ⑥、获取堆顶 三、时间复杂度总结&#…

网络安全进阶学习第六课——服务器解析漏洞

文章目录 1、概念2、Apache解析漏洞 CVE-2017-157153、Apache AddHandler解析漏洞4、IIS6 解析漏洞&#xff08;;&#xff09;5、IIS6 解析漏洞&#xff08;*.asp/目录&#xff09;6、IIS7 解析漏洞&#xff08;ISAP或CGI的模式下&#xff09;7、nginx解析漏洞&#xff08;cgi.…

2023年6月第4周大模型荟萃

2023年6月第4周大模型荟萃 2023.6.30版权声明&#xff1a;本文为博主chszs的原创文章&#xff0c;未经博主允许不得转载。 1、腾讯云首次公布大模型进展 6月19日&#xff0c;腾讯云召开行业大模型及智能应用技术峰会&#xff0c;首次公布腾讯云行业大模型研发进展&#xff0…

QT下载太慢,在线安装太慢的解决方案

实现效果 步骤1 下载在线安装的客户端&#xff0c;可以从qt.io&#xff08;qt-unified-windows-x64-4.6.0-online.exe&#xff09;下载&#xff0c;速度稍慢&#xff0c;但是大小也才38MB左右。 觉得下载太慢的小伙伴可以使用我提供的代下载版本&#xff0c;你们可以校验文件…

峰会来袭 | CAD模型转换工具选择的难点和关键点解答

作为世界顶尖的3D软件开发SDK和CAD模型转换工具——HOOPS Exchange已问世十多年&#xff0c;深受开发者好评&#xff0c;并在工业测量、机械加工、造船设计等领域都有广泛的应用。 本次峰会将围绕CAD软件造型技术的多样性、CAD模型数据解析的难点、3D模型转换的经典问题等&…

IDEA+springboot+jpa+Layui+Mysql销售考评系统源码

IDEAspringbootjpaLayuiMysql销售考评系统源码 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.评分结果3.评分管理4.添加评分5.用户管理6.添加用户7.角色管理8.添加角色8.销售管理9.添加销售 三、部分代码UserDao.javaUserController.javaUser.java 四、其他获取源码 一、…

黑芝麻智能科技、上海紫先面试(部分)(未完全解析)

黑芝麻智能科技 Hystrix可以限流吗&#xff1f;客户端限流&#xff0c;是限制对下游&#xff08;被调用方&#xff09;的访问&#xff0c;不是对本服务限流。从HystrixCommand的.withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)也可以看出来&#xff0c…

STM32外设系列—ESP8266(WIFI)

文章目录 一、ESP8266简介二、固件库烧录三、常用AT指令四、访问API4.1 获取IP地址4.2 GET天气信息4.3 访问结果展示 五、实战项目5.1 串口配置5.2 检测WIFI模块连接状态5.3 发送配置指令5.4 解析天气信息 六、成果展示 一、ESP8266简介 ESP8266是嵌入式和物联网开发中常用的模…

MySQL子查询

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;进入MySQL专栏知…

Jenkins邮件配置报错com.sun.mail.smtp.SMTPSenderFailedException: 501

Jenkins邮件配置&#xff0c;配置完成各种信息之后&#xff0c;“通过发送测试邮件测试配置”点击Test configuration&#xff0c;报错 1、报错信息 com.sun.mail.smtp.SMTPSenderFailedException: 501 mail from address must be same as authorization userat com.sun.mail…

Xcode 15 beta 3 (15A5195k) 发布下载 - Apple 平台 IDE

Xcode 15 beta 3 (15A5195k) 发布下载 - Apple 平台 IDE (visonOS 1 beta 已发布) 7 月 5 日&#xff08;北京时间今日凌晨&#xff09;已发布。 IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-15/&#xf…