首页 > 系统相关 >后端踩坑笔记:记一次内存泄漏查障修复过程

后端踩坑笔记:记一次内存泄漏查障修复过程

时间:2022-11-25 15:33:48浏览次数:49  
标签:泄漏 swoft 查障 rpc 内存 修复过程 日志 gateway

前言

由于某开发项目的特殊性,在开发过程中需要将一些核心的代码加密。但是项目一开始就是由swoft框架(一个基于swoole的PHP框架)进行开发,未找到swoft代码加密工具。因此想到了将核心代码迁移到Golang里面,两者通过rpc进行通信。


项目情况

后端服务是由一个golang开发的http服务(以下称gateway)以及swoft框架开发的rpc服务。gateway也需要开启rpc服务,给swoft调用核心代码。一个请求进来,先给到gateway,然后通过rpc请求到swoft,如果需要调用到核心加密代码,swoft会通过rpc调用gateway。项目是部署在k8s上面运行。大致的结构如下:

后端踩坑笔记:记一次内存泄漏查障修复过程_内存泄漏


最近通过检查容器发现,部署的服务居然每个一段时间就会Resatrt一次。不对劲!

后端踩坑笔记:记一次内存泄漏查障修复过程_内存_02


检查历程

在发现问题的第一时间,初步估计可能是程序有BUG,报错导致服务中断。立马查看gateway以及swoft的日志,但查看了一遍日志发现,日志都是新的。因为日志并没有做持久化,容器重启会清掉日志文件。那么只能通过k8s,挂载一个文件夹进去用于持久保存日志文件。

过去几天后,再次检查日志,却并没有发现任何报错信息,无论gateway和swoft,都没有发现服务有中断的情况。那究竟是什么原因导致容器重启?突然隐隐约约想到一个细思极恐的可能,那就是可能发生内存泄漏,导致了k8s节点内存爆了,k8s自动去重启容器。通过几天的观察,发现有些其他的容器,会莫名被销毁挤到另外的节点上去,更加深了内存泄漏的猜测。

既然是内存泄漏,那gateway与swoft都有泄漏的可能,只能都检查一遍了。通过呕心沥血的代码审查,终于发现了一处可疑之处。在gateway建立rpc连接的时候,并没有将其释放掉。苦煞我也!在开发的时候,并没有注意到这一点,导致内存泄漏。

后端踩坑笔记:记一次内存泄漏查障修复过程_内存泄漏_03


另外,为了避免swoft也有内存泄漏问题,也对swoft框架进行了设置。由于swoft框架是用的是swoole,只需要通过设置max_request,给worker进程一个最大任务数。worker进程再完成此数量任务后,会释放所有内存和资源,退出进程。然后重新启动一个新的worker进程,避免内存泄漏。​

通过gateway的代码以及swoft的配置后重新将项目部署上k8s。经过两周的观察,终于没再发现容器Restart的情况。​

后端踩坑笔记:记一次内存泄漏查障修复过程_修复_04

所以告诫各位开发者,在开发期间必须时刻注意释放回收变量,少用静态变量、全局变量,以免导致内存泄漏。开发时候一时爽,内存泄漏泪两行。


以上就是本期分享,如果大家对此感兴趣,欢迎各位关注、留言,大家的支持就是我的动力!

标签:泄漏,swoft,查障,rpc,内存,修复过程,日志,gateway
From: https://blog.51cto.com/u_15345191/5886797

相关文章

  • PHP 数组占用内存分析
    下面的做法会占用多大的内存?list($appid,$openid)=["testcontent","test"];测试:$m0=memory_get_usage();$k=range(1,200000);$m1=memory_get_usage();echoround((......
  • Java的内存回收机制
    1.Java在内存中的状态首先我们先写一个代码为例子:Person.javapackagetest;importjava.io.Serializable;publicclassPersonimplementsSerializable{static......
  • 直接内存(操作系统内存)
    定义:  分配和回收原理  若设置  -XX:+DisableExplicitGC  (禁用显示的GC)即代码中的System.gc();   无效可能会导致直接内存无法释放;(解决办法:可使用un......
  • hadoop任务超出虚拟内存限制问题(beyond the 'VIRTUAL' memory limit)
    今天用hive跑任务,一个小问题困扰了许久,问题如下:Container[pid=5284,containerID=container_1669278775243_0001_01_000005]isrunning346733056Bbeyondthe'VIRTUAL'......
  • 一文详解GaussDB(DWS) 的并发管控和内存管控
    摘要:DWS的负载管理分为两层,第一层为cn的全局并发控制,第二层为资源池级别的并发控制。本文分享自华为云社区《GaussDB(DWS)并发管控&内存管控》,作者:fighttingman。1背景......
  • 一文详解GaussDB(DWS) 的并发管控和内存管控
    摘要:DWS的负载管理分为两层,第一层为cn的全局并发控制,第二层为资源池级别的并发控制。本文分享自华为云社区《​​GaussDB(DWS)并发管控&内存管控​​》,作者:fighttingman。......
  • Toad for Oracle 导入MIP.dmp文件时:报内存不足时的解决办法:
    摘要:最近在使用Oracle数据库开发项目,其中在用ToadforOracle连接操作Oracle11g的时候出现了问题,问题是这样的:在数据库管理员的连接下导入已经建立的用户的dmp文件,会报内存......
  • 什么是垃圾回收机制 什么叫内存泄漏
    垃圾回收机制垃圾回收机制是js内置的一种管理机制它会自动进行内存的分配和回收内存核心就是判断内存是否不再被使用 如果是就视为垃圾就进行内存释放进行垃圾回收......
  • Linux 基础-查看 cpu、内存和环境等信息
    Linux基础-查看cpu、内存和环境等信息在使用Linux系统的过程中,我们经常需要查看系统、资源、网络、进程、用户等方面的信息,查看这些信息的常用命令值得了解和熟悉。1......
  • 检测内存泄漏、优化的常用手法[笔记]
    可视化自动内存泄漏检测//debugImplementation'com.squareup.leakcanary:leakcanary-android:2.3'///屏蔽提升操作速度,开启后不需要任何代码的。原理是内容提供者开......