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

我是如何在大型代码库上使用 pprof 探索 Go 中的内存泄漏

![](https://raw.githubusercontent.com/studygolang/gctt-images/master/how-i-investigated-memory-leaks-in-go-using-pprof-on-a-large-codebase/pprof_6.png) 在今年的大部分时间里,我一直在 Orbs 团队用 Go 语言做可扩展的区块链的基础设施开发,这是令人兴奋的一年。在 2018 年的时候,我们研究我们的区块链该选择哪种语言实现。因为我们知道 Go 拥有一个良好的社区和一个非常棒的工具集,所以我们选择了 Go。 最近几周,我们进入了系统整合的最后阶段。与任何大型系统一样,可能会在后期阶段出现一些问题,包括性能问题,内存泄漏等。当整合系统时,我们找...阅读全文

博文 2019-07-27 18:40:01 watermelo

Go语言之性能分析工具pprof

一、pprof的概述:pprof:是Go的性能分析工具,在程序运行过程中,可以记录程序的运行信息,可以是CPU使用情况、内存使用情况、goroutine运行情况等,Go语言已经将pprof 封装在包net/http/pprof中。对于pprof来说主要用于:CPU分析、内存分析、阻塞分析、互斥锁分析。查看这些指标有两种方式,一种是浏览器方式,一种是命令行方式。浏览器方式:通过 http://pprofIPAddress:port/debug/pprof/ 来访问,访问之后的界面如下所示:命令行方式:基本命令:# 下载cpu profile,默认从当前开始收集30s的cpu使用情况,需要等待30sgo tool pprof http://localhost:6060/debug/pprof/p...阅读全文

博文 2020-04-16 09:10:34 ZhDavis

Golang程序诊断

简介 Go生态系统提供了一整套用于诊断Go程序中的逻辑和性能问题的API和工具。该篇文章总结了可用的工具,并帮助Go用户针对他们的特定问题选择合适的工具。 诊断解决方案可以分为以下几类: Profiling: Profiling工具分析Go程序的复杂性和成本,例如其内存使用情况和经常调用的函数,以识别Go程序的最耗费资源的部分。 Tracing: Tracing是一种工具代码,可以在调用或用户请求的整个生命周期中分析延迟。跟踪提供了每个组件对系统总体延迟造成多少延迟的概述。跟踪可以跨越多个Go进程。 Debugging: Debugging允许我们暂停Go程序并检查其执行。程序状态和流程可以通过调试来验证。 Runtime statistics and events: 运行时状态和事件的收集...阅读全文

博文 2020-02-14 12:32:42 iyacontrol

轻松入门Golang pprof实用不忽悠

网上已搜索golang pprof,资料不少,简明高效的一个没看到,这篇文章5步教你用会pprof获取cpu和内存prof。 第1步:安装易用的pprof golang自带的prof包是runtime/pprof,这个是低级别的,需要你手动做一些设置等等周边工作,不利于我们快速上手,利用pprof帮助我们解决实际的问题。这里推荐davecheney封装的pprof,它可以1行代码,让你用上pprof,专心解决自己的代码问题,下载: go get github.com/pkg/profile 第2步:安装graphviz pprof生成的prof文件时二进制的,需要把这个二进制的文件转换为我们人类可读的,graphviz可以帮助我们把二进制的prof文件转换为图像。Mac安装: brew in...阅读全文

博文 2018-11-12 18:34:44 大彬

Go:使用 pprof 收集样品数据

![](https://raw.githubusercontent.com/studygolang/gctt-images2/master/20200505-Go-Samples-Collection-with-pprof/00.png) > Illustration created for “A Journey With Go”, made from the original Go Gopher, created by Renee French. ℹ️ *本文基于 Go 1.13。* `pprof` 是用于分析诸如 CPU 或 内存分配等 profile 数据的工具。分析程序的 profile 数据需要收集运行时的数据用来在之后统计和生成画像。我们现在来研究下数据收集的工作流以及怎么样去调...阅读全文

博文 2020-05-31 14:35:50 lxbwolf

Golang 使用pprof分析性能

参考 Golang 使用pprof分析goweb的性能问题 go的pprof可以用来对服务的性能进行检测,其中net/http/pprof包用来检测web服务器的相关的性能的分析,包括goroutine的数量,heap的大小问题。 一、简单使用 package main import ( "fmt" "log" "net/http" _ "net/http/pprof" "time" ) func main() { // 开启pprof go func() { log.Println(http.ListenAndServe("localhost:6060", nil)) }() go hello() select {} } func hello() { for { go func() { f...阅读全文

博文 2019-04-02 20:34:42 懒皮

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-06-17 20:23:37 LvanNeo

【译】优化Go的模式

之前写过一篇文章《为什么SignalFx metric proxy通过Go语言开发》,这篇文章将会关注以我们的ingest服务为例,来讲述我们是如何优化Go代码的。 SingalFx基于流分析和时间报警序列,例如应用程序指标,可以为时间序列数据的现代应用开发的高级监控平台(“我的应用程序收到了多少请求?”),还有系统级指标(“我的Linux服务器使用了多少网络流量?”)。我们用户流量很大并且粒度很高,每次用户的流量都要先通过我们的ingest服务才能访问其它的SignalFx服务。 第一步:启用pprof 啥是pprof? pprof是Go语言内置的标准方法用来调试Go程序性能。可以通过HTTP的方式调用pprof包,它能提取出来应用程序的CPU和内存数据,此外还有运行的代码行数和内容信息。...阅读全文

博文 2017-02-10 15:55:38 Bryce

go trace 用来跟踪 goroutines运行情况,跟pprof配合使用,可以起到事半功倍的效果。但是,go trace 的view trace 在chrome下一片空白。

> go trace 用来跟踪 goroutines运行情况,跟pprof配合使用,可以起到事半功倍的效果。但是,go trace 的view trace 在chrome下一片空白。 原因是因为谷歌在某一版本的chrome中禁用了本地[API](crbug.com/1036492.) 解决办法: 1. 注册一个chrome token https://developers.chrome.com/origintrials/#/register_trial/2431943798780067841 资料随便填写,记得最后一定要 feedback。 2. 修改 go trace 代码 `src/cmd/trace/trace.go` 在head中添加一行 阅读全文

博文 2020-04-28 16:26:00 yixiao

pprof进行golang程序性能分析

一、导入包 import _ "net/http/pprof" 二、启动监控routine go func() { http.ListenAndServe("0.0.0.0:18080", nil)}()三、访问web服务例:分析CPU占用情况go tool pprof http://localhost:18080/debug/pprof/profile (pprof) top10 Total: 2525 samples 298 11.8% 11.8% 345 13.7% runtime.mapaccess1_fast64 268 10.6% 22.4% 2124 84.1% main.FindLoops 251 9.9% 32.4% 451 17.9% scanblock 178 7.0%...阅读全文

博文 2017-12-22 16:30:00 gm-201705

Golang 大杀器之性能剖析 PProf

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

博文 2018-09-15 21:34:42 煎鱼

golang pprof 性能分析工具

性能优化是个永恒的话题,而很多时候我们在作性能优化的时候,往往基于代码上面的直觉,把所有能想到的优化都优化了一遍,不错过任何小的优化点,结果整个代码的逻辑变得极其复杂,而性能上面并没有太大的提升。事实上,性能问题往往集中在某些小点,有时候很小的改动就能有巨大的提升,所以问题的关键是是怎么去找出这些优化点,幸运的是 golang 在设计的时候就考虑了这个问题,原生提供了性能分析的工具,可以很方便地帮我们找到性能瓶颈 pprof 简介 golang 的性能分析库在 runtime/pprof 里,主要提供下面几个接口 // 堆栈分析 func WriteHeapProfile(w io.Writer) error // cpu分析 func StartCPUProfile(w io.Writer...阅读全文

博文 2018-01-30 23:34:38 hatlonely

FlameGraph 火焰图快速指南(TiDB)

快速开始 方法1:先生成 profile 文件,再使用工具解析 生成 profile 文件 生成 profile 文件 用浏览器访问 http://{TiDBIP}:10080/debug/zip 或者 curl http://{TiDBIP}:10080/debug/zip --output tidb_debug.zip 生成的 tidb_debug.zip 包括 goroutine heap(内存) mutex profile(CPU) config version 如果只想要 cpu 的火焰图,可以使用 http://{TiDBIP}:10080/debug/pprof/profile 默认是采样10秒,如果需要修改采样时间,可以使用 ?seconds= http://{TiDBIP}...阅读全文

博文 2019-10-12 13:32:56 aside section ._1OhGeD

请教下还有优化空间吗

我的一个用go写的web服务导致负载比较高,以下是pprof的一些信息,想请问下,像这些调用从代码角度还有可以优化的空间吗? ``` (pprof) top10 9010ms of 17440ms total (51.66%) Dropped 310 nodes (cum <= 87.20ms) Showing top 10 nodes out of 185 (cum >= 230ms) flat flat% sum% cum cum% 5240ms 30.05% 30.05% 5330ms 30.56% syscall.Syscall 820ms 4.70% 34.75% 970ms 5.56% syscall.Syscall6 580ms 3.33% 38.07% 580ms 3.33%...阅读全文

博文 2018-02-23 17:11:14 woshicixide

【Go】strings.Replace 与 bytes.Replace 调优

文链接:https://blog.thinkeridea.com/... 标准库中函数大多数情况下更通用,性能并非最好的,还是不能过于迷信标准库,最近又有了新发现,strings.Replace 这个函数自身的效率已经很好了,但是在特定情况下效率并不是最好的,分享一下我如何优化的吧。 我的服务中有部分代码使用 strings.Replace 把一个固定的字符串删除或者替换成另一个字符串,它们有几个特点: 旧的字符串大于或等于新字符串 (len(old) >= len(new) 源字符串的生命周期很短,替换后就不再使用替换前的字符串 它们都比较大,往往超过 2k~4k 本博文中使用函数均在 go-extend 中,优化后的函数在 exbytes.Replace 中。 发现问题 近期使用 ppr...阅读全文

博文 2019-02-03 13:34:42 thinkeridea

PalletOne技术讲堂之golang编程经验总结

王继有 Pallet 7月5日点击上方蓝字及时获取PalletOne最新消息 讲师简介:王继有,PalletOne高级核心开发工程师,8年研发经验,精通C,C++,Go语言。具有丰富的DHCPv6、ND、RUI协议以及高性能服务器和对象存储的设计开发经验;熟悉区块链P2P网络的设计与开发。一、unsafe.Pointer类型转换[ ]byte转string var x = []byte("Hello World!") var y = *(*string)(unsafe.Pointer(&x))string转[ ]byte var a string = "hello world" var b = *(*[]byte)(unsafe.Pointer(&a))结构体和[]byte之间的互转参考:h...阅读全文

博文 2018-09-15 11:34:41 PalletOne

Go, without package scoped variables

This is a thought experiment, what would Go look like if we could no longer declare variables at the package level? What would be the impact of removing package scoped variable declarations, and what could we learn about the design of Go programs? I’m only talking about expunging var, the other five top level declarations would still be permitted a...阅读全文

博文 2017-06-15 06:28:25 Dave Cheney

以太坊客户端Geth命令用法-参数详解

Geth是在[以太坊智能合约](http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6)开发中最常用的工具(必备开发工具),一个多用途的命令行工具。 熟悉Geth可以让我们有更好的效率,大家可收藏起来作为Geth命令用法手册。 本文主要是对geth help的翻译,基于最新的geth 1.7.3-stable版本。 如果你还不知道geth是干什么的,请先阅读入门篇:[什么是以太坊?什么是智能合约?](https://blog.csdn.net/mongo_node/article/details/80491713) 以下开始正文。 ### 命令用法 **geth [选项] 命令 [命令选项] [参数…]** 版本: 1.7.3-stable ...阅读全文

博文 2018-06-14 09:35:16 hubwiz

安装TensorFlow Profiler UI

TensorFlow Profiler UI Install Python dependencies. pip install --user -r requirements.txt Install pprof. 注:安装需要首先安装Go以及Google自家的pprof工具。 Create a profile context. Start the UI. python ui.py --profile_context_path=/your path/ 通过浏览器打开网址查看UI界面 error: OSError: [Errno 2] No such file or directory 安装了pprof之后 OSError: [Errno 13] Permission denied Ubuntu系...阅读全文

博文 2018-07-03 16:34:49 土豆呀大土豆

golang pprof

基本路径:/debug/pprof/ 支持的分析类型: cpu(CPU Profiling): HOST/debug/pprof/block,查看导致阻塞同步的堆栈跟踪 goroutine:HOST/debug/pprof/heap,查看活动对象的内存分配情况 mutex(Mutex Profiling):HOST/debug/pprof/threadcreate,查看创建新OS线程的堆栈跟踪 启动 PProf 可视化界面 方法一: go tool pprof -http=:8080 cpu.prof 方法二: go tool pprof cpu.prof we...阅读全文

博文 2019-03-22 14:35:13 凯文不上班

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-30 20:00:09 yueguanyun

轻松入门Golang pprof实用不忽悠.md

网上已搜索golang pprof,资料不少,简明高效的一个没看到,这篇文章5步教你用会pprof获取cpu和内存prof。 第1步:安装易用的pprof golang自带的prof包是runtime/pprof,这个是低级别的,需要你手动做一些设置等等周边工作,不利于我们快速上手,利用pprof帮助我们解决实际的问题。这里推荐davecheney封装的pprof,它可以1行代码,让你用上pprof,专心解决自己的代码问题,下载: go get github.com/pkg/profile 第4步:安装graphviz pprof生成的prof文件时二进制的,需要把这个二进制的文件转换为我们人类可读的,graphviz可以帮助我们把二进制的prof文件转换为图像。Mac安装: brew in...阅读全文

博文 2018-11-08 00:34:41 shitaibin

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

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

博文 2017-01-07 11:00:07 mikespook

Go语言·我的性能我做主(1)

对于一些服务来说,性能是极其重要的一环,事关系统的吞吐、访问的延迟,进而影响用户的体验。 写性能测试在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-10-24 04:04:47 孙飞撩技术

记一次golang的内存泄露

程序功能 此程序的主要功能是将文件中数据导入到clickhouse数据库中。 【问题描述】 服务器内存每隔一段时间会耗尽 【问题分析】 由于使用的是go语言开发的,所以采用了业界流行的工具pprof。 参考URL:https://cizixs.com/2017/09/11/profiling-golang-program/ 工具的使用与思路: 1)先修改源代码 2)安装工具观察 3)根据工具抓取的现象进行分析 4)修复内存缺陷代码, 再根据分析结果修复内存泄漏的地方 5)发布代码进行再跟踪分析 ================================================== 1)修改代码: 使用这个工具前需要在代码中写几行代码,以便能使用这个工具的来收集数据。 1 //引...阅读全文

博文 2020-02-16 09:30:45 CtripDBA

write smart proxy step by step 3 (集群实现)

赵雷 有点长,直接看结语好了集群功能第二篇笔记只实现 Redis 协议单机转发,这次要实现完整集群功能,涉及以下几点:1. 代码逻辑模块划分: Server,集群拓扑,后端连接池,Session管理2. Pipeline 实现,对每一个请求封装 Sequence,严格保证应答顺序(实现有些投机,后文再说)3. 对后端返回的 ErrorResp 做解析,特殊处理 MOVED 和 ASK 请求并异步更新集群拓扑4. 性能,永远的话题,通过 Pprof 一步一步去调模块划分Server 层:该层用来解析生成全局配置,初始化其它模块,开启监听端口,接收外部访问请求。其中 Filter 用来对接收的 Redis 协议数据进行过滤,检测是否危险禁止或不支持的命令,并粗略检测命令参数个数,以接口形式实现。...阅读全文

博文 2017-02-10 14:30:51 董泽润

为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. 一个性能分析的工具,...阅读全文

博文 2017-10-19 03:00:01 mafeng

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

注:本文的原文 Debugging performance issues in Go programs 由 Dmitry Vyukov 在 05/10/2014 - 07:06 编写 注:原文太长,大家要看全部的请看原文,其他的部分,后续慢慢翻译。 让我们假设你想提升你的GO程序的性能。这里有一些工具可以帮助你完成这个任务。这些工具能帮助你定位多种类型的热点(CPU,IO,内存),你为了能够显著提升程序性能,你必须专注于热点发生的地方。尽管如此,另外一个结果是可能的--这些工具能帮助你确定程序中明显的性能缺陷。例如,当你在每个程序启动的时候,你可以在每次查询的之前准备一个 SQL 语句。另外一个例子是如果一个 O(N^2) 算法在某种程度上陷入了一个明显存在并且期望的 O(N) 情况。为了确...阅读全文

博文 2017-02-09 13:39:45 yexiaobai

Go 程序的性能优化及 pprof 的使用

程序的性能优化无非就是对程序占用资源的优化。对于服务器而言,最重要的两项资源莫过于 CPU 和内存。性能优化,就是在对于不影响程序数据处理能力的情况下,我们通常要求程序的 CPU 的内存占用尽量低。反过来说,也就是当程序 CPU 和内存占用不变的情况下,尽量地提高程序的数据处理能力或者说是吞吐量。 Go 的原生工具链中提供了非常多丰富的工具供开发者使用,其中包括 pprof。 对于 pprof 的使用要分成下面两部分来说。 Web 程序使用 pprof 先写一个简单的 Web 服务程序。程序在 9876 端口上接收请求。 package main import ( "bytes" "io/ioutil" "log" "math/rand" "net/http" _ "net/http/ppr...阅读全文

博文 2018-08-28 15:35:17 豆瓣奶茶

1 Go语言初探

GO语言简介 Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。发布于2009年,目前最新版本为1.12。 Go号称21世纪的c语言,着重于分布式高并发的开发场景,针对网络编程、并发编程、分布式编程而设计,这种设计理念更适应现代软件的发展趋势,你会惊讶于Go在这些场景的开发效率和运行效率之高。 Go语言的设计理念 学习并使用一门语言,首先应该了解其设计理念,理解设计理念会帮助你更好的使用它,是不是好?它是为解决什么问题设计?这样做有什么优缺点?在实际应用中加入自己的思考对你帮助会很大。下面列出其主要设计理念: 少即是多:做特定的事情只提供一种方法,并把事情做到极致; 正交性:Go的特性是正交的,协程、管道、类型系统等特性都密切配合。 并...阅读全文

博文 2019-07-05 21:32:41 GoFuncChan

crawlab的golang后端内存分析及优化-基于go pprof

1. 背景 Crawlab发布几个月以来,其中经历过多次迭代,在使用者们的积极反馈下,crawlab爬虫平台逐渐稳定,但是最近有用户报出crawlab启动一段时间后,主节点机器会出现内存占用过高的问题,一台4G内存的机器在运行crawlab后竟然能占用3.5G以上,几乎可以肯定后端服务的某个接口由于代码不规范导致内存占用,于是决定对crawlab进行一次内存分析。 2. 分析 分析内存光靠手撕代码是比较困难的,总要借助一些工具。Golang pprof是Go官方的profiling工具,非常强大,使用起来也很方便。 首先,我们在crawlab项目中嵌入如下几行代码: import _ "net/http/pprof" go func() { http.ListenAndServe("0.0....阅读全文

博文 2019-08-20 22:43:00 hantmac

【这是一道送命题】使用字符串传值居然也不会释放原始字符串的内存地址!!!

> 这个问题陆陆续续查了一周才实锤到内存泄露的点 问题的开端是这样的,以前大哥走了,我接了这个项目发现居然在内存泄露,每天要重启好几次,决定解决一下,没想到解决了一周。 项目使用了一个包叫 [gjson](https://github.com/tidwall/gjson) (链接),我们有两个缓存一个叫cache1 `gjson.Result{}`,一个叫 cache2 `map[string]string` 。cache2 的数据来源是一个 URL 每分钟更新一次使用 gjson 解析 接口返回的 json 数据,cache1 的数据来源是从 cache2 可以匹配上的数据通过 gjson 获取的字符串就放到 cache 1 map 中(当 cache1 把 cache2 键全匹配完了以后...阅读全文

博文 2018-12-13 15:31:50 DukeAnn

Go tooling in action

大胡子小哥教go youtube channel go tooling in action 主要介绍了一下命令工具,最后用profile做了个webserver的优化 Command go list -f '{{ join .Imports "\n"}}' go list -f '{{ join .Imports "\n"}}' log go doc fmt go doc fmt printf godoc -http :6060 go tool vet debug daemon test table driven test 直接发请求测试 用火焰图调优 go-wrk go tool pprof go-torch go test bench 正则表达式build一次 不用正则表达式 set h...阅读全文

博文 2018-12-01 20:34:42 yajun

golang 使用pprof和go-torch做性能分析

软件开发过程中,项目上线并不是终点。上线后,还要对程序的取样分析运行情况,并重构现有的功能,让程序执行更高效更稳写。 golang的工具包内自带pprof功能,使找出程序中占内存和CPU较多的部分功能方便了不少。加上uber的火焰图,可视化显示,让我们在分析程序时更简单明了。 pprof有两个包用来分析程序一个是net/http/pprof另一个是runtime/pprof,net/http/pprof只是对runtime/pprof包进行封装并用http暴露出来,如下图源码所示: 使用net/http/pprof分析web服务 pprof分析web项目,非常的简单只需要导入包即可。 _ "net/http/pprof" 编写一个小的web服务器 package main import ( ...阅读全文

博文 2018-08-06 15:30:01 li-peng

最常用的调试 golang 的 bug 以及性能问题的实践方法?

场景1: 如何分析程序的运行时间与CPU利用率情况? (1) shell内置time指令 这个方法不算新颖,但是确很实用。 time是Unix/Linux内置多命令,使用时一般不用传过多参数,直接跟上需要调试多程序即可。 $ time go run test2.go &{{0 0} 张三 0} real 0m0.843s user 0m0.216s sys 0m0.389s 上面是使用time对 go run test2.go对执行程序坐了性能分析,得到3个指标。 real:从程序开始到结束,实际度过的时间; user:程序在用户态度过的时间; sys:程序在内核态度过的时间。 一般情况下 real >= user + sys,因为系统还有其它进程(切换其他进程中间对于本进程回有空白期)。 ...阅读全文

博文 2020-03-10 12:32:47 aceld

Debugging performance issues in Go programs

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

博文 2016-09-02 17:00:02 secretx

golang 性能测试pprof

golang 性能测试包是位于 net/http 包下的 pprof,其相关介绍可以参看具体的 官方文档 有关 golang 性能测试使用特别简单,在 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 查看堆栈 输入 web 命令后会自动弹出网页展示对应的 svg 图...阅读全文

博文 2017-10-10 01:30:01 liang1101

Operability in Go

Liveblog by Beyang Liu (@beyang) Update: slides for this talk have been posted here. Improving operations in Go programs Ian Schenck, software engineer, Infrastructure at Oscar Insurance (ian.schenck@gmail.com). “I am a SWE who ends up in SRE.” Ian tries to write operable code. In other words, he assumes it’s going to break at some point and tries ...阅读全文

博文 2017-07-22 05:31:05 Ian Schenck

消息队列 NSQ 源码学习笔记 (一)

> **nsqlookupd** 用于Topic, Channel, Node 三类信息的一致性分发 # 概要 ## nsqlookup 知识点总结 - 功能定位 - 为node 节点和客户端节点提供一致的topic, channel, node 查询服务 - **Topic** 主题, 和大部分消息队列的含义一致, 消息处理时,将相同主题的数据会归为一类消息 - **channel**,可以理解为 topic 的一份数据拷贝,一个或者多个消费者对接一个channel。 - **node** nsqd 启动的一个实例 - 一个channel会放置在某一个node 节点上,一个topic 下可以有多个channel. - **HTTP 接口** 用于客户端服务发现以及admin 的交户使用 -...阅读全文

博文 2020-04-09 11:05:33 lpflpf

Golang 大杀器之跟踪剖析 trace

在 Go 中有许许多多的分析工具,在之前我有写过一篇 《Golang 大杀器之性能剖析 PProf》 来介绍 PProf,如果有小伙伴感兴趣可以去我博客看看。 但单单使用 PProf 有时候不一定足够完整,因为在真实的程序中还包含许多的隐藏动作,例如 Goroutine 在执行时会做哪些操作?执行/阻塞了多长时间?在什么时候阻止?在哪里被阻止的?谁又锁/解锁了它们?GC 是怎么影响到 Goroutine 的执行的?这些东西用 PProf 是很难分析出来的,但如果你又想知道上述的答案的话,你可以用本文的主角 go tool trace 来打开新世界的大门。目录如下: 初步了解 import ( "os" "runtime/trace" ) func main() { trace.Start(o...阅读全文

博文 2019-07-12 20:02:38 煎鱼

Golang踩坑分析

同步至 https://segmentfault.com/a/1190000020103403 案例1:Golang内存泄露 ## 影响情况## 服务A内存泄露,造成服务器内存不足,系统运行的服务A 因为OOM 被强制KILL 掉、导致任务丢失 ##分析思路## Golang 编写的服务遇到OOM情况如何分析处理那?首先我们利用golang 自带的pprof来分析。在main.go中 增加` go func() { if err := http.ListenAndServe("0.0.0.0:12345", nil); err != nil { log.Println(err) } }()` 然后再结合火焰图 去分析<以下是两张火焰图> 图1 image [图片上传失败...(image-d...阅读全文

博文 2019-08-19 20:02:46 ddu_sw

profile.go

// Package profile provides a simple way to manage runtime/pprof// profiling of your Go application.package profileimport ( "io/ioutil" "log" "os" "os/signal" "path/filepath" "runtime" "runtime/pprof" "sync/atomic")const ( cpuMode = iota memMode blockMode traceMode)// Profile represents an active profiling session.type Profile struct { // quiet sup...阅读全文

博文 2017-09-07 16:30:06 zhangboyu

go-pprof笔记

开篇 编写好了golang服务之后,接着要开始关注服务的CPU,内存使用情况。golang提供了性能剖析工具,记录一些自己搜集到的信息,写下一些实践的情况。在golang中内置了pprof工具,专门来做golang语言的优化。 PProf 关注的模块 CPU profile:报告程序的 CPU 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据 Memory Profile(Heap Profile):报告程序的内存使用情况 Block Profiling:报告 goroutines 不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈 Goroutine Profiling:报告 goroutines 的使用情况,有哪些 goroutine,它们的调用关系是怎样的 尝试 在...阅读全文

博文 2020-02-08 21:32:44 阿彪2020

golang 单元测试与性能分析 入门篇

平时我们写了的一些方法,想测试时一般在main包中的main函数中去调用我们写好的函数,这样测试不是很专业。golang自带test工具非常好用,我们可以手动写测试代码,也可以在ide中使用快捷键先创建,我们使用下面的例子来说一下 代码测试,性能压测,性能分析等。 **例子 demo.go** ```golang package demo import "time" //字符串长度 func strCount(str string) int { var l int l = len([]rune(str)) return l } //计算函数 func algorithm(a int,b int) int { time.Sleep(time.Millisecond*100) return a+...阅读全文

博文 2020-01-31 21:03:57 duzhenxun