热门标签 | 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


推荐阅读
  • 本文探讨了Flutter和Angular这两个流行框架的主要区别,包括它们的设计理念、适用场景及技术实现。 ... [详细]
  • 本文将指导你如何通过自定义配置,使 Windows Terminal 中的 PowerShell 7 更加高效且美观。我们将移除默认的广告和提示符,设置快捷键,并添加实用的别名和功能。 ... [详细]
  • 深入解析 Zend Guard 4 功能与配置
    本文旨在通过图文并茂的方式详细介绍 Zend Guard 4 的核心功能及其配置方法,特别适合英文阅读能力有限的技术人员。文中不仅提供了详细的步骤说明,还附带了实际操作中的注意事项,帮助读者更好地理解和应用这一工具。 ... [详细]
  • Web3隐私协议Manta Network与区块链互操作性平台Axelar达成战略合作,共同推进跨链资产的隐私保护。 ... [详细]
  • 本文详细介绍了如何利用go-zero框架从需求分析到最终部署至Kubernetes的全过程,特别聚焦于微服务架构中的网关设计与实现。项目采用了go-zero及其生态组件,涵盖了从API设计到RPC调用,再到生产环境下的监控与维护等多方面内容。 ... [详细]
  • 多项目环境下的代码复用策略
    在前端开发中,面对多个并行项目的场景,如何有效地实现代码复用成为了一个重要的议题。本文将探讨一种利用npm包管理来实现跨项目组件共享的方法。 ... [详细]
  • 本文详细介绍了Java中的泛型概念及其在类、接口和方法中的应用。泛型是自JDK 1.5以来引入的一项重要特性,旨在增强代码的灵活性和安全性。 ... [详细]
  • 美国网络安全:MITRE Shield 积极防御知识库解析
    本文深入解析了MITRE Shield积极防御知识库,探讨其在网络安全领域的应用及意义。 ... [详细]
  • 重新审视Kubernetes的必要性
    近期,我注意到不少人误以为我是Kubernetes的推广者。实际上,我只是分享了一些适合用Kubernetes解决的案例。本文旨在探讨Kubernetes的适用场景,并提供一些替代方案。 ... [详细]
  • 酷家乐 Serverless FaaS 产品实践探索
    本文探讨了酷家乐在 Serverless FaaS 领域的实践与经验,重点介绍了 FaaS 平台的构建、业务收益及未来发展方向。 ... [详细]
  • MySQL 8.0 新特性详解:免费视频教程上线
    本文介绍了一套在慕课网上发布的免费视频教程,深入解析 MySQL 8.0 的核心新功能,包括增强的安全性、用户管理、新的索引类型、CTE 和窗口函数等。 ... [详细]
  • 面对众多的数据分析工具,如何选择最适合自己的那一个?对于初学者而言,了解并掌握几种核心工具是快速入门的关键。本文将从数据处理的不同阶段出发,推荐三种广泛使用的数据分析工具。 ... [详细]
  • MVC模式下的电子取证技术初探
    本文探讨了在MVC(模型-视图-控制器)架构下进行电子取证的技术方法,通过实际案例分析,提供了详细的取证步骤和技术要点。 ... [详细]
  • 对于初学者而言,搭建一个高效稳定的 Python 开发环境是入门的关键一步。本文将详细介绍如何利用 Anaconda 和 Jupyter Notebook 来构建一个既易于管理又功能强大的开发环境。 ... [详细]
  • 腾讯云移动推送TPNS(Tencent Push Notification Service)为APP开发者和运营人员提供了一站式、高效、稳定的推送解决方案,帮助提升用户活跃度和运营效率。 ... [详细]
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社区 版权所有