文档章节

golang 如何排查和定位GC问题

ssdut_buster
 ssdut_buster
发布于 2018/01/19 16:36
字数 801
阅读 2025
收藏 2

    最近在做文本处理的时候遇到一个很奇怪的现象。串行执行脚本可能只需要几秒钟,但是如果想给每行开个协程并发处理的话,执行时间却从几十秒到几十分钟不等,关键是执行的过程中cpu的占用并不高。经过一系列的分析之后确认是gc导致的。所以想讲一下排查gc问题的一些小技巧,之后也会给出一些case:

    一。如何查看程序运行过程中的GC信息呢?

    设置gctrace的变量值为1即可,这个既可以设置成环境变量,也可以选择按如下方式执行:

GODEBUG=gctrace=1  go run main.go
//GODEBUG=gctrace=1 ./main

GODEBUG=gctrace=1 代表只针对这个进程开启gc追踪功能。程序输出如下:

       

    对于上面每一行每一列的具体含义:

gc 1 @0.038s 1%: 0.55+0.12+0.081 ms clock, 2.2+0/0.42/1.1+0.32 ms cpu, 4->4->0 MB, 5 MB goal, 4 P。

1 表示第一次执行

@0.038s 表示程序执行的总时间

1% 垃圾回收时间占用总的运行时间百分比

0.018+1.3+0.076 ms clock 垃圾回收的时间,分别为STW(stop-the-world)清扫的时间, 并发标记和扫描的时间,STW标记的时间

0.054+0.35/1.0/3.0+0.23 ms cpu 垃圾回收占用cpu时间

4->4->3 MB 堆的大小,gc后堆的大小,存活堆的大小

5 MB goal 整体堆的大小

4 P 使用的处理器数量

    打开了GCTRACE之后对于gc执行的时间点、执行次数以及耗时可能已经有了初步的了解,但是对什么地方耗用大量内存并造成大量延迟可能并不清除。

二。如何定位gc问题所在?

    这一点主要使用pprof来实现。开启pprof也特别简单,用net/http/pprof包可以快速实现。只需要在之前的代码中加下面三行就可以:

import (
    "net/http"
    _ "net/http/pprof"
)
go func() {
            log.Println(http.ListenAndServe("localhost:8081", nil))
}()

    在程序启动之后,只需要在命令行或者浏览器输入以下命令即可:

go tool pprof  http://127.0.0.1:8081/debug/pprof/heap       //查看堆的使用,即内存使用情况
go tool pprof  http://127.0.0.1:8081/debug/pprof/profile    //查看cpu耗时,会详细列出每个函数的耗时
go tool pprof  http://127.0.0.1:8081/debug/pprof/goroutine  //当前在运行的goroutine情况以及总数

    可以看下profile的输出信息, flat代表单个函数的运行时间,而cum则是累加的时间,也会包括这个函数下面的子函数的累加时间,所以main.main肯定是100%:

        

    如果想看具体的图示的话,可以使用png命令将结果存成图片看,比如:

        

    可以看下生成图片的样子, 有具体的箭头以及每个函数占用的时间或者内存:

     

 

基本目前笔者用到的工具就这两个了,感觉有收获的读者可以自己实验一下。接下来,我会不定期的分享一些遇到的GC问题的case,欢迎一起交流哈。

© 著作权归作者所有

ssdut_buster
粉丝 8
博文 16
码字总数 13048
作品 0
私信 提问
jvm优化必知系列——监控工具

这是jvm优化系列第二篇: jvm优化——垃圾回收 通过上一篇的jvm垃圾回收知识,我们了解了jvm对内存分配以及垃圾回收是怎么来处理的。理论是指导实践的工具,有了理论指导,定位问题的时候,知...

wier
2017/10/18
0
0
一个系统,搞定闲鱼服务端复杂问题告警-定位-快速处理

引言 服务端问题排查(服务稳定性/基础设施异常/业务数据不符合预期等)对于开发而言是家常便饭,问题并不可怕,但是每天都要花大量时间去处理问题会很可怕;另一方面故障的快速解决至关重要。...

阿里云云栖社区
07/25
30
0
jvm优化必知系列——监控工具

这是jvm优化系列第二篇: jvm优化——垃圾回收 通过上一篇的jvm垃圾回收知识,我们了解了jvm对内存分配以及垃圾回收是怎么来处理的。理论是指导实践的工具,有了理论指导,定位问题的时候,知...

wier
2017/10/18
8.3K
14
Java开发必须掌握的线上问题排查命令

作为一个合格的开发人员,不仅要能写得一手还代码,还有一项很重要的技能就是排查问题。这里提到的排查问题不仅仅是在coding的过程中debug等,还包括的就是线上问题的排查。由于在生产环境中...

bill_wu
2016/05/16
272
0
一次 Young GC 的优化实践(FinalReference 相关)

一次 Young GC 的优化实践(FinalReference 相关) 简书 涤生。 转载请注明原创出处,谢谢! 如果读完觉得有收获的话,欢迎点赞加关注。 前言 博客已经好久没有更新了,主要原因是 18 年下半...

涤生_YinQi
02/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
6
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
10
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
8
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
11
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部