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

golang test测试使用

1.创建测试文件夹mysql,文件夹下的go文件的package必须与文件夹名一致(不然会识别不到) 2.创建需要测试的文件mysql.go(使用github.com/go-sql-driver/mysql包) package mysql import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) func findByPk(pk int) int { var num int = 0 db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/plugin_master?charset=utf8") if err != nil { panic(err.Error()) } def...阅读全文

博文 2015-03-06 03:00:16 benlightning

使用go tool pprof分析内存泄漏、CPU消耗

go中提供了pprof包来做代码的性能监控,在两个地方有包: net/http/pprof runtime/pprof 其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来。 使用 net/http/pprof 做WEB服务器的性能监控 如果你的go程序是用http包启动的web服务器,想要查看自己的web服务器的状态。这个时候就可以选择net/http/pprof。 import _ "net/http/pprof"然后就可以在浏览器中使用http://localhost:port/debug/pprof/ 直接看到当前web服务的状态,包括CPU占用情况和内存使用情况等。当然,非WEB的也可以用下面方式启动WEB。在 main...阅读全文

博文 2016-05-10 02:00:02 ghj1976

在Go语言里检测内存泄漏

载于:在Go语言里检测内存泄漏 | DLCoder.com http://dlcoder.com/archives/5648 在影响软件系统稳定性的因素里,我们最担心的一个问题是内存泄漏,随着系统的运行,系统消耗的内存越来越多,直到最后整个操作系统越来越慢,甚至还会导致系统崩溃。在Go语言里,我们检测内存泄漏主要依靠的是go里面的pprof包,除此之外,我们还可以使用浏览器来查看系统的实时内存信息(包括CPU、goroutine等的信息)。主要是用net/http/pprof包在进程里建立一个HTTP服务器,对外输出pprof包的内部性能剖析信息。参见这篇文章。 Go语言的pprof包不仅可以诊断内存堆信息(毕竟,内存泄漏都是在堆里发生的),而且可以诊断CPU信息、goroutine信息、堵...阅读全文

博文 2015-07-23 21:00:00 sryan

[golang]内存不断增长bytes.makeSlice

golang写的一个图片服务器,在批量下载压缩时候发现内存不断增长。。。。 幸好golang自带内存占用日志结合分析工具可以方便看到内存分布。 详细可参考: http://blog.golang.org/profiling-go-programs 可以实时统计CPU\内存信息。 这里主要说一下内存怎么搞。CPU分析的参考之前的一篇文章。 //需要包含这个pprof包 import "runtime/pprof" //这里接收内存统计信息保存文件 var memprofile = flag.String("memprofile", "", "write memory profile to this file") //这里是判断是否需要记录内存的逻辑 if *memprofile != "" {...阅读全文

博文 2015-04-04 03:00:00 zhangqingping

Golang编程经验总结

如何选择web框架: 首先Golang语言开发web项目不一定非要框架,本身已经提供了Web开发需要的一切必要技术。当然如果想要ruby里面Rail那种高层次全栈式的MVC框架, Golang里面暂时没有,但是不是所有人都喜欢这种复杂的框架。Golang里面一些应用层面的技术需要自己去组装,比如session,cache, log等等. 可选择的web框架有martini, goji等,都是轻量级的。 Golang的web项目中的keepalive 关于keepalive, 是比较复杂的, 注意以下几点: http1.1 默认支持keepalive, 但是不同浏览器对keepalive都有个超时时间, 比如firefox: 默认超时时间115秒, 不同浏览器不一样; Nginx默认超时时间7...阅读全文

博文 2015-02-04 17:00:02 u013834131

Go程序性能分析pprof

参考: http://blog.golang.org/profiling-go-programs http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html Go语言的pprof是Google C++ profiler的移植,所以用法也差不多。这里简要记录步骤如下: 1. 代码 要在Go语言中开启profiling,可以参考以下代码: import ( "runtime/pprof" // 引用pprof package "os" ) func main() { f, _ := os.Create("profile_file") pprof.StartCPUProfile(f) // 开始cpu profile,结...阅读全文

博文 2014-10-10 10:00:01 yhcharles

Go 1.8中值得关注的几个变化

在已经过去的2016年,Go语言继在2009年之后再次成为编程语言界的明星- 问鼎TIOBE 2016年度语言。这与Go team、Go community和全世界的Gophers的努力是分不开的。按计划在这个2月份,Go team将正式发布Go 1.8版本(截至目前,Go的最新版本是Go 1.8rc3)。在这里我们一起来看一下在Go 1.8版本中都有哪些值得Gopher们关注的变化。 一、语言(Language) Go 1.8版本依旧坚守Go Team之前的承诺,即Go1兼容性:使用Go 1.7及以前版本编写的Go代码,理论上都可以通过Go 1.8进行编译并运行。因此在臆想中的Go 2.0变成现实之前,每个Go Release版本在语言这方面的“改变”都会是十分微小的。 1、仅tags不同...阅读全文

博文 2017-02-06 03:23:51 bigwhite

golang 内存分析/动态追踪

golang pprof 当你的golang程序在运行过程中消耗了超出你理解的内存时,你就需要搞明白,到底是 程序中哪些代码导致了这些内存消耗。此时golang编译好的程序对你来说是个黑盒,该 如何搞清其中的内存使用呢?幸好golang已经内置了一些机制来帮助我们进行分析和追 踪。 此时,通常我们可以采用golang的pprof来帮助我们分析golang进程的内存使用。 pprof 实例 通常我们采用http api来将pprof信息暴露出来以供分析,我们可以采用net/http/pprof 这个package。下面是一个简单的示例: // pprof 的init函数会将pprof里的一些handler注册到http.DefaultServeMux上 // 当不使用http.DefaultS...阅读全文

博文 2017-06-02 03:23:41 lrita

为golang程序使用pprof远程查看httpserver运行堆栈,cpu耗时等信息

pprof是个神马玩意儿? pprof - manual page for pprof (part of gperftools) 是gperftools工具的一部分 gperftools又是啥? These tools are for use by developers so that they can create more robust applications. Especially of use to those developing multi-threaded applications in C++ with templates. Includes TCMalloc, heap-checker, heap-profiler and cpu-profiler. 一个性能分析的工具,...阅读全文

博文 2015-03-21 19:00:01 zhangqingping

Golang pprof详解

go的pprof包 go中有pprof包来做代码的性能监控,在两个地方有包: net/http/pprof runtime/pprof 其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来. 本篇只讲如何在web上查看性能。 一、代码部分 1.import 增加net/http/pprof包 import( _ net/http/pprof ) 2. 打开http 监听端口 go func() { log.Println(http.ListenAndServe("localhost:10000", nil)) }() 二、网页上查看 *浏览器可以打开 http://127.0.0.1:10000/debug/pprof/ 可以查看...阅读全文

博文 2018-08-29 18:30:00 mrblue

golang pprof记录

runtime/pprof 我们要加入对pprof包里的方法调用,程序才能将运行时候程序的堆内存分配状态记录到文件(也可以是写到其他地方,例如网络等)中,以便进一步的分析. 如果你的go程序只是一个应用程序,比如计算fabonacci数列,那么你就不能使用net/http/pprof包了,你就需要使用到runtime/pprof。具体做法就是用到pprof.StartCPUProfile和pprof.StopCPUProfile。(Go语言的pprof是Google C++ profiler的移植.) 比如下面的例子: import ( "flag" "fmt" "os" "runtime/pprof" ) var cpuprofile = flag.String("cpuprofile",...阅读全文

博文 2015-03-06 03:00:16 benlightning

go test test & benchmark

开发程序其中很重要的一点是测试,我们如何保证代码的质量,如何保证每个函数是可运行,运行结果是正确的,又如何保证写出来的代码性能是好的,我们知道单元测试的重点在于发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决,而性能测试的重点在于发现程序设计上的一些问题,让线上的程序能够在高并发的情况下还能保持稳定。本小节将带着这一连串的问题来讲解Go语言中如何来实现单元测试和性能测试。 Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试,testing框架和其他语言中的测试框架类似,你可以基于这个框架写针对相应函数的测试用例,也可以基于该框架写相应的压力测试用例,那么接下来让我们一一来看一下怎么写。 如何编写测试用例 由于go test命令...阅读全文

博文 2016-05-07 15:00:01 diegodu

Go语言程序测试

最近一直在搞各种测试,然后今天周末翻翻书,发现特价萝卜的书上在测试方面写得挺全的。 这书是之前CU(chinaunix.net)论坛。搞活动得到奖品(还有作者亲笔签名),拿回来都没看完. 因为写得太太太细了,又厚。 参考他的书及官网的文档,再把测试方面的东西过一下还是有点意思的. 这篇主要讲这几点: 一.Testing的几种不同形式 功能测试: TestXxxx(t *testing.T) 基准测试: BenchmarkXxxx(b *testing.B) 样本测试: Example_Xxx() 用于测试的Main函数: TestMain(m *testing.M) // // func TestMain(m *testing.M) { // flag.Parse() // os.Exit(...阅读全文

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

[翻译]理解 Go 语言的内存使用

许多人在刚开始接触 Go 语言时,经常会有的疑惑就是“为什么一个 Hello world 会占用如此之多的内存?”。Understanding Go Lang Memory Usage 很好的解释了这个问题。不过“简介”就是“简介”,更加深入的内容恐怕要读者自己去探索了。另外,文章写到最后,作者飘了,估计引起了一些公愤,于是又自己给自己补刀,左一刀,右一刀…… ————翻译分隔线———— 理解 Go 语言的内存使用 2014年12月22日,星期一 温馨提示:这仅是关于 Go 语言内存的简介,俗话说不入虎穴、焉得虎子,读者可以进行更加深入的探索。 大多数 Go 开发者都会尝试像这样简单的 hello world 程序: package main import ( "fmt" "time" ) ...阅读全文

博文 2014-12-24 18:00:03 mikespook

Go程序调试、分析与优化

Go程序调试、分析与优化 八 25 bigwhite技术志 atomic, BradFitzpatrick, Channel, Concurrency, Darwin, debugging, Go, Golang, goroutine, gotools, Linux, Mutex, optimization, parallelism, Perl, pprof, Ubuntu, YAPC, 优化, 原子操作, 并发, 并行, 调试, 锁 No Comments Brad Fitzpatrick在YAPC Asia 2015(Yet Another Perl Conference)上做了一次技术分享,题为:"Go Debugging, Profiling, and Optimization"。个...阅读全文

博文 2015-08-26 08:40:50 bigwhite

Go的pprof使用

Go 中监控代码性能的有两个包: net/http/pprof runtime/pprof 这两个包都是可以监控代码性能的, 只不过net/http/pprof是通过http端口方式暴露出来的,内部封装的仍然是runtime/pprof。 runtime/pprof 的用法示例 这里的例子我们用 递归实现的斐波纳契数列来测试性能,斐波纳契数列 的代码如下: package main import ( "fmt" ) func main() { for i := 0; i < 10; i++ { nums := fibonacci(i) fmt.Println(nums) } } func fibonacci(num int) int { if num < 2 { return 1 } ret...阅读全文

博文 2015-06-02 04:00:05 ghj1976

Golang使用pprof监控性能及GC调优

这两天用golang在写一个监控的agent,发现长时间运行后会有内存泄露的情况,着实让人郁闷半天… 要解决golang泄露的问题,要理解goalng gc那是事情,再就是利用pprof监视golang的运行环境。 该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。http://xiaorui.cc/?p=3000 这Golang GC垃圾回收我就先不多说了,等我自己深入了解了,会专门找个时间聊这事. 在golang中用来做监控分析的库包,一般用都是pprof库包… pprof可以在两个地方引入: Python net/http/pprof runtime/pprof 1234 net/http/pprof runtime/pprof 其实net/http/ppr...阅读全文

博文 2017-04-04 19:31:04 rfyiamcool

Go语言 系统监控常用工具

Go是很实在的编程语言,从一开始就提供了很详细的运行状态信息。产品上线后的调优和排查疑难杂症都得靠这些状态信息。这边总结一些我们项目里用到的状态监控手段。 pprof Go自带了一个pprof工具,这个工具可以做CPU和内存的profiling,官方的博客有一篇文章介绍用法:《Profiling Go Programs》 官方的文章讲了怎么用自带的pprof工具分析数据,但是获得分析数据的部分比较单一,我在很长一段时间一直误以为cpuprof和memprof必须在程序启动时打开,其实cpuprof和memprof是可以在线打开和关闭的。 并且pprof模块其实不只是cpuprof和memprof这两个功能,其中还提供了Lookup功能用于获取堆状态信息、线程状态信息、 goroutine状态...阅读全文

博文 2014-10-09 16:00:00 abv123456789

golang 核心开发者 Dmitry Vyukov(1.1 调度器作者) 关于性能剖析

让我们假设你有一golang 程序,想改善其性能。有几种工具可以帮我们完成这个任务。这些工具可以帮我们识别程序中的热点(cpu,io,memory), 热点即是那些需要我们集中精力于其上,能显著改善改善性能的地方。然而,另外一种结果也是可能的,工具帮我们识别出程序里的多种性能缺陷。比如,每次查询数据库,你都准备sql 语句,然而,你可以在程序启动时,只准备一次。另一个例子,一个O(n^2)的算法莫名其妙的溜进,某些存在O(n) 算法的地方。为了识别出这些情况,你需要合理检查程序剖析所看到的结果。比如第一个例子中,有显著的时间花费在sql 语句准备阶段,这就是一个危险的信号。 了解多种关于性能的边界因素也是重要的。比如,你的程序使用100Mbps网络链路通信,它已经使用了链路90Mbps以上的...阅读全文

博文 2015-01-26 20:00:01 yujian0231

golang cpuprofile分析

http://www.philo.top/2015/05/29/golangProfilingAndGC/ Philo 关注Golang与Docker技术 HomeArchivesAboutDonateGeekP weibo github 5月 29 2015 技术 golang调优之clock ticks 本blog的来源 昨天在找工作面试的时候我与面试官聊到了golang的问题。当然讨论的热点就是调优与GC。 结果面试变成了技术讨论与研究,聊了接近一个小时,真的很开心。 下面的研究内容来自goblog https://blog.golang.org/profiling-go-programs 我也只是想浓缩一遍上面的内容方便大家研习。当然文章可能比较老了。 因此我在这里重新走一遍大神之路...阅读全文

博文 2015-11-17 16:00:01 caoshulin1989

go pprof

runtime/pprof 我们要加入对pprof包里的方法调用,程序才能将运行时候程序的堆内存分配状态记录到文件(也可以是写到其他地方,例如网络等)中,以便进一步的分析. 如果你的go程序只是一个应用程序,比如计算fabonacci数列,那么你就不能使用net/http/pprof包了,你就需要使用到runtime/pprof。具体做法就是用到pprof.StartCPUProfile和pprof.StopCPUProfile。(Go语言的pprof是Google C++ profiler的移植.) 比如下面的例子: 1: 2: import ( 3: "flag" 4: "fmt" 5: "os" 6: "runtime/pprof" 7: ) 8: 9: var cpuprofile ...阅读全文

博文 2014-10-16 13:00:00 susubuhui

记一次golang gc优化过程

我们使用golang编写的线上服务,通常会设置一个golang runtime指标监控,包括goroutine num、gc num、gc pause 等等。最近的一次上线,发现 gc 相关的指标出现异常,gc num 和 gc pause 大幅升高。由于 golang 的 gc 是 stop the world 来做, gc 过多会抢占程序的正常执行时间,甚至影响对外提供的服务,因此暂停了上线,准备先把 gc 的问题修复下。 出问题时的 gc 监控如下: image.png 其中蓝色曲线表示 gc num,黄色曲线表示 gc pause(单位ms),两个指标都是30s的累计数据。可以看到每30s的pause达到了秒级别。 登录到线上机器,通过 go tool pprof --alloc_o...阅读全文

博文 2017-09-25 12:34:48 zippera

golang的profile

假如你对代码的性能要求比较高,这段对你应该有作用。在golang中的工具中有一个工具可以搜集cpu profile信息。具体使用方法: 在代码中引用runtime/pprof包即可。 //main.go package main import “runtime/pprof” int main() { f, err := os. Create("cpu.prof") if err != nil { // 可以输出一些出错信息 return } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() // other code … } go build main.go ./main 执行后即可生成 cpu.prof文件在当前目录,其中记录了代码...阅读全文

博文 2015-06-17 20:05:13 lyhuzi

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 onWrit...阅读全文

博文 2014-10-04 19:26:13 mfrbuaa

Go 程序的性能调试问题

Let's assume you have a Go program and want to improve its performance. There are several tools available that can help with this task. These tools can help you to identify various types of hotspots (CPU, IO, memory), hotspots are the places that you need to concentrate on in order to significantly improve performance. However, another outcome is p...阅读全文

博文 2015-03-06 23:00:01 社会主义好, Micooz, 暗夜在火星, ScriptKid, 霍啸林

[译] Go 可视化性能分析工具

文: A Short Survey of PProf Visualization Tools by Jordan Crabtree。 调试CPU相关的问题经常会涉及关于趋势的微妙问题。堆使用的峰值是否逐渐的增长? routine在什么地方被调用,调用的频度如何? 一图胜千言。一张图片就可以提供很多有用的上下文信息,否则如果用语言解释起来累的半死。将pprof可视化显示可以将有用的CPU统计数据与整个时间的上下文关联起来。 pprof 是什么? PProf是一个CPU分析器( cpu profiler), 它是gperftools工具的一个组件, 由Google工程师为分析多线程的程序所开发。Go标准库中的pprof package通过HTTP的方式为pprof工具提供数据。 (译者注:不止这...阅读全文

博文 2017-06-21 03:32:38 smallnest

Go 调优技术

## 内存管理 在开始探索 Go 调优技术和工具之前,我们需要先了解一下 Go 内存模型,它可以帮助我们理解内存是如何使用的。 Go 实现的是 _并行的_ [标记-清除垃圾回收器](http://wiki.c2.com/?MarkAndSweep)。在 _传统的_ 标记-清除模型中,垃圾回收器会先让程序停下来(也就是,“stop the world”),然后查找已经失效的对象,并把这些对象清理掉(也就是,释放内存)。因为程序在运行中会移动引用(references),导致垃圾的识别和清理出现困难。同时,垃圾回收也会导致延迟和其他的问题。在 Go 语言中 [GC 是并发执行的](https://blog.golang.org/go15gc),所以 GC 执行时,用户可能不会注意到暂停或者延迟。...阅读全文

博文 2017-12-20 15:38:13 polaris

Go 程序的性能调试问题

http://www.oschina.net/translate/debugging-performance-issues-in-go-programs 假设你手上有个Go语言编写的程序,你打算提升它的性能。目前有一些工具可以为此提供帮助。这些工具能帮你发现包括CPU、IO和内存在内多种类型的热点。所谓热点,是指那些为了能显著提升性能而值得你去关注的地方。有时候这些工具还能帮助你发现程序中主要的性能瑕疵。举个例子,你没必要每次执行SQL查询前都对SQL语句进行参数化解析,你可以将这个准备过程在程序启动时一次完成。再举个例子,当前某个算法的复杂度是O(N²),但其实存在一个复杂度是O(N)的解决方案。为了能发现这些问题,需要理智地检查你在优化分析器中获取到的信息。比如上面提到的第一个问题,你会...阅读全文

博文 2015-03-30 13:00:01 leonpengweicn

golang heap profile分析

http://www.philo.top/2015/05/29/golangProfilingAndGC2/ Philo 关注Golang与Docker技术 HomeArchivesAboutDonateGeekP weibo github 5月 29 2015 技术 golang调优之GC Continue 在上篇中,主要针对个函数使用时间来对程序分析进行调优。 在本片中由于发现GC使用时间过长来对程序进行分析。 针对内存进行调优。 内存调优,查找什么位置引发GC时间过多 第二个版本的pprof结果 1 2 3 4 5 6 7 (pprof) top5 Total: 1652 samples 197 11.9% 11.9% 382 23.1% scanblock 189 11.4% 23....阅读全文

博文 2015-11-17 12:00:01 caoshulin1989

记一次golang的gzip优化

背景 近期使用Golang官方的"compress/gzip"包对数据压缩返回给App,此场景特性:数据不固定、高并发。在实际过程中发现一个简单逻辑的API服务,几百QPS的情况下CPU却很高达到几个核负载。 问题追踪 通过golang自带工具pprof抓图分析CPU,如下图(由于有业务代码,所以部分信息遮盖了): 通过此图可以看出,整个工程里有两个CPU消耗大头:1)GC高 2)大部分CPU耗在Gzip上.看方法属于New操作,再加上GC高,很容易往一个方向上去想,就是对象创建过多造成。 于是google搜了一些资料发现有人尝试优化gzip,地址:https://github.com/klauspost/compress/tree/master/gzip,但经过测试虽然速度提升20~30%...阅读全文

博文 2017-07-28 14:40:26 blov

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的代码调优一例

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 pprof 使用

自:http://www.cnblogs.com/yjf512/archive/2012/12/27/2835331.html go中有pprof包来做代码的性能监控,在两个地方有包: net/http/pprof runtime/pprof 其实net/http/pprof中只是使用runtime/pprof包来进行封装了一下,并在http端口上暴露出来 pprof包 web 服务器 如果你的go程序是用http包启动的web服务器,你想查看自己的web服务器的状态。这个时候就可以选择net/http/pprof。你只需要引入包_"net/http/pprof",然后就可以在浏览器中使用http://localhost:port/debug/pprof/直接看到当前web服务的状态,包括C...阅读全文

博文 2015-11-05 22:00:01 LvanNeo

一个 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

Go 逃逸分析的缺陷

## 序 先阅读这个由四部分组成的系列文章,对理解逃逸分析和数据语义会有帮助。下面详细介绍了阅读逃逸分析报告和 pprof 输出的方法。(GCTT 已经在翻译中) ## 介绍 即使使用了 Go 4 年,我仍然会被这门语言震惊到。多亏了编译器执行的静态代码分析,编译器可以对其生成的代码进行一些有趣的优化。编码器执行的其中一种分析称为逃逸分析。这会对内存管理进行优化和简化。 在过去的两年中,(Go)语言团队一直致力于优化编译器生成的代码,以获得更好的性能,并且做了极其出色的工作。我相信,如果逃逸分析中的一些现有的缺陷得以解...阅读全文

博文 2018-02-13 11:18:27 ictar

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

如何获取运行的go程序的profile信息

## 如何获取运行的go程序的profile信息? 运行的go程序的所有profile信息都是通过在运行时调用[`runtime/pprof`](https://golang.google.cn/pkg/runtime/pprof/)和[`runtime/trace`](https://golang.google.cn/pkg/runtime/trace/)两个包的接口获取,调用这些接口的方式有直接调用和通过http请求间接调用两种,下面我们说明各种常用的profile信息以及它们的获取,使用方式。 ### 1. **当前所有goroutine的函数调用栈** **通过http请求间接获取:** 在程序中引入包[`net/http/pprof`](https://golang.google....阅读全文

博文 2018-01-31 12:20:36 marlonche

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

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, 一曲

GO服务端Syscall CPU开销过高

我的程序作为proxy转发来自于后端前端的数据,现在遇到一个问题,我用pprof工具分析得到 ![屏幕快照 2016-09-07 下午3.24.54.png](http://studygolang.qiniudn.com/160907/05362ee90ead225328071ef4efba816e.png) ![屏幕快照 2016-09-07 下午3.36.36.png](http://studygolang.qiniudn.com/160907/d0ea8db3315e243f34ebccf0f3cc0f69.png) syscall 占用了30%左右的CPU开销, 根据GV图主要集中在写的上面 想问问能从什么地方对它进行优化? 底层网络库用的是GO net...阅读全文

Golang FlameGraph(火焰图)

简介 安装 go get github.com/uber/go-torch # 再安装 brendangregg/FlameGraph export PATH=$PATH:/absolute/path/FlameGraph-master # 还需要安装一个graphviz用来画内存图 yum install graphviz 代码修改 import "net/http" import _ "net/http/pprof" func main() { // 主函数中添加 go func() { http.HandleFunc("/program/html", htmlHandler) // 用来查看自定义的内容 log.Println(http.ListenAndServe("0.0.0.0:...阅读全文

博文 2017-11-01 13:03:07 城寒

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

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

go语言服务端内存持续增长,求解惑!

最近用golang开发了一个socket服务端,主要逻辑就是接收客户端发来的数据解析后存入opentsdb中,但是跑一段时间后发现内存就会增长,而且不会被gc回收,初步判定是由于大量make []byte 导致内存不释放,代码如下,求高人解惑? ``` func StartTCP() error { tcp_addr, _ := net.ResolveTCPAddr("tcp4", tcp_listen) listener, err := net.ListenTCP("tcp4", tcp_addr) if err != nil { return err } defer listener.Close() log...阅读全文

Go 执行追踪器(execution tracer)

## 概述 你有没有好奇过 Go 运行时是如何调度 goroutine 的?有没有深入研究过为什么有时候加了并发但是性能没有提高? Go 提供了执行跟踪器,可以帮助你诊断性能问题(如延迟、竞争或低并发等)、解决前面那些疑问。 Go 从 1.5 版本开始有执行跟踪器这么一个工具,原理是:监听 Go 运行时的一些特定的事件,如: 1. goroutine的创建、开始和结束。 2. 阻塞/解锁goroutine的一些事件(系统调用,channel,锁) 3. 网络I/O相关事件 4. 系统调用 5. 垃圾回收 追踪器会原原本本地收集这些信息,不做任何聚合或者抽样操作。对于负载高的应用来说,就可能会生成一个比较大的文件,该文件后面可以通过 `go tool trace` 命令来进行解析。 在执行追踪...阅读全文

博文 2018-03-21 11:31:09 polaris

书籍: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 月光独奏