一次Go项目进程重启故障问题排查

news2025/6/22 10:17:15

有个go项目的容器近两天几乎每天都异常重启一次,且两个节点基本都是差不多的时间异常重启。看了监控指标,发现CPU平稳,而内存是缓慢涨上去后,进程被操作系统kill掉,导致pod重启。
在这里插入图片描述

从内存指标可以看出,不会是因为突然的请求量上升所导致,而是应该存在内存泄漏了。
另外,从网络带宽指标看,流量也确实波动并不大,趋于平稳。
在这里插入图片描述

从监控指标还可以看出,go的线程数是平稳趋势,可以排除goroutine导致的内存泄漏。
在这里插入图片描述

这里我们需要借助pprof工具查看内存泄漏问题。pprof(Profiling in Go)是Go语言内置的一个性能分析工具。该工具可用于在运行时进行应用程序性能分析和剖析,帮助我们找出go进程的性能瓶颈和资源利用问题。例如:

  • 查找应用程序中最耗时的函数,以及耗时函数的调用路径。
  • 查找内存泄漏问题,能够追踪到内存是哪一行代码分配的。
  • 分析协程信息,找出协程阻塞或泄露的原因。

排查思路:由于容器已经重启过,当前go进程内存消耗还是正常值,不过从监控指标已经看出,内存会缓慢的涨上去,因此我们是先查看当前时间的内存使用情况,记录下来,待一个小时以后,再看一次,对比看哪里的内存是上涨的,然后再追踪内存是从哪里分配的,最后再看代码,看看哪里占用了内存没有释放。

我们已经给该go项目启用pprof:

import _ "net/http/pprof"

func init() {
    go func() {
       http.ListenAndServe("0.0.0.0:7005", nil)
    }()
}

进入容器,执行命令“go tool pprof -inuse_space http://127.0.0.1:7005/debug/pprof/heap”。
输入top命令,查看内存占用的前10。
在这里插入图片描述

目前看各项占用的内存都是在正常值范围,比较可疑的是“crypto/x509.parseCertificate”,还不急着分析泄漏问题。

不过这里还看出一个问题,就是我们执行操作系统的top命令,看到占用的内存(RES),也是监控指标显示的内存值,当前已经1.4g,而pprof的top命令显示的heap内存占用才626MB,相差很大。
在这里插入图片描述

类似Java的堆内存+堆外内存,以及堆内存实际使用与已占用操作系统的内存。go除了堆内存使用,还有栈、gc、go的一些底层数据结构等使用的内存也是计算在堆外的,而堆内存已申请和已使用也跟java类似, gc后会有空闲的堆内存,不会全部马上归还给操作系统。而pprof的top统计的是当前已使用,不包含空闲的堆内存,所以看到的差距很大。

进入容器里面执行curl http://127.0.0.1:7005/debug/pprof/heap?debug=1命令,可以查看go的内存占用情况。
在这里插入图片描述

字段含义说明:

  • Sys:进程总共从操作系统申请的字节数,包含运行时的heap、stack和其他内部数据结构的总和。
  • HeapSys:go进程heap申请的字节数。
  • HeapInuse:go进程当前使用的字节数。
  • HeapReleased:go进程已释放归还给操作系统的字节数。
  • HeapIdle:没有被使用的空闲字节数,包含HeapReleased,可以被再次申请,甚至作为栈内存使用。HeapIdle-HeapReleased=GC保留的。

从图中可以看出,go进程总共为heap申请了1.2G的内存,当前已使用785MB,空闲461MB。top命令显示的进程占用1.4g,go进程heap占用1.2G,还差两百M,就是Stack(栈内存使用)、MSpan+MCache+BucjHashSys(go底层内部结构体使用)、GCSys(GC使用)、OtherSys(其它内存使用)。所以内存使用是对得上的。

大概一个小时后,重新执行pprof的top命令,输出的前10堆内存使用如下图。
在这里插入图片描述

(方便对比,上一次的)
在这里插入图片描述

其中gitlab.lizhi.fm/middleware/lz_common_romefs/fio.(*ByteBufPool).Get占用64.32mb刚好是内存池的最大大小,这是我们自己实现的内存池,说明内存池没有泄漏。而bytes.makeSlice、crypto/x509.parseCertificate都往上涨了。
通过peek bytes.makeSlice,发现bytes.(*Buffer).Write占用64.33MB,bytes.(*Buffer).Grow占用110.48MB。
在这里插入图片描述

继续peek Grow,发现与tls有关,占用110.48MB。
在这里插入图片描述

继续peek Write,由于是模糊匹配,一共有三个结果,中间第二个才是我们需要的,发现也与tls有关,占用64.33mb内存。
在这里插入图片描述

代码中,与tls有关的地方就是发送https请求从s3下载文件,所以检查下载文件调用链路上是否存在可疑的内存泄漏,发现如下疑点。
在这里插入图片描述

统计了访问日记,发现确实经常出现响应403。
所以问题就清晰了,由于403是有body的,没有close响应的body导致的内存泄漏。
修改后指标恢复正常。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1086500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大量需求测不过来怎么破?

互联网测试少,测试研发比大概在1:5,再加上产品再使足了劲上需求,导致了测试需求量大,测试准备时间短,从而降低了上线质量。那么如何解决呢?测试是质量负责人,要对平台质量负责,于是就…

解决方案 | 法大大电子签精准击破销售场景签约难题

新商业形态及新交易模式不断涌现,电子签已经成为现代商业活动中不可或缺的一部分。特别是在销售场景中,电子签的应用不仅可以提高销售效率,还可以降低成本,提高客户满意度。本文将详细分析电子签在销售场景中的应用价值能力&#…

{2023版}老牌配资平台排行报告:十大排名和实盘评估详情

随着投资者对股市的深入了解,越来越多的人开始选择配资交易。在配资平台的选择上,除了要注意平台的合法性和安全性外,平台的口碑和服务质量也是非常重要的考虑因素。为了方便投资者的选择,尚红网、倍悦网、兴盛网、诚利和、嘉正网…

Jetson Orin NX 开发指南(4): 安装 CUDA 和 Realsense

一、硬件说明 可以在官网查看各个类型的相机说明 Intel RealSense™ Computer Vision - Depth and Tracking cameras 目前实验室常用的是 D400 系列的相机,如 D435i相机,D455相机等,本文主要使用 D435i 相机 D435i 相机是一个RGB-D相机&am…

iOS 面试题以及自我理解答案

1、简述push原理,push的证书和其他的有什么不一样? 第 一阶段:BeejiveIM服务器把要发送的消息、目的iPhone的标识打包,发给APNS。 第二阶段:APNS在自身的已注册Push服务 的iPhone列表中,查找有相应标识的iP…

pdf怎么压缩的小一点?分享pdf文件压缩方法

在数字化时代,PDF文件已成为我们日常工作和学习中不可或缺的一部分,然而,有时我们需要发送或存储的PDF文件过大,给我们的交流和存储带来不便。那么,如何将PDF文件压缩得小一点,以便更方便地传输和存储呢&am…

Android Studio for Platform (ASfP) 使用教程

文章目录 编写脚本下载源代码lunch 查看版本 归纳的很清楚,下载Repo并下载源码->可以参考我的 Framework入门のPiex 6P源码(下载/编译/刷机) 启动图标(重启生效) [Desktop Entry] EncodingUTF-8 NameAndroidStudio …

NCV6324CMTAATBG---车规级3MHz 2A 高效同步降压转换器

同步降压转换器? 是一种电源管理电路,它可以将输入电压转换为较低的输出电压。与传统的降压转换器相比,同步降压转换器具有更高的效率和更好的动态响应。 同步降压转换器的工作原理是通过控制开关管的导通和截止来实现电能的转换。在导通状…

Java架构师数据库设计

目录 1 导学2 数据库设计3 数据库设计的基本步骤3.1 优秀的数据库设计的基本原则3.1 数据库冗余设计4 数据库表逻辑关系设计4.1 MySQL设计表结构工具4.2 数据库建模工具5 数据库表结构设计5.1 MySQL调优5.2 SQL语句优化6 总结1 导学 数据库设计作为架构师的核心设计能力之一,对…

c++视觉处理---图像重映射

图像重映射:cv::remap cv::remap 是OpenCV中的一个函数,用于执行图像重映射,允许您通过重新映射像素的位置来变换图像。这个函数非常有用,可以用于各种图像处理任务,如校正畸变、透视变换、几何变换等。 下面是 cv::…

Maven系列第5篇:私服详解

maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。 这是maven系列第5篇。 整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。 环境 maven3.6.1 …

ctfshow萌新计划web9-14(正则匹配绕过)

目录 web9 web10 web11 web12 web13 web14 web9 审一下代码,需要匹配到system|exec|highlight才会执行eval函数 先看一下当前目录下有什么 payload:?csystem(ls); index.php是首页,我们看看config.php payload:?csystem…

【FreeRADIUS】使用FreeRADIUS进行SSH身份验证

在数据中心中,可能有许多Linux机器,由管理员团队进行管理。这些管理员通过SSH访问这些服务器。如果希望使用一个集中的位置来管理这些管理员的身份验证。那么为了实现这一点,可以使用FreeRADIUS服务器。FreeRADIUS是一个功能强大的开源工具&a…

SwinTransformer学习记录(一)之整体架构

SwinTransformer自问世以来,凭借其优秀的性能,受到无数研究者的青睐,因此作为一个通用的骨干网络,其再目标检测,语义分割,去噪等领域大杀四方,可谓是风光无限,今天,我们便…

Linux防火墙配置

目录 一、firewalld防火墙简介二、firewalld放行端口方法三、firewalld放行服务方法四、firewalld富规则配置方法一、firewalld防火墙简介 Firewalld防火墙是CentOS 7系统默认的防火墙管理工具,它取代了之前版本的iptables防火墙。Firewalld工作在网络层,属于一种包过滤型防…

C语言,求质因数中的较大的值

首先要求出输入的质数的两个质因数,就要用到判断素数时用到的方法。用内循环产生2到n的数字,当求到了质因数之后,也要先用一个变量将质因数存起来,当后面遇到更大的质因数时,再将原来的质因数覆盖,如果更小…

SystemVerilog Assertions应用指南 第一章

1.1什么是断言 断言是设计的属性的描述。 ● 如果一个在模拟中被检查的属性( property)不像我们期望的那样表现,那么这个断言失败。 ● 如果一个被禁止在设计中出现的属性在模拟过程中发生,那么这个断言失败。 一系列的属性可以从设计的功能描述中推知,并且被…

恒驰服务 | 5大服务保障,轻松助力企业实现数据库迁移

随着经营规模的迅猛发展,IT信息系统在企业的日常运营中正发挥着越来越重要的作用。确保信息系统尤其是作为其核心与基石的数据库系统的安全、稳定、高效和敏捷运行,是支撑企业业务系统正常、可持续运营的核心基础,也是企业信息化部门各级管理…

LeetCode142:环形链表II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数…

前端--CSS

文章目录 CSS的介绍 引入方式 代码风格 选择器 复合选择器 (选学) 常用元素属性 背景属性 圆角矩形 Chrome 调试工具 -- 查看 CSS 属性 元素的显示模式 盒模型 弹性布局 一、CSS的介绍 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精…