Go语言中文网 为您找到相关结果 306

golang gc 优化思路以及实例分析

一个即将上线的go 写的高频服务,压测的时候发现 gc 特别高,高到10%-15% 左右了,本文记录下优化 gc 的过程和和思路。线上环境1.10. 首先,查看gc 是否有异常,我们可以使用 gctrace 跟踪实时的gc 。执行下面命令可以看到gc 的实时信息。 GODEBUG=gctrace=1 go run cmd/agent_bin.go 输出结果如下: gc 45 @37.801s 11%: 0.19+627+0.29 ms clock, 0.38+424/621/0+0.59 ms cpu, 356->415->225 MB, 453 MB goal, 4 P gc 46 @39.126s 11%: 2.9+927+0.16 ms clock, 5.8+342/925/0+0.3...阅读全文

博文 2018-04-07 23:33:05 鼎铭

一个 Go 程序系统线程暴涨的问题

作者:skoo 链接:https://zhuanlan.zhihu.com/p/22474724 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 最近 fix 了一个 Go 程序系统线程数量暴增的问题,线程数量维持在2,3万个,有时候甚至更多,这情况明显不符合 Go 的并发原理。第一次发现线程数巨多是因为这个程序突然 crash 了,由于设置了程序可用的最大线程数,所以线程数一太多就会crash。 这个程序其实就是现在挺火热的 Swarm,Swarm 这个程序的模式就是作为 client 的角色向数万个 docker daemon 服务器建连,维持长连接状态,然后再定时的从这些 docker daemon 读取数据。经排查,发现长连接数和线程数基本一致,看到...阅读全文

博文 2016-09-19 19:00:01 skoo

golang 单元测试、性能测试、性能监控技术

golang 单元测试、性能测试、性能监控技术 go语言提供了强大的测试工具,下面举例简单介绍一下 go test 单元测试 go test -bench=. 性能测试 go tool pprof 性能监控 go test 单元测试 例如对包helper下的util.go 进行单元测试,util.go 里主要包含两个功能,一个是对字符串进行sha1加密,一个是验证手机号码 编写测试文件 如果我们要测试验证手机号码功能是否正确,我们可以在该包下新建util_test.go文件,一般命名方式为 _test.go(为测试文件主文件名),测试函数以 Test函数(t *testing.T) 形式 util_test.go 然后cmd窗口下执行(注意将目录切换到当前目录,如果是windows系统,按住...阅读全文

博文 2016-06-18 22:00:02 hil2000

GO服务 所有协程无法服务。

自己写的GO服务在跑了几天后会出现所有携程无法服务, 表现在业务携程TCP建立后无法接收TCP recv_q的数据,处理信号的协成无法处理信号,pprof端口在的进程也无法响应。TCP 接受队列堆积 ![屏幕快照 2017-02-15 下午2.40.30.png](http://studygolang.qiniudn.com/170215/455a32217fd999b47ecd874c2f4ded84.png) 但是 进程还显示100%左右的CPU的占用, 有什么方法进行定位么...阅读全文

Golang的垃圾回收

我们公司服务端都是在用Golang,每天几百万的UV,过亿的PV一直没啥问题。后来改了一次逻辑,首页能展示一个列表,之前这个列表都没有做过缓存处理,一个是因为数据少,一共才一千多条;还有就是量不大。但是首页加了入口之后出了问题,内存疯涨,一般内存也就占200M+,这还是包含In Memory缓存的情况下,这下好家伙,最高我见过占用20G内存的情况,但是程序重启一下又能好。当然这是后知后觉了,当时也没把这两个东西联系到一起。 完整的说一下事情的经过。 上线之后内存疯涨,一开始会占10G左右,不知道为啥,只能kill掉。程序重启之后短时间内也会维持在200M左右,但是过个4、5天又会涨上来,而这个过程中内存大小都没有影响用户使用。最后只能跟运维说,看见内存大了就kill一次。。。 当时觉得内存这...阅读全文

博文 2017-02-09 12:25:30 Bryce

Go1.5正式版程序性能分析小积累,实验环境windows64

方法一: 使用:set GODEBUG=gctrace=1 / GODEBUG=gctrace=2 直接运行可执行文件:server.exe 格式:gc # @#s #%: #+...+# ms clock, #+...+# ms cpu, #->#-># MB, # MB goal, # P GC # 表示第几次GC @#s 表示程序开始多长时间执行的GC #% 表示程序开始GC时间占用的百分比(percentage of time spent in GC since program start) #+...+# 表示GC执行时CPU阻塞时间和 #->#-># MB 表示GC开始堆大小,结束堆大小,在活跃堆大小 # MB goal 表示目标对大小 # P 表示程序运行时CPU核数 示例 :...阅读全文

博文 2015-09-25 07:00:00 fyxichen

go 性能监控神器

文地址:Golang 大杀器之性能剖析 PProf 前言 写了几吨代码,实现了几百个接口。功能测试也通过了,终于成功的部署上线了 结果,性能不佳,什么鬼????? 想做性能分析 PProf 想要进行性能优化,首先瞩目在 Go 自身提供的工具链来作为分析依据,本文将带你学习、使用 Go 后花园,涉及如下: runtime/pprof:采集程序(非 Server)的运行数据进行分析 net/http/pprof:采集 HTTP Server 的运行时数据进行分析 是什么 pprof 是用于可视化和分析性能分析数据的工具 pprof 以 profile.proto 读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告) profile.proto 是一个 Protocol Bu...阅读全文

Go的代码调优一例

2014-08-05 Go的代码调优一例 用tcpcopy导的线上流量,活动数据库也是真实的数据,这是我抓的一份pprof: genius@geniuss-Macbook-air:~/project/src/dsp_masky $go tool pprof ls.prof Welcome to pprof! For help, type 'help'. (pprof) top Total: 14413 samples 1342 9.3% 9.3% 1342 9.3% strconv.ParseUint 1243 8.6% 17.9% 1243 8.6% runtime.duffcopy 1082 7.5% 25.4% 5067 35.2% dsp_masky/model/bid.(*BidS...阅读全文

博文 2015-03-20 13:29:01 zenlife

PuGo 一次内存泄露的调优

我刚刚写好新的博客程序 Pugo,欢迎试用和体验。这两天我把个站 fuxiaohei.me 迁移到新的博客程序。但是,经过一天的运行,发现内存从启动的 14MB 上升到了 228 MB。显然程序发生内存泄露,所以也开始以下调优过程。 PPROF pprof 是 Golang 自带的调试工具,有很多可用的工具。pprof 的调试方式有代码的方式和 HTTP 方式。其中 HTTP 调试比较方便,加入很简单的代码: import _ "net/http/pprof" // pprof 的 http 路由注册在自带路由上 go func() { http.ListenAndServe("0.0.0.0:6060", nil) // 启动默认的 http 服务,可以使用自带的路由 }() 访问 htt...阅读全文

博文 2016-04-17 14:46:46 傅小黑

golang graphviz与pprof

sudo port install graphviz fuyundeMacBook-Pro:~ fuyun$ sudo port install graphviz Warning: The Xcode Command Line Tools don't appear to be installed; most ports will likely fail to build. Warning: Install them by running `xcode-select --install'. ---> Computing dependencies for graphviz ---> Fetching archive for graphviz ---> Attempting to fetch gr...阅读全文

博文 2015-06-17 20:04:01 x_focus

一次Golang 内存占用偏高的调查

最近发现生产上某Golang服务内存稳步飙升,通过监控完全看不到有内存降低时候。而奇怪的是,同样的版本放到其他环境上则没有这个问题。 在内部弄了个环境开启pprof,反复压测,一直无法重现问题。于是回过头去检查监控的数据是否有误差。经检查发现prometheus上抽取的数据达930M,而通过docker 以及其他系统方式查到的数据不到20M。经反复对比发现,prometheus上抽取的数据是包含缓存的数据,单独查询此服务的缓存,则数据为900M+,差额部分数据与docker查询出来接近,如此判断问题在于缓存。 最后,发现,日志文件没有配置log rotation,大小已经达到了12G。清空日志后惊喜的发现,内存瞬间暴降至20M...阅读全文

博文 2018-12-26 19:34:42 getsu

Go性能监控/分析工具:go tool pprof – 碎言碎语

我们可以使用go tool pprof命令来交互式的访问概要文件的内容。命令将会分析指定的概要文件,并会根据我们的要求为我们提供高可读性的输出信息。 在Go语言中,我们可以通过标准库的代码包runtime和runtime/pprof中的程序来生成三种包含实时性数据的概要文件,分别是CPU概要文件、内存概要文件和程序阻塞概要文件。下面我们先来分别介绍用于生成这三种概要文件的API的用法。 CPU概要文件 在介绍CPU概要文件的生成方法之前,我们先来简单了解一下CPU主频。CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed)。CPU的主频的基本单位是赫兹(Hz),但更多的是以兆赫兹(MHz)或吉赫兹(GHz)为单位。时钟频率的倒数即为时钟周期。时钟周期的基本单位为秒(s),...阅读全文

博文 2018-01-04 10:57:19 johng.cn

golang 性能优化实战

调优基本思路 对外接口协议不能改变 了解需求和代码演进过程 确定资源消耗类型 控制运算数据输入量 提高 CPU 利用率 提高缓存命中率 项目概况 gin-swagger 解析使用 gin 的代码,生成 swagger2.0 的文档,以保证文档和代码的一致性。 使用 golang.org/x/tools/go/loader 将源码解析成 go/types go/ast 相关结构化数据。 通过遍历 package 找到目标代码块及其相关数据,构建 github.com/go-openapi/spec,序列化成 JSON 格式,完成所有操作。 性能现状 以 service-card 项目为例: $ system_profiler SPHardwareDataType Hardware: Hardw...阅读全文

博文 2020-04-08 07:32:46 王谙然

[Golang]如何检查内存泄漏(1)

[root@s3 twitter]# go tool pprof http://localhost:6060/debug/pprof/heap --text Read http://localhost:6060/debug/pprof/symbol Fetching /pprof/heap profile from localhost:6060 to /tmp/76z7mNTrzO Wrote profile to /tmp/76z7mNTrzO Adjusting heap profiles for 1-in-524288 sampling rate Total: 47.5 MB 24.5 51.6% 51.6% 24.5 51.6% reflect.unsafe_NewArray 23....阅读全文

博文 2015-11-12 16:00:31 abv123456789

Go语言性能测试

对于一些服务来说,性能是极其重要的一环,事关系统的吞吐、访问的延迟,进而影响用户的体验。 写性能测试在Go语言中是很便捷的,go自带的标准工具链就有完善的支持,下面我们来从Go的内部和系统调用方面来详细剖析一下Benchmark这块儿。 Benchmark Go做Benchmar只要在目录下创建一个_test.go后缀的文件,然后添加下面函数: func BenchmarkStringJoin1(b *testing.B) { b.ReportAllocs() input := []string{"Hello", "World"} for i := 0; i < b.N; i++ { result := strings.Join(input, " ") if result != "Hello...阅读全文

博文 2017-11-01 16:00:05 davygeek

Go学习笔记目录

(基础知识篇)一、Go语言之语言结构二、Go语言之变量三、Go语言之常量四、Go语言之指针五、Go语言之延迟调用函数defer六、Go语言之匿名函数和C++的lambda表达式七、Go语言之类篇八、Go 语言之循环语句九、Go语言之Switch十、Go语言之continue/break label十一、Go语言之Map非并发安全十二、Go语言之Json的struct tag十三、Go 语言之restful 基础十四、Go并发之一:go语句篇十五、Go并发之二:goroutine的调度原理十六、Go并发之三:channel篇十七、Go并发之四:Select篇十八、Go并发之五:Waitgroup篇十九、Go并发之六: Context篇二十、Go单元测试之一:基础篇二十一、Go单元测试之二:st...阅读全文

博文 2020-05-27 19:35:33 ZhDavis

关于常驻内存RES,pprof,heap,threadcreate的疑问

小弟写了个简单后台用来接收POST请求上传过来的文件,并保存到后台本地。在做测试的时候,每一次请求上传5个文件,5个文件大小总和大概在300-400k的范围,测试的时候模拟客户端并发1000个POST上传文件。后台处理完1000请求后 RES直接上到500MB,查看/debug/pprof/下的threadcreate也直接上到400多个,再并发第二次,第三次... 1000个POST请求,RES在600多MB就不再涨了,threadcreate涨到570以后,增长速度就放缓了,此后七八分钟不再有请求发送RES慢慢再回降到100MB左右,但是threadcreate一直没有降过。上个图吧 ##1.服务开启: ####RES: +![开启服务.jpg](http://studygolan...阅读全文

go cmd 使用小坑一记

先说下使用场景,某服务在每台服务器上启动 agent, 用户会在指定机器上执行任务,并将结果返回到网页上。执行任务由用户自定义脚本,一般也都是 shell 或是python,会不断的产生子进程,孙进程,直到执行完毕或是超时被 kill 最近发现经常有任务,一直处于运行中,但实际上己经超时被 kill,并未将输出写到系统,看不到任务的执行情况。登录机器,发现执行脚本进程己经杀掉,但是有子脚本卡在某个 http 调用。我司的网滥到无法直视,内网还有不通的 case,并且还有很多公网机器,再看下这个脚本,python requests 默认没有设置超时... 总结一下现象:agent 用 go cmd 启动子进程,子进程还会启动孙进程,孙进程因某种原因阻塞。此时,如果子进程因超时被 agent k...阅读全文

博文 2018-07-30 18:34:52 董泽润

go package name convention 命名规范

package names package命名规范: 简短与清晰: good: time, list, http;bad:computeServiceClient, priority_queue 尽量使用单字(sigle-word)包名,如果非得使用多字包名(multiple-word)规范:直接多字连接作为包名。如:stringset, helloworld 可理解性的缩写:strconv(string convention)syscall,fmt,用一些比较高频易懂的词 尽量不用通用词:good: bufio,bad: buf 尽量不使用无意义的包名:util, common package 内的内容(变量,函数,Struct)命名规范: 避免重复:good: http.Server, ...阅读全文

博文 2020-03-01 03:32:47 cdz620

golang test测试实例

本文的目的是对mymysql进行单元测试和性能测试 准备工作: 1 go get github.com/ziutek/mymysql/thrsafe 2 在mysql建表和初始化数据(db是test) drop table if exists admin; CREATE TABLE `admin` ( `adminid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `username` varchar(20) NOT NULL DEFAULT '' COMMENT '后台用户名', `password` char(32) NOT NULL DEFAULT '' COMMENT '密码,md5存', PRIMARY KEY(`adminid`) ) CO...阅读全文

博文 2014-10-04 19:26:09 yjf512

golang 性能测试pprof

植入: 在main包中 import _ "net/http/pprof" 在main函数中添加 go func() { log.Println(http.ListenAndServe("0.0.0.0:6060", nil)) }() 就这样两步就完成了pprof植入 分析: go tool pprof http://localhost:6060/debug/pprof/heap 查看堆栈 自动弹出网页展示svg图,如果 报错:Failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in %PATH% 请到http://www.graphviz.org/Downl...阅读全文

博文 2017-09-18 09:30:02 coder-886

go profile

go profile 简介 Go语言的性能分析工具pprof是Google C++ profiler的移植,非常有趣。 cpu profile If the code used the Go testing package’s benchmarking support, we could use gotest’s standard -cpuprofile and -memprofile flags. In a standalone program like this one, we have to import runtime/pprof and add a few lines of code: import "runtime/pprof" var cpuprofile = flag.Str...阅读全文

博文 2016-09-21 09:00:06 tangjiaxu

Go性能测试工具pprof

简介Golang 内置 cpu、mem、block 三种 profiler 采样工具,允许程序在运行时使用 profiler 进行数据采样,生成采样文件。通过 go tool pprof 工具可以交互式分析采样文件,得到高可读性的输出信息,帮助开发者快速分析及定位各种性能问题,如 CPU 消耗、内存分配及阻塞分析。数据采样 1. 安装第三方性能分析来分析代码包runtime.pprof 提供基础的运行时分析的驱动,但是这套接口使用起来还不是太方便,例如:输出数据使用 io.Writer 接口,虽然扩展性很强,但是对于实际使用不够方便,不支持写入文件,默认配置项较为复杂。很多第三方的包在系统包 runtime.pprof 的技术上进行便利性封装,让整个测试过程更为方便。这里使用 github....阅读全文

博文 2018-09-11 16:35:11 T_winner

Go 语言的手工内存管理

Intro Note: This post might rustle some feathers and please let me know if I get something horribly wrong - I don’t profess to be an expert at this. We collect performance statistics from a lot of go users by nature of what we do at deferpanic. Unlike other APM/error logging companies, our main focus is not telling you that there is a problem but w...阅读全文

博文 2015-05-18 08:00:00 HappyBKs, gones945, wancheng, 一曲

golang pprof 使用简介

golang 的 pprof 是性能分析的神器,包括交互命令行和 UI 图像化的分析。主要来看看 pprof 支持哪些功能,以及我们如何用他来分析性能。 pprof 使用 使用 pprof 需要在代码里倒入如下的包 import _ "net/http/pprof" 如果没有跑http server,比如说跑了一个进程,那么需要另起一个 goroutines 跑一下 http server go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }() 使用交互式命令 查看堆栈调用信息 go tool pprof http://localhost:6060/debug/pprof/heap 查看 30 秒内的 C...阅读全文

博文 2019-06-17 02:32:40 咔叽咔叽_

发现标准库也有内存不回收的问题

写了一个从视频中截取预览图的工具, 使用 go 1.7 用这个库: github.com/opennota/screengen 测试时发现内存一直涨,根本就停不下来,最后能服机器搞死,而且无论等多久内存占用也不会降下来 开始以为是第三方库的问题,最后测试发现了点不一样的东西, 具体如下: ``` top (pprof) top 18412.15MB of 18506.45MB total (99.49%) Dropped 21 nodes (cum <= 92.53MB) flat flat% sum% cum cum% 18411.15MB 99.49% 99.49% 18411.65MB 99.49...阅读全文

Go语言HTTP测试及程序性能调优

这篇要讲的东西,主要是HTTP,WebSocket的测试及如何调优Go程序的一些方法. 分下面几个内容: 一.httptest测试包 二.性能测试 三.怎么利用参数分析和调优程序 四.在运行中实时监控调优 一.httptest测试包 对于HTTP和WebSocket测试,Go标准库有一个HTTP测试框架.在"http/httptest"包下. go1.5.1\go\src\net\http\httptest 怎么用可以在源码目录看例子,也可以上官网看看这个例子: https://golang.org/src/net/http/request_test.go 里面各种用法还是很全的. 如果想亲自动手试试. https://golang.org/doc/articles/wiki/ 有个很完整的...阅读全文

博文 2015-12-15 12:00:00 xcltapestry

reflect为什么慢

在上一篇《reflect实践与剖析》的文章中,本来打算写的更深入一点,结果发现reflect里面的东西太多了,在一篇文章中很难写全,就草草收尾了。今天谈一谈关于reflect的另一个问题:reflect为什么慢? 先问是不是,再问为什么。我们先来看一下reflect是不是真的慢。 Golang testinggolang提供了一个testing包,使得单元测试、性能测试尤为简单。只要新建一个以_test结尾的文件,然后使用命令go test就可以自动执行文件中的相应测试函数了(单元测试函数以Test开头,性能测试函数以Benchmark开头)。除了单元测试和性能测试,testing还有其他的功能,暂且按住不表。下面主要介绍一下单元测试和性能测试怎么写。 单元测试比如我们写了一个简单的浮点数除...阅读全文

博文 2017-07-02 19:24:55 Tao Kelu

Go 运行时间分析工具 gom

Gom 是一个可视化界面,处理 Go 程序的运行时间分析数据(runtime profiling data )。 ## Goals * 构建一个轻量级的工具,处理运行时间分析(runtime profiles ) * gom 不准备提供命令行工具那样的高细粒度的特性,用户需要更复杂功能时可求助 `go tool pprof` 工具 * 允许用户通过符号名字进行过滤,隐藏、忽略。 * 提高对 Go 的分析工具和软件包的关注度。 * 在其它可能的地方提供额外的轻量级数据 ### Minor Goals * gom 提供界面让用户输出他们的分析数据 * 允许用户使用自定义的 profiles. * 简化 pprof 图形输出 [![gom screenshot](http:/...阅读全文

开源项目 2016-01-07 16:00:00 rakyll

golang runtime-gdb.py的问题

问题: (gdb) source /Users/sherlock/documents/go/src/runtime/runtime-gdb.py Loading Go Runtime support. Traceback (most recent call last): File "/Users/sherlock/documents/go/src/runtime/runtime-gdb.py", line 205, in _rctp_type = gdb.lookup_type("struct runtime.rtype").pointer() gdb.error: No struct type named runtime.rtype. 解决方案: 1. git clone...阅读全文

博文 2015-06-17 20:04:05 body100123

使用 pprof 和火焰图调试 golang 应用

什么是 Profiling? Profiling 这个词比较难翻译,一般译成画像。比如在案件侦破的时候会对嫌疑人做画像,从犯罪现场的种种证据,找到嫌疑人的各种特征,方便对嫌疑人进行排查;还有就是互联网公司会对用户信息做画像,通过了解用户各个属性(年龄、性别、消费能力等),方便为用户推荐内容或者广告。 在计算机性能调试领域里,profiling 就是对应用的画像,这里画像就是应用使用 CPU 和内存的情况。也就是说应用使用了多少 CPU 资源?都是哪些部分在使用?每个函数使用的比例是多少?有哪些函数在等待 CPU 资源?知道了这些,我们就能对应用进行规划,也能快速定位性能瓶颈。 golang 是一个对性能特别看重的语言,因此语言中自带了 profiling 的库,这篇文章就要讲解怎么在 gol...阅读全文

博文 2017-09-12 04:02:57 CIZIXS

书籍:The Way To Go,第三部分

Error handling error interface type error interface { Error() string } defining errors :import "errors" var errNotFound error = errors.New("Not found error") err := errors.New("math – square root of negative number") custom error type PathError struct { Op string Path string Err error } panic and recover panic("A severe error occurred: stopping the...阅读全文

博文 2014-10-13 18:00:01 月光独奏

golang trace工具使用

1)增加如下代码 //导入包 import ( "net/http" _ "net/http/pprof" ) //增加如下代码 go func() { fmt.Println(http.ListenAndServe(":5567", nil)) }() 2)执行curl 127.0.0.1:5567/debug/pprof/trace?seconds=10 > trace.data,获取到trace.data数据 3) 执行 go tool trace -http=':8888' your_app_bin trace.data。会跳转到浏览器查看trace到数据...阅读全文

博文 2017-05-25 05:00:38 xloogson

关于go语言获取cpu执行情况数据分析疑问?

我编写的代码: ```go func SaveCpuProfile() { f, err := os.Create(fmt.Sprintf("heap_cpu_%s.prof", time.Now().Format("2015_02_26_03_04_05"))) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() f.Close() } ``` 保存结果如 http://pan.baidu.com/s/1pJI9C6n 截图,但是pprof使用top或者web命令都是0...阅读全文

通过火焰图排查golang json的性能问题

前言: 最近要上线一个golang写的高频服务端,上线前理所当然要压测一把。 在压力源足够的情况下,发现golang服务的cpu相对有些高,怎么办? 直接上golang的神器pprof来排查问题, 通过pprof可以分析heap对象,协程的stack调用栈,当前的协程数,还可以构建火焰图等等。 该文章后续仍在不断更新中, 请移步到原文地址 http://xiaorui.cc/?p=5108 排查问题 至于pprof怎么用,我就不说了。 因为太简单没啥好说的,直接import,然后run起来就完事了。听说,1.10版开启pprof会更加的简单。 接着我们再通过go-torch和FlameGraph是可以构建火焰图的。 具体安装生成火焰图的步骤,自己google。 需要注意的是,go-torch...阅读全文

博文 2019-06-03 20:01:16 rfyiamcool

golang使用pprof检查goroutine泄露

有一段时间,我们的推送服务socket占用很不正常,我们自己统计的同时在线就10w的用户,但是占用的socket竟然达到30w,然后查看goroutine的数量,发现已经60w+。 每个用户占用一个socket,而一个socket,有read和write两个goroutine,简化的代码如下: c, _ := listerner.Accept() go c.run() func (c *conn) run() { go c.onWrite() c.onRead() } func (c *conn) onRead() { stat.AddConnCount(1) //on something stat.AddConnCount(-1) //clear //notify onWrite to q...阅读全文

博文 2014-10-24 08:24:45 siddontang

golang 如何排查和定位GC问题

最近在做文本处理的时候遇到一个很奇怪的现象。串行执行脚本可能只需要几秒钟,但是如果想给每行开个协程并发处理的话,执行时间却从几十秒到几十分钟不等,关键是执行的过程中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....阅读全文

博文 2018-01-19 18:33:48 ssdut_buster

golang 单元测试、性能测试、性能监控技术

golang 单元测试、性能测试、性能监控技术 go语言提供了强大的测试工具,下面举例简单介绍一下 go test 单元测试 go test -bench=. 性能测试 go tool pprof 性能监控 go test 单元测试 例如对包helper下的util.go 进行单元测试,util.go 里主要包含两个功能,一个是对字符串进行sha1加密,一个是验证手机号码 编写测试文件 如果我们要测试验证手机号码功能是否正确,我们可以在该包下新建util_test.go文件,一般命名方式为 _test.go(为测试文件主文件名),测试函数以 Test函数(t *testing.T) 形式 util_test.go 然后cmd窗口下执行(注意将目录切换到当前目录,如果是windows系统,按住...阅读全文

博文 2016-09-03 00:00:04 hil2000

golang 内存分析/动态追踪

21天精品区块链课程免费学习,深入实战行家带路,助力开发者轻松玩转区块链! >>> golang pprof 当你的golang程序在运行过程中消耗了超出你理解的内存时,你就需要搞明白,到底是 程序中哪些代码导致了这些内存消耗。此时golang编译好的程序对你来说是个黑盒,该 如何搞清其中的内存使用呢?幸好golang已经内置了一些机制来帮助我们进行分析和追 踪。 此时,通常我们可以采用golang的pprof来帮助我们分析golang进程的内存使用。 pprof 实例 通常我们采用http api来将pprof信息暴露出来以供分析,我们可以采用net/http/pprof 这个package。下面是一个简单的示例: // pprof 的init函数会将pprof里的一些handler注册到...阅读全文

博文 2018-09-01 14:33:15 tqyin

go pprof与线上事故:一次成功的定位与失败的复现

背景:一次大几万人的线上抢购活动,突然出现了问题,页面半天打不开,打开了半天下不了单,cpu涨了又跌跌了又涨,而内存使用又稳如老狗!不要慌,按照套路去分析问题,一切都不是问题! 阅读此文你将收获: 分析问题的一个思路! 学会使用pprof定位问题。 解决问题的一个思路! 大纲: 我是如何定位问题的 如何通过pprof精准定位 通过pprof来定位代码 我是如何trouble shooting的 一. 我是如何思考问题的 “活动挂了,下不了单!”,随着一声凄凉的惨叫,办公室大门被运营人员打开,于是活动团队开始了紧张的bug定位过程。通过一段时间的代码查看未能定位问题,重启也没法解决。 通过finalshell上的机器使用率显示,我们发现了一个有趣的现象,CPU的使用率从30%涨到60%再涨到9...阅读全文

博文 2020-04-30 21:32:53 奔奔奔跑

golang下划线(underscore) 总结

一、概述 "_" 可以简单理解为赋值但以后不再使用,在golang中使用的比较多,使用的场合也很多,稍作总结; 二、场景 1、import 1 import _ "net/http/pprof" 引入包,会调用包中的初始化函数,这种使用方式仅让导入的包做初始化,而不适用包中其他功能; 2、用在返回值 1 for _, v := range Slice {} 2 _, err := func() 表示忽略某个值。单函数有多个返回值,用来获取某个特定的值 3、用在变量 1 type Interface interface { 2 3 } 4 5 type T struct{ 6 7 } 8 9 var _ Interface = &T{} 上面用来判断 type T是否实现了I,用作类型断言,如...阅读全文

博文 2017-07-20 04:00:02 chris-cp

golang 项目实战简明指南

**[原文地址](http://litang.me/post/golang-project-guide/)** ### 开发环境搭建 golang 的开发环境搭建比较简单,由于是编译型语言,写好 golang 源码后,只需要执行 `go build` 就能将源码编译成对应平台(本文中默认为 linux)上的可执行程序。本文不再赘述如何搭建 golang 开发环境,只说明下需要注意的地方。 从官网下载对应平台的 golang 安装包中包括 golang 的编译器、一些工具程序和标准库源码。早期的 golang 版本中,需要设置 `GOROOT` 和 `GOPATH` 两个环境变量。 从 1.8 版开始,`GOPATH` 不再需要显示设置。如果没有显示设置,则 `GOPATH` 的默认值为 `$...阅读全文

博文 2018-09-29 19:07:19 darlingtangli

记一次golang内存泄露问题修复

前言 公司一个项目中需实现以下功能: 读取主程序产生的日志. 将日志处理后存入mongodb 实现思路大致如下: 使用filewatch监视文件,一旦文件产生改变读取新添加数据. 将读取数据处理后存入mongodb. 问题 程序运行一段时间后发现系统变的巨卡,查看进程管理发现此进程占用大部分内存,再次估计是发生内存泄露,开始查找问题.在程序中加入内存消耗分析 fm, err := os.OpenFile("./mem.out", os.O_RDWR|os.O_CREATE, 0644) if err != nil { log.Fatal(err) } pprof.WriteHeapProfile(fm) fm.Close() 分析后发现大部分内存分配在watcher.WaitForFileC...阅读全文

博文 2018-01-29 11:34:38 pinecone

golang使用火焰图查看性能

下载graphviz https://graphviz.gitlab.io/_pages/Download/Download_windows.html windows下载msi格式,安装成功后,进入命令行查看是否安装成功 指令:dot -version 如下图,说明安装成功 添加代码 在你的程序中加入如下代码: import "net/http" import _ "net/http/pprof" func main() { // 主函数中添加 http.ListenAndServe("0.0.0.0:9999", nil) } 运行程序 在命令行执行如下指令: go tool pprof -http=:1234http://localhost:9999/debug/pprof/profil...阅读全文

博文 2020-04-16 15:37:04 技术修仙

Golang的pprof的使用心得(CPU,Heap)

参照的是https://github.com/caibirdme/hand-to-hand-optimize-go 这个文章写一段代码测试首先自己写一段demo里面负责2件事doSomeThingOnegenSomeBytes运行这个程序go run main.go安装wrkTo install thewrk,you need only:git clonehttps://github.com/wg/wrk.gitcd wrkmakewrk relies on the openssl and luajit, learn more from its github pageGenerating requestsOur demo is listening on the port9876,so let...阅读全文

博文 2017-10-10 08:04:50 包_包

Go 程序的性能调试问题 - 内存篇

标签(空格分隔): Go Memory Profiler 性能调试 性能分析 注:该文作者是 Dmitry Vyukov,原文地址 Debugging performance issues in Go programs 这个是原文中的 Memory Profiler 段落 内存分析器显示了函数分配堆内存的情况。你可以以 CPU profile 相似的方式收集:使用 go test --memprofile,通过 http://myserver:6060:/debug/pprof/heap 使用 net/http/pprof 或是通过调用 runtime/pprof.WriteHeapProfile。 你仅可以显示在概要文件收集的时间分配的内存(默认,pprof 的 --inuse_space...阅读全文

博文 2015-06-18 19:00:29 zgh33073364

使用golang的pprof包对程序进行性能分析

程序经常出现OOM错误,然后关键字"go pprof"搜到文章,该文章第二步说运行程序后会生成profile文件,但是编译运行后发现生成的profile文件大小一直为0,然后关键字"go pprof profile is empty"搜到文章,该文章说在运行程序前添加环境变量GODEBUG="memprofilerate=1",但是好像并没有用处。 然后还是之前的关键字"go pprof"搜到文章<使用golang的pprof包对程序进行性能分析>,该文章指出"在代码中使用pprof了,实际运用中分三种情况",因为程序并非是运行一次就退出,而是作为一个服务,所以"需要开启一个goroutin...阅读全文

博文 2018-06-07 15:30:01 wongdu2014