当前位置: 首页 > 网络应用技术

坑的摘要:Python内存泄漏调查提示

时间:2023-03-08 14:32:26 网络应用技术

  最近,该服务遇到了内存泄漏的问题,并且紧急要求解决方案的操作和维护同学,因此他们还系统地记录了内存泄漏问题的通用解决方案。

  首先找出这个问题的现象:

  基于上述两个条件,首先要考虑的是13日引入的问题,更新可能来自两个方面:

  从上述两个角度开始:

  经过研究和分析后,人们认为该软件包引起的内存泄漏的可能性不大,因此放手。

  在这一点上,似乎无法研究源代码更改的新版本和旧版本。

  目前,Python的常见记忆检测工具包括Pympler,Objgraph,Tracemalloc等。

  首先,通过objgraph工具,观察到旧服务中的Top50变量类型

  objraph常用命令如下:

  在这里,为了更好地观察变化的曲线,我简单地打包,以便将数据直接输出到CSV文件以进行观察。

  如下图所示,一批图片在旧版本和新版本上持续了一个小时。它像老狗一样稳定,各种类型的数量没有波浪。

  目前,我认为我通常会使用一批异常格式图片在传输或启动之前建立边界。

  尽管这些异常必须在测试同学上网之前得到验证,但死马被用作现场马医生。

  平静的数据被打破了。如下红色框中所示:重要类型的重要类型的数量,例如DIST,功能,方法,元组,追溯和其他重要类型的数量已经开始上升。

  目前,镜像内存也在增加,没有收敛迹象。

  结果,尽管不可能确认它是否是在线问题,但至少有一个错误。这次,我检查了日志并找到了一个奇怪的现象:在正常情况下由特殊图片引起的异常,日志应该输出以下信息,即,check_image_type方法只能在异常堆栈中打印一次。

  但是现状是check_image_type方法循环反复打印多次,并且随着测试的数量,重复的数量更多。

  重新研究此作品的异常处理代码。

  异常陈述如下:

  异常代码如下:

  在考虑问题的根本原因之后:

  这里的每个异常实例都等同于被定义为一个全局变量,当它异常时,它是该全局变量。当将此全局变量按下异常堆栈处理时,它将不会被回收。

  因此,随着错误格式图片的增加,异常堆栈中的信息将继续增加。由于异常还包含请求图片信息,因此内存将增加MB级别。

  但是,该代码的这一部分已经启动了很长时间。如果在线确实是由此引起的问题,为什么以前没有问题,为什么A芯片上没有问题?在上述两个问题上,我们做出了两个验证:

  首先,此问题还被确认,先前的版本和芯片也将发生。

  其次,我们检查了在线呼叫记录,发现最近它刚刚连接到客户,并且大量使用类似问题的图片称为局局(大多数局是B芯片)。我们发现了一些在线实例并观察到日志中的相同现象。

  结果,基本上可以理解上述问题。修复此错误后,内存溢出问题不再发生。

  似乎可以解决这个问题。但是我问自己一个问题。如果我一开始没有打印此日志,或者开发人员很懒惰,并且没有击中所有异常堆栈,我应该如何找到?

  有了这个问题,我继续研究Objgraph和Pympler工具。

  在异常图片的情况下,上一篇文章已将内存泄漏定位。

  通过以下命令,我们可以看到每次异常出现时都会添加哪些变量和增加内存条件。

  通过以下代码,您可以打印出这些新变量来自哪些引用以进一步分析。

  通过GraphViz的DOT工具,上面产生的图形格式数据将转换为以下图片:

  在这里,因为有太多的基本类型,例如dict,列表,框架,元组,方法等。

  新的ImagereQwrapper的记忆的呼唤

  新的内存呼叫链:

  尽管在上述知识之前,我们自然要注意Trackback及其相应的Image_Format_Exception的异常。

  但是,通过考虑为什么在服务呼叫结束后应回收上述追溯变量,尤其是在被称为_format_exception normal呼叫之后,应该回收上述追溯变量,因此无法回收服务呼叫后本应回收的变量。问题。

  此外,python3中的缓存异常引起的内存泄漏问题,知道有一个相对清晰的:https://zhuanlan.zhihu.com/p/38600861

  在这一点上,我们可以得出结论,结论如下:由于异常投掷无法回收,因此无法回收相应的异常堆栈,请求物体和其他变量。请求主体包含图片信息。记忆泄漏。

  此外,发现Python3带来了记忆分析工具Tracemalloc。通过以下代码,您可以观察代码线和内存之间的关系。尽管它不一定准确,但也可以提供一些线索。

  https://teterhome.com/articles/19870?order_by = created_at&at

  https://blog.51cto.com/U_3423936/3019476

  https://sementfault.com/a/1190000038277797

  https://www.cnblogs.com/zzbj/p/13532156.html

  https://drmingdrmer.github.io/tech/programming/2017/05/06/python-mem.html

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

  本文分享了华为云社区的“ Python内存泄漏调查提示”,作者:Lutianfei。