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

golang profile用法

载自:http://www.jianshu.com/p/162f44022eb7 概要 profile就是定时采样,收集cpu,内存等信息,进而给出性能优化指导,golang 官方提供了golang自己的性能分析工具的用法,也给出了指导,官方的介绍 环境 golang环境, graphviz 生成profile方法 golang目前提供了3中profile,分别是 cpu profile, memery profile, blocking profile, 对于如何生成这些profile有两种办法,一种是使用 net/http/pprof 包,一种是需要自己手写代码,下面分别介绍一下 1. net/http/pprof 方法 这种方法是非常非常简单的,只需要引入 net/http/pprof...阅读全文

博文 2017-12-18 23:00:01 reve-wang

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-04 19:27:03 siddontang

write smart proxy step by step 2 (单节点转发)

胡歌 写在前面根据第一篇理论内容,本文基于 Redis Client Protocol 实现最精简的单机转发版本。不包含连接池,网络超时,命令检测,集群,性能统计和服务注册等功能。Archer该版本 Proxy 命名为 Archer, 意为弓箭手,熟悉 War3 的老玩家肯定知道,三本弓手很厉害。后续的开发也都是基于这个版本,代码大家感兴趣可自行下载。https://github.com/dongzerun/archer数据结构 For Simple Strings the first byte of the reply is "+" For Errors the first byte of the reply is "-" For Integers the first byte of th...阅读全文

博文 2017-02-10 14:43:08 董泽润

Golang编程经验

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秒, 不同浏览器不一样; Ng...阅读全文

博文 2016-08-06 11:00:02 yueguanyun

Go 语言的分布式读写互斥

Go语言默认的sync.RWMutex实现在多核环境中表现并不佳,因为所有的读者在进行原子增量操作时,会抢占相同的内存地址。该文探讨了一种n-way RWMutex,也可以称为“大读者(big reader)”锁,它可以为每个CPU内核分配独立的RWMutex。读者仅需在其核心中处理读锁,而写者则须依次处理所有锁。 查找当前CPU 读者使用CPUID指令来决定使用何种锁,该指令仅需返回当前活动CPU的APICID,而不需要发出系统调用指令抑或改变运行时。这在Intel或AMD处理器上均是可以的;ARM处理器则需要使用CPU ID寄存器。对于超过256个处理器的系统,必须使用x2APIC,另外除了CPUID还要用到带有EAX=0xb的EDX寄存器。程序启动时,会构建(通过CPU亲和力系统调用)...阅读全文

博文 2015-05-12 23:00:01 u012275397

Go 垃圾回收:第二部分 - GC 追踪

## 前言 这是三篇系列文章中的第二篇,该系列文章将会提供一个对 Go 垃圾回收器背后的机制和概念的理解。本篇主要介绍如何生成 GC 追踪并解释它们。 三篇系列文章的索引: 1)[Go 垃圾回收:第一部分 - 概念](https://studygolang.com/articles/21569) 2)[Go 垃圾回收:第二部分 - GC 追踪](https://studygolang.com/articles/21570) 3)即将发布 ## 介绍 在第一篇文章中,我花了一些时间描述了垃圾回收器的行为并且展示了它对正在运行的应用造成的延迟。我还分享了如何去生成并且解释 GC 追踪,展示了堆中的内存是如何变化的,并且解释了 GC 的不同阶段以及它们是如何影响延迟成本的。 那篇文章得出的最后结论...阅读全文

博文 2019-07-01 10:14:51 polaris

SRE: 调试 Go 中简单的内存泄漏

[内存泄漏](https://en.wikipedia.org/wiki/Memory_leak) 是一种即使当某块内存不再使用之后仍然没有被释放而产生的 bug。通常来说,它们是非常明显的,高度可见的,这使得它们成为学习程序调试的最佳选择。Go 是一门特别适合识别定位内存泄漏的语言,因为它有一套强大的工具链,这套工具链配备了非常强大的工具(*pprof*),它可以非常轻松地查明内存的使用情况。 我希望这篇文章能够演示如何直观地识别内存,并将其使用范围缩小至特定的进程内,将进程的泄漏与我们的工作关联起来,最后使用 *pprof* 工具找到内存泄漏的根源。设计这篇博客文章的初衷是为了简单地识别产生内存泄漏的根本原因。我们对 *pprof* 工具只做简单的功能介绍,不会对其做详细功能的描述。 [...阅读全文

博文 2019-01-17 22:29:54 barryz

gops —— Go 程序诊断分析工具

GitHub: https://github.com/google/gops一个用于列出和诊断分析系统中正在运行的 Go 程序的命令行工具 安装 go get -u github.com/google/gops 命令帮助 执行 gops help 查看帮助文档: gops is a tool to list and diagnose Go processes. gops ... gops # displays process info Commands: stack Prints the stack trace. gc Runs the garbage collector and blocks until successful. setgc Se...阅读全文

博文 2018-10-18 15:34:44 舆图易稿

golang pprof 实战

目录 前言 实验准备 获取“炸弹” 使用 pprof 排查 CPU 占用过高 排查内存占用过高 排查频繁内存回收 排查协程泄露 排查锁的争用 排查阻塞操作 思考题 最后 前言 如果要说在 golang 开发过程进行性能调优,pprof 一定是一个大杀器般的工具。但在网上找到的教程都偏向简略,难寻真的能应用于实战的教程。这也无可厚非,毕竟 pprof 是当程序占用资源异常时才需要启用的工具,而我相信大家的编码水平和排场问题的能力是足够高的,一般不会写出性能极度堪忧的程序,且即使发现有一些资源异常占用,也会通过排查代码快速定位,这也导致 pprof 需要上战场的机会少之又少。即使大家有心想学习使用 pprof,却也常常相忘于江湖。 既然如此,那我就送大家一个性能极度堪忧的“炸弹”程序吧! 这程序...阅读全文

博文 2019-08-04 20:08:41 Wolfogre's Blog

graphviz 安装及golang profile简单用例

安装brew install graphvizCheck安装 ccli@ccli-mac:perftest$ dot -h Error: dot: option -h unrecognized Usage: dot [-Vv?] [-(GNE)name=val] [-(KTlso)] (additional options for neato) [-x] [-n] (additional options for fdp) [-L(gO)] [-L(nUCT)] (additional options for memtest) [-m] (additional options for config) [-cv] -V - Print version and e...阅读全文

博文 2019-05-16 20:34:46 cli1871

Go的pprof使用

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服务的状态,包括CPU占用情况和内存使用情况等。具体使用情况你可以看godoc的说明。 服务进程 如果你的go程序不是web服务器,而是一个服务...阅读全文

博文 2016-07-04 15:00:01 davygeek

Docker源码分析(五):Docker Server的创建

【编者按】在《深入浅出Docker》系列文章的基础上,InfoQ推出了《Docker源码分析》系列文章。《深入浅出Docker》系列文章更多的是从使用角度出发,帮助读者了解Docker的来龙去脉,而《Docker源码分析》系列文章通过分析解读Docker源码,来让读者了解Docker的内部实现,以更好的使用Docker。总之,我们的目标是促进Docker在国内的发展以及传播。另外,欢迎加入InfoQ Docker技术交流群,QQ群号:272489193。 1.Docker Server简介 Docker架构中,Docker Server是Docker Daemon的重要组成部分。Docker Server最主要的功能是:接受用户通过Docker Client发送的请求,并按照相应的路由规则实...阅读全文

博文 2015-03-29 20:00:36 孙宏亮

[Golang]记一次Goroutine泄露问题的排查

image 问题描述 之前组内一个线上服务的内存使用率稳定上扬, 查看监控,发现内存的使用趋势如下图,这种趋势是典型的内存泄露,不解决的话服务会OOM。 image 问题定位 于是尝试用pprof定位问题,俗话说:Go里面10次内存泄露9次是goroutine泄露。这次也不例外, 系统的内存泄露是由类似下面的代码引起的: package main import ( "fmt" "net/http" "sync" _ "net/http/pprof" ) func bug(_ http.ResponseWriter, _ *http.Request) { taskChan := make(chan int, 100) for i := 0; i < 100; i++ { taskChan <-...阅读全文

博文 2020-05-04 19:32:45 一根薯条

Go语言项目(kingshard)性能优化实例剖析

kingshard性能优化网络篇 最近kingshard的功能开发节奏慢了许多。一方面是工作确实比较忙,另一方面是我觉得kingshard的功能已经比较完善了,下一步的开发重点应该是性能优化。毕竟作为一个MySQL proxy,如果转发SQL的性能很差,再多的功能都无济于事。所以这个周末一直宅在家里优化kingshard的转发性能。经过两天的探索发现,将kingshard的转发SQL性能提升了18%左右,在这个过程中学到了一下知识。借此机会分享一下,同时也是督促一下自己写博客的积极性。:) 1. 发现kingshard的性能瓶颈 首选,对kingshard进行性能优化,我们必须要找到kingshard的性能瓶颈在哪里。Go语言在性能优化支持方面做的非常好,借助于go语言的pprof工具,我们...阅读全文

博文 2017-02-09 14:19:13 flike

20.性能优化

在计算机性能调试领域里,profiling 是指对应用程序的画像,画像就是应用程序使用 CPU 和内存的情况。 Go语言是一个对性能特别看重的语言,因此语言中自带了 profiling 的库,这篇文章就要讲解怎么在 golang 中做 profiling。 Go性能优化 Go语言项目中的性能优化主要有以下几个方面: CPU profile:报告程序的 CPU 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据 Memory Profile(Heap Profile):报告程序的内存使用情况 Block Profiling:报告 goroutines 不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈 Goroutine Profiling:报告 goroutines 的使用...阅读全文

博文 2020-04-30 21:32:54 雪上霜

golang context初探

什么是context 从go1.7开始,golang.org/x/net/context包正式作为context包进入了标准库。那么,这个包到底是做什么的呢?根据官方的文档说明: Package context defines the Context type, which carries deadlines, cancelation signals, and other request-scoped values across API boundaries and between processes. 也就是说,通过context,我们可以方便地对同一个请求所产生地goroutine进行约束管理,可以设定超时、deadline,甚至是取消这个请求相关的所有goroutine。形象地说,假如...阅读全文

博文 2017-02-24 07:54:01 天唯

优化 Golang 服务来减少 40% 以上的 CPU

十年前,谷歌正在面临一个由 C++ 编译时间过长所造成的严重瓶颈,并且需要一个全新的方式来解决这个问题。谷歌的工程师们通过创造了一种新的被称作 Go (又名 Golang)的语言来应对挑战。这个新语言 Go 带来了 C++ 最好的部分(最主要的是它的性能和稳定性),又与 Python 的速度相结合,使得 Go 能够在实现并发的同时快速地使用多核心。 在 Coralogix(译者注:一个提供全面日志分析的服务产品,[官网](https://coralogix.com/)),我们为了去给我们的客户提供关于他们日志实时的分析、警报和元数据,要去解析他们的日志。在解析阶段,我们需要非常快速地解析包含多个复杂规则的服务日志,这个目标是促使我们决定使用 Golang 的原因之一。 这项新的服务现在就全天...阅读全文

博文 2020-03-23 21:08:13 shiluo

Golang 大杀器之性能剖析 PProf

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

博文 2019-06-08 23:35:38 EDDYCJY

gf框架之服务性能分析 - 可供选择的pprof特性

文章来源:http://gf.johng.cn/592298 ghttp包提供了非常强大和简便的服务性能分析功能,内部完美集成了pprof性能分析工具,可以在任何时候通过EnablePprof方法启用性能分析特性,并可自定义性能分析工具页面路由地址,不传递路由地址时,默认URI地址为/debug/pprof。 我们来看一个简单的例子: package main import ( "gitee.com/johng/gf/g/net/ghttp" ) func main() { s := ghttp.GetServer() s.EnablePprof() s.BindHandler("/", func(r *ghttp.Request){ r.Response.Writeln("哈喽世界!") ...阅读全文

博文 2018-04-18 23:34:38 John

Go语言开发(八)、Go语言程序测试与性能调优

Go语言开发(八)、Go语言程序测试与性能调优 一、Go语言自动化测试框架简介 1、自动化测试框架简介 go语言标准包的testing提供了单元测试(功能性测试)和性能测试(压力测试)常用方法的框架,可以非常方便地利用其进行自动化测试。go语言测试代码只需要放到以 _test.go 结尾的文件中即可。golang的测试分为单元测试和性能测试,单元测试的测试用例必须以Test开头,其后的函数名不能以小写字母开头;性能测试必须以Benchmark开头,其后的函数名不能以小写字母开头。为了测试方法和被测试方法的可读性,一般Test或Benchmark后为被测试方法的函数名。测试代码通常与测试对象文件在同一目录下。 2、单元测试 Go语言单元测试的测试用例必须以Test开头,其后的函数名不能以小写字...阅读全文

博文 2018-07-02 21:35:14 天山老妖S

一次golang程序无故频繁重启的问题

1. 错误日志 监控日志 程序启动时会打印进程号,同时有系统signal信号捕捉程序,会将程序退出的所有能捕捉的信号都捕捉并打印,然后退出。 1.1不能被捕捉的信号 SIGKILL 9 Term 无条件结束程序(不能被捕获、阻塞或忽略) SIGSTOP 17,19,23 Stop 停止进程(不能被捕获、阻塞或忽略) 第一个就是我们常见的kill -9 pid 2. 排查方式 1.1 查看日志 日志中加入了捕捉信号量的程序,会将程序退出的所有能捕捉的信号都捕捉并打印,然后退出 // for build -ldflags var ( // explain for more details: https://colobu.com/2015/10/09/Linux-Signals/ // Signa...阅读全文

博文 2020-03-06 23:32:47 天地一小儒

golang 定位和优化GC问题 case(一)

背景: 读取一个500w行的大文件,将每一行的数据读取出来做数据整合归并之后,再按照一定的逻辑和算法进行处理后存入redis。 文件格式: url地址 用户32位标识 点击次数 http://jingpin.pgc.panda.tv/hd/xiaopianpian.html aaaaaaaaaaaaaaaaaaaa 5 具体场景: 本节先看一下大文件处理最简单的情况,即在读文件的过程中针对文件每一行都开启一个协程来做数据合并,看看这种情况下的定位以及优化的思路。 问题现象: 如果将整个文件串行执行来做数据整合的话,只需要4 or 5s就可以完成,但是每行并发处理却需要几十秒到几十分钟不等。 代码如下: simple.go package main import ( "bufio" "fmt"...阅读全文

博文 2018-01-19 23:33:03 ssdut_buster

检查内存泄漏在runtime.systemstack是怎么回事?

程序给一定压力跑稳定性3天,发现物理内存呈现坡度增长,平均1天10M左右。使用pprof工具检测如下:Type: inuse_spaceTime: Apr 8, 2019 at 5:27pm (CST)Entering interactive mode (type "help" for commands, "o" for options)(pprof) topShowing nodes accounting for 22170kB, 100% of 22170kB totalShowing top 10 nodes out of 36 flat flat% sum% cum cum%14336.66kB 64.67% 64.67% 14848.84kB 66.98% runtime.syst...阅读全文

博文 2019-04-08 17:39:00 jmxu11

pprof 交互模式执行web 命令提示Parallels Desktop was not found 解决方法

今天研究了下go tool pprof 工具的使用。使用过程中遇到了一个邪门的问题,就是在pprof交互模式下,运行web会提示Parallels Desktop was not found . 以为是安装parallels导致的,把其卸载了,结果再运行web命令用文件编辑器打开的。郁闷。方向搞错了。 问题原因很简单,是因为我的mac系统 svg格式文件的打开方式有问题,咋解决。找一个svg的文件,右键打开方式选择成你想要 的,然后再右键文件,点显示简介,打开后可以看到打开方式 ,有一个全部更改按钮点一下就行了。 ![image.png](https://static.studygolang.com/190116/333019ca3caa5b5e375621519dc5b16a.png) 然...阅读全文

博文 2019-01-16 18:38:55 my_onion

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

博文 2017-07-27 14:03:22 徐学良

golang pprof 使用

golang pprof 使用 2013-11-16 19:58 712人阅读 评论(0) 收藏 举报 目录(?)[+] 转自: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",然后...阅读全文

博文 2015-06-17 20:03:58 susubuhui

通过 profiling 定位 golang 性能问题 - 内存篇

桔妹导读:线上性能问题的定位和优化是程序员进阶的必经之路,定位问题的方式有多种多样,常见的有观察线程栈、排查日志和做性能分析。性能分析(profile)作为定位性能问题的大杀器,它可以收集程序执行过程中的具体事件,并且对程序进行抽样统计,从而能更精准的定位问题。本文会以 go 语言的 pprof 工具为例,分享两个线上性能故障排查过程,希望能通过本文使大家对性能分析有更深入的理解。在遇到线上的性能问题时,面对几百个接口、成吨的日志,如何定位具体是哪里的代码导致的问题呢?这篇文章会分享一下 profiling 这个定位性能问题的利器,内容主要有:如何通过做 profiling 来精准定位故障源头两个工作中通过 profiling 解决性能问题的实际例子总结在做 profiling 时如何通过一...阅读全文

博文 2019-08-03 16:38:07 滴滴技术

为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-12-11 12:00:31 chenbaoke

使用 Flamegraphs 对 Go 程序进行性能分析

2018 年 2 月 28 日 应用的性能问题生来就是无法预料的 —— 而且他们总是在最坏的时间露头。让情况更糟的是,很多性能分析工具都是冷冰冰的,复杂难懂的,用起来彻头彻尾令人困惑的 —— 来自于 `valgrind` 和 `gdp` 这样最受推崇的性能分析工具的用户体验。 `Flamegraphs` 是由 linux 性能分析大师 Brendan Gegg 创造的一个工具,在一般的 linux 性能追踪 dump 之上生成一个 SVG 可视化层 ,给定位和解决性能问题这个复杂的过程带来了一些“温暖”。在这篇文章中,我们会一步一步地用 `flamegraphs` 对一个简单的 golang 写的 web 应用进行性能分析。 ## 开始之前的一些题外话 只有当你知道自己的程序有性能问题时,才...阅读全文

博文 2018-07-10 22:44:59 krystollia

golang 性能优化之 bitset 代替 hashset

hashset 是一种非常高效的数据结构,插入和查询的复杂度都是 O(1),基本上能满足大部分场景的性能需求,但在一些特殊的场景下,频次非常高的调用依然会成为性能瓶颈(用 pprof 分析),比如广告里面的定向逻辑,在一次请求中过滤逻辑可能会执行上千次,而其中有些过滤刚好都是一些枚举值,比如性别定向,年龄定向等等,对于这种可以用枚举表示的值可以用 bitset 优化,能有20多倍的性能提升 bitset 的本质也是一种 hashset,只不过哈希桶用一个 uint64 来表示了,uint64 中的每一位用来代表一个元素是否存在,如果为1表示存在,为0表示不存在,而插入和查询操作就变成了位运算 bitset 实现 bitset 的实现比较容易,下面这个是一个只支持枚举值不超过64的版本,当然也...阅读全文

博文 2018-04-12 17:34:47 hatlonely

[译] Go 代码诊断工具集合-官方文档

Introduction Profiling Tracing Debugging Runtime statistics and events Execution tracer GODEBUG Introduction Go生态系统提供了大量API和工具来诊断Go程序中的逻辑和性能问题。 此页面总结了可用的工具,并帮助Go用户针对他们的特定问题选择正确的工具。 诊断解决方案可分为以下几组: Profiling:Profiling 工具分析Go程序的复杂性和成本,例如其内存使用情况和频繁调用的函数,以识别Go程序的昂贵部分。 Tracing:Tracing 是一种检测代码的方法,用于分析调用或用户请求的整个生命周期中的延迟。 Traces 提供了每个组件对系统总体延迟影响的概览。 Traces ...阅读全文

博文 2019-07-28 21:54:58 cyningsun

请大家帮忙看一个内存泄露的问题

我的一个线上程序,出现内存泄露问题,运行3-5天后内存居高不下,远超出该程序本应该占用的内存,我把出问题的这段代码贴出来,请大家帮忙看一下问题所在 在程序运行一段时间后,我使用go pprof查看goroutine和heap使用情况,发现heap异常: heap profile: 15926: 918443936 [252871: 990891280] @ heap/1048576...阅读全文

SRE: 性能分析: 一个 Go 编写的简单 HTTP Web 服务器的优化方法

​性能分析和调优是一种很强大的技术,用来验证是否满足客户关注的性能要求。性能分析常常被用来分析一个程序将大部分时间花在哪里了,并通过一个科学的方法来测试调优实践的效果。这个帖子使用一个 Go 语言编写的 HTTP 服务作为一个例子来定义一种性能分析和调优的普遍方法。go 特别适合性能分析和调优,因为它在它的标准库中提供了 [pprof](https://golang.org/pkg/runtime/pprof/) 剖析工具链。 ## 策略 我们先尝试建立一个简单的框架来构建对程序的分析。我们将要尝试做的是使用数据引导我们得出结论,而不是基于直觉或者预感做出决定。为此我们将要: - 确定我们要优化的维度(要求) - 创建一个测试代码(harness)将事务负载到这个系统上 - 执行一个测试——...阅读全文

博文 2019-01-02 19:43:16 daliny

golang交叉编译

本地开发环境是os x 服务器是linux,所以需要编译linux用的go程序,方法如下: 各平台的GOOS和GOARCH参考 OS ARCH OS versionv linux 386 / amd64 / arm >= Linux 2.6 darwin 386 / amd64 OS X (Snow Leopard + Lion) freebsd 386 / amd64 >= FreeBSD 7 windows 386 / amd64 >= Windows 2000 $ cd /usr/local/go/src $ sudo CGO_ENABLED=0 GOOS=linux GOARCH=amd64 ./make.bash 这里并不是重新编译Go,因为安装Go的时候,只是编译了本地系统需要的...阅读全文

博文 2016-07-05 05:00:09 weidao

golang性能优化之bitset代替hashset

hashset 是一种非常高效的数据结构,插入和查询的复杂度都是 O(1),基本上能满足大部分场景的性能需求,但在一些特殊的场景下,频次非常高的调用依然会成为性能瓶颈(用 pprof 分析),比如广告里面的定向逻辑,在一次请求中过滤逻辑可能会执行上千次,而其中有些过滤刚好都是一些枚举值,比如性别定向,年龄定向等等,对于这种可以用枚举表示的值可以用 bitset 优化,能有20多倍的性能提升 bitset 的本质也是一种 hashset,只不过哈希桶用一个 uint64 来表示了,uint64 中的每一位用来代表一个元素是否存在,如果为1表示存在,为0表示不存在,而插入和查询操作就变成了位运算 bitset 实现 bitset 的实现比较容易,下面这个是一个只支持枚举值不超过64的版本,当然也...阅读全文

博文 2018-11-09 17:34:58 Chole121

pprof性能分析

## pprof性能分析 golang在语言层面集成了profile采样工具,在程序运行过程中可以获取cpu、heap、block、traces等执行信息 获取profile数据的两种形式:web形式与profile文件生成形式. ### web方式 引入 “net/http/pprof"包,并在主函数中添加一下代码 `http.ListenAndServe(":8080", nil)` 其中,net/http/pprof包的init函数中注册了debug/pprof/路由到http服务中,用浏览器打开http://localhost:8080/debug/pprof/,即可使用pprof提供的功能。 #### 整体信息 http://127.0.0.1:8080/debug/pprof 查...阅读全文

博文 2019-12-10 19:05:11 bytemode

[译] 我是如何在大型代码库上使用 pprof 调查 Go 中的内存泄漏

文地址:How I investigated memory leaks in Go using pprof on a large codebase 译文地址:github.com/watermelo/d… 译者:咔叽咔叽 译者水平有限,如有翻译或理解谬误,烦请帮忙指出 在今年的大部分时间里,我一直在 Orbs 团队用 Go 语言做可扩展的区块链的基础设施开发,这是令人兴奋的一年。在 2018 年的时候,我们研究我们的区块链该选择哪种语言实现。因为我们知道 Go 拥有一个良好的社区和一个非常棒的工具集,所以我们选择了 Go。 最近几周,我们进入了系统整合的最后阶段。与任何大型系统一样,可能会在后期阶段出现一些问题,包括性能问题,内存泄漏等。当整合系统时,我们找到了一个不错的方法。在本文中,我将...阅读全文

博文 2019-05-22 18:17:14 掘金

go语言检查内存泄露2

(pprof) top Total: 53.0 MB 29.5 55.7% 55.7% 29.5 55.7% reflect.unsafe_NewArray 20.0 37.7% 93.4% 20.0 37.7% encoding/json.(*decodeState).literalStore 2.5 4.7% 98.1% 2.5 4.7% reflect.unsafe_New 0.5 0.9% 99.1% 0.5 0.9% encoding/json.(*Decoder).readValue 0.5 0.9% 100.0% 0.5 0.9% github.com/go-sql-driver/mysql.init路2 (pprof) ^C[dog@s3 twitter]$ go tool ...阅读全文

博文 2015-06-17 23:02:42 u013834131

【Go】优雅的读取http请求或响应的数据

文链接:https://blog.thinkeridea.com/... 从 http.Request.Body 或 http.Response.Body 中读取数据方法或许很多,标准库中大多数使用 ioutil.ReadAll 方法一次读取所有数据,如果是 json 格式的数据还可以使用 json.NewDecoder 从 io.Reader 创建一个解析器,假使使用 pprof 来分析程序总是会发现 bytes.makeSlice 分配了大量内存,且总是排行第一,今天就这个问题来说一下如何高效优雅的读取 http 中的数据。 背景介绍 我们有许多 api 服务,全部采用 json 数据格式,请求体就是整个 json 字符串,当一个请求到服务端会经过一些业务处理,然后再请求后面更多的服务,...阅读全文

博文 2019-01-26 20:34:41 thinkeridea

Golang 性能测试 (2) 性能分析

本文介绍 golang 如何做性能分析。 对服务做了基准性能测试后,如果服务出现问题,可以通过性能分析工具,查出消耗资源的瓶颈,并做针对性的性能优化。 Golang 语言也为我们提供了方便的性能分析工具pprof,方便我们做必要的服务优化。pprof 可以做cpu分析,统计所有调用方法执行的时间片(通过采样); 可以查看内存分配,找到是否有内存泄漏,哪里泄露了(调用栈);还可以查看Block、事件调用,互斥锁等。可谓麻雀虽小,五脏俱全。Golang 提供了两种分析的工具,一种是web工具,直接引入即可;另一种是命令行交互工具,需要抓取prof 数据,再做详细分析。 WEB 工具 golang 性能分析工具主要有几种,最常用的是使用web 界面的工具。我们举个简单的例子,将一个map数据做编码...阅读全文

博文 2020-04-17 10:33:07 搬砖程序员带你飞

【golang】调优工具 pprof

CPU Profiling Golang 提供了 pprof 包(runtime/pprof)用于输出运行时的 profiling 数据,这些数据可以被 pprof 工具(或者 go tool pprof,其为 pprof 的变种)使用。通常我们这样来使用 pprof 包: // 定义 flag cpuprofile var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file") func main() { flag.Parse() // 如果命令行设置了 cpuprofile if *cpuprofile != "" { // 根据命令行指定文件名创建 profile 文件 f, err := os.C...阅读全文

博文 2017-10-27 13:01:33 zhonglinzhang

golang context

package main import ( "context" "fmt" "net/http" _ "net/http/pprof" "time" ) func main() { go http.ListenAndServe(":8080", nil) ctx, _ := context.WithTimeout(context.Background(), (10 * time.Second)) go testA(ctx) select {} } func testA(ctx context.Context) { ctxA, _ := context.WithTimeout(ctx, (1 * time.Second)) ch := make(chan int) go testB(ctxA,...阅读全文

博文 2017-12-07 11:04:40 卢春风

Golang包——pprof

概述 pprof 是用于可视化和分析性能分析数据的工具 CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置 Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏 Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置 Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况 web界面查看 http://127.0.0.1:8080/debug/pprof/ cpu(CPU Profiling): HOST/debug/pprof/profile,默...阅读全文

博文 2019-04-03 00:34:38 羊羽share

Go 程序性能分析 101

过早优化是万恶之源。 前言 本文来自 GopherCon 2019 的一个演讲,首先从一个计算文本字数的 go 程序与 wc 对比,通过 profile CPU 与内存逐步优化性能,涉及 Go 的并发模型及逃逸分析。然后由一个绘制曼德勃罗分形图的程序,讨论并发程序的执行追踪(trace)及并发程序能带来的性能提升的边界。 pprof & trace Go 内置的生态提供了大量的 API 及工具用于诊断程序的逻辑及性能问题。它们大致可以被分为以下几类: Profiling:Profiling 工具(如 pprof)用于分析程序中的复杂度与开销,如内存使用及函数调用频率等,并通过它们来标识程序中开销最大的部分。 Tracing:Tracing 用于分析某次调用或用户请求的整个流程中的延迟。其支持...阅读全文

博文 2020-01-26 18:34:34 F1renze

请教pprof 内存 heap 和 threadcreate的疑问

浏览器打开 /debug/pprof/ ![QQ截图20170714103040.jpg](http://studygolang.qiniudn.com/170714/3aae3c803c96074705cf8d0d7ad183e0.jpg) 这个heap 显示的 4073 这个数值具体有什么意义,单位是什么,代表了什么? 点这个 heap 连接,进去之后 ![10.jpg](http://studygolang.qiniudn.com/170714/3d1b60e6d99e1858d1e5554b8a8bf836.jpg) 尝试把4073 和这里面的数值对上,没对上 这张图里面的数值 1: 57344 大概了解到 57344 代表1个objects 占用...阅读全文

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

博文 2017-02-09 13:42:05 yexiaobai

使用 pprof 和 Flame-Graph 调试 Golang 应用

前言 最近用 Golang 实现了一个日志搜集上报程序(内部称 logger 项目),线上灰度测试过程发现 logger 占用 CPU 非常高(80% - 100%)。而此项目之前就在线上使用,用于消费 NSQ 任务, CPU 占用一直在 1%,最近的修改只是添加了基于磁盘队列的生产者消费者服务,生产者使用 go-gin 实现了一个 httpserver,接收数据后写入磁盘队列;消费者为单个 goroutine 循环 POST 数据。而 httpserver 压力不大(小于 100 QPS),不至于占用如此高的 CPU,大致 review 代码后未发现异常,借助 pprof 和 flame-graph 来分析定位问题。 pprof pprof 我理解是 program profile(即程序...阅读全文

博文 2018-01-22 20:20:00 anyfeel

Golang 大杀器之性能剖析 PProf

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

博文 2018-09-23 01:33:15 煎鱼