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

关于golang:GO-语言内存泄漏排查两例

通过拜访线上服务pprof裸露进去的HTTP接口,拿到以后所有协程的堆栈信息;curlhttp:「ip:port」debugpprofgoroutine?debug2

例1:Goroutine 透露

景象

NumGoroutine 指标继续上涨,且低峰期未降落,判断呈现了 Goroutine 透露景象。

排查

  1. 通过拜访线上服务 pprof 裸露进去的 HTTP 接口,拿到以后所有协程的堆栈信息;
    curl http://「ip:port」/debug/pprof/goroutine?debug\=2
  1. 发现存在大量存活工夫超过上千分钟的 Goroutine,察看堆栈疑似是 http 连贯未开释导致,通过对下图 net.sockets.tcp.inuse(正在应用的tcp socket数量)指标的察看进行了进一步的确认;

论断

http

上面以本次 case http 服务为例,做简略介绍:

  • 上游服务作为客户端应用了 http1.1 并且将连贯设置为 keepalive;
  • 本服务作为服务端未设置 idletimeout 与 readtimeout;

当这两种状况同时产生时,如果上游持有对本服务的连贯不进行开释,那么服务端会始终维持这个连贯的存在,不进行回收,进而导致协程透露;

client
上游客户端可能为 GO、Java 等,以下为 GO 语言 http 客户端的闲暇连贯超时设置;

server

解决

倡议启动 http server 尽量用后者,前者尽管简略,然而服务不够强壮;

thrift

server

Tips

须要留神的一点是,这个 Goroutine 透露问题不止在 http 下会产生,在 thrift、grpc 中也是同样的情理,如果服务端不对连贯设置 timeout,某些状况下就会被上游拖死。

Reference

https://zhuanlan.zhihu.com/p/…

例2:内存居高不下

景象

内存使用量(mem.rss)居高不下,且低峰期未降落,狐疑产生了内存透露景象;

排查

  1. 刚开始狐疑时内存透露,然而抓取 pprof heap 图察看后,未发现泄露问题,且内存调配合乎预期;
  2. 发现内存应用尽管居高不下,但未呈上涨趋势,因而批改关键字为“go 内存占用居高不下”,发现有雷同问题;

论断

问题来自于 GO 在将内存归还给操作系统时的内存开释策略,详情见官网 issues,以下做简略介绍。

GO 内存开释策略

(此节内容整顿自 压测后go服务内存暴涨)

不同策略的开释机制

  • MADV_DONTNEED:内核将会在适合的机会去开释内存,但过程的 RSS(常驻内存)将会立刻缩小。如果再次申请内存,内核会重新分配一块新的空间。
  • MADV_FREE:只能在 linux 内核版本 4.5 以上能力应用,此操作实践上只是打了一个标记位,只有在内核感觉到内存压力的时候才会将这些打标记的内存回收掉,调配给其余过程应用。这个策略下过程的 RSS 不会立刻缩小。

不同策略的理论差异

  • 实践上 MADV_FREE 效率要高一些,通过在页表中做标记的形式,提早内存的调配和回收,能够进步内存治理的效率,毕竟内存的回收和调配都是会耗费零碎性能的;
  • 导致的 RSS 指标变动
    MADV_DONTNEED 会导致过程 RSS 会有显著的降落;
    MADV_FREE 会导致过程 RSS 安稳在顶峰,不会失去立刻开释;

不同 GO 版本的开释策略

  • 在 GO1.12 之前,默认均抉择的 MADV_DONTNEED 策略进行内存回收;
  • 在 GO1.12~GO1.15,官网默认抉择 MADV_FREE 策略进行内存回收;
  • 在 GO1.16 及之后,又改回了 MADV_DONTNEED 策略进行回收内存。

在 GO1.12~GO1.15 且内核版本 4.5 以上,mem.rss 指标曾经无奈精确观测服务内存占用;

解决办法

  • 不解决,对程序性能无利,然而会升高一些可观测性;
  • 以下任一办法能够解决,但会损失肯定性能
    把 export GODEBUG=madvdOntneed=1 写进服务 control.sh 脚本;
    降级 GO 版本至 1.16 及以上;

Reference

http://soiiy.com/go/17114.html
https://github.com/golang/go/…


推荐阅读
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • YouareplayingthefollowingNimGamewithyourfriend:Thereisaheapofstonesonthetable,eachtimeoneo ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • uniapp开发H5解决跨域问题的两种代理方法
    本文介绍了uniapp开发H5解决跨域问题的两种代理方法,分别是在manifest.json文件和vue.config.js文件中设置代理。通过设置代理根域名和配置路径别名,可以实现H5页面的跨域访问。同时还介绍了如何开启内网穿透,让外网的人可以访问到本地调试的H5页面。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • 本文介绍了在Go语言中可见性与scope的规则,包括在函数内外声明的可见性、命名规范和命名风格,以及变量声明和短变量声明的语法。同时,还介绍了变量的生命周期,包括包级别变量和局部变量的生命周期,以及变量在堆和栈上分配的规则和逃逸分析的概念。 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
  • pdf在这里:http:mfinocchiaro.files.wordpress.com200807java-virtual-machine-neutral.pdf以及关于gc的 ... [详细]
author-avatar
李国龙度_476
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有