热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用pprof发现内存泄漏

image.png 【译文】原文地址 Golang是一个很神奇的语言。在开发系统应用或web应用时候,建议考虑采用Golang。Golang开发者的需求持续增长也是一个很好的证明。

使用pprof发现内存泄漏
image.png

【译文】原文地址
Golang是一个很神奇的语言。在开发系统应用或web应用时候,建议考虑采用Golang。Golang开发者的需求持续增长也是一个很好的证明。

通过分析利弊我尝试了Go。我们有特定的使用场景,需要超低的构建时间,同时尽可能少使用资源。并且,我们使用微服务架构,因此可能使用不同的技术栈而不是单一的一种。

总的来说,Golang+Graphql性能挺好的。每秒能处理大量的请求。正常请求和负载不会有问题。当我们使用压测和性能测试脚本的时候问题出现了。

使用pprof发现内存泄漏

起初,我们发现应用异常是在大负载情况下。我们持续监测资源,性能测试完一段时间后,我们的服务使用了集群的大量资源(CPU和内存)。这使我们很沮丧和害怕因为没有达到我们使用GO的初衷。因此,我们分析发现问题并不是Golang语言问题,而是我们代码的bug。

下面聊聊pprof

来自pprof Github仓库 Github repo.)的简单介绍:
pprof是一个用于对收集的数据分析和可视化工具。pprof从profile.proto文件读取收集的样本数据,并生成可视化的报告便于对数据进行分析。可以生成文本和图像报告。

pprof详细文档链接。只需使用很少代码即可使用pprof。在生产环境中使用pprof也是安全的,它最大只需要5%的资源消耗。

使用pprof

使用pprof工具,生成了内存和cpu的使用统计图(下面PNG格式图片)。一眼看去很明显发现amqp_helper(队列处理文件)存在问题。我分析了代码,发现amqp连接没有关闭,导致内存占用。

使用pprof发现内存泄漏

图中框越大说明占有资源越多。

如何解决

我推荐检查pprof.go的init()函数。将有助于理解/debug/pprof路由。使用如下模版:

package main

import (  
  "net/http" 
  "net/http/pprof"
)

func main() {
  // other code
  
  // if your app is not serving on any port
  // then create a simple webserver 
  go func() {
    log.Println(http.ListenAndServe("localhost:8082", nil))
    }()
}

当你访问http://localhost:8082/debug,可以看到go提供各种资源使用统计。

使用pprof发现内存泄漏
生成图表

保持前面程序运行,执行如下命令生成图表:
1、内存统计

go tool pprof -png http://localhost:8082/debug/pprof/heap > heap.png

该命令会在当前目录生成heap.png文件。

2、CPU统计

go tool proof -png http://localhost:8082/debug/pprof/profile > profile.png

以下是一个CPU统计的图表示例。使用上述命令,你可以创建和分析不同的统计数据。

使用pprof发现内存泄漏

常见内存泄漏

1、没有正确的关闭或未关闭连接。包括数据库连接,队列连接,第三方库。
2、没有正确使用defer()函数
3、使用大字符串/切片/子序列对其做多次操作。
4、指针音乐不使用的值
5、悬挂Goroutine
6、误用Finalizer


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 使用Docker安装和运行Nexus
    本文介绍了使用Docker安装和运行Nexus的方法,包括docker-compose.yml配置和启动时可能出现的权限问题解决方法。同时提供了登录控制台验证安装的地址和登录信息。 ... [详细]
  • 熟练掌握Spring Cloud,终于成为Java工程师的面试门槛 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • Jmeter对RabbitMQ压力测试
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Jmeter对RabbitMQ压力测试相关的知识,希望对你有一定的参考价值。Jm ... [详细]
  • 无处不在,详解iOS集成第三方登录(SSO授权登录<无需密码>)
    1.前言 不多说,第三登录无处不在!必备技能,今天以新浪微博为例。这是上次写的iOS第三方社交分享:http:www.cnblogs.comqingchep3727559.html ... [详细]
author-avatar
全仕介个
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有