iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python脚本实现内存泄漏测试的方法及解决过程
  • 714
分享到

Python脚本实现内存泄漏测试的方法及解决过程

2023-06-05 19:06:03 714人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

python脚本实现内存泄漏测试的方法及解决过程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。我下面这篇文章提供了一种轻巧的内存泄漏测试方法及其Python实现,该方法在L

python脚本实现内存泄漏测试的方法及解决过程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

我下面这篇文章提供了一种轻巧的内存泄漏测试方法及其Python实现,该方法在Lenovo Bamboo系统的验收测试活动中得到过诸多检验,是一种易用有效的内存泄漏测试方法。

一、内存泄漏测试原理

内存泄漏的危害。

内存泄漏的危害不必多说,会导致系统的可用内存越来越少,影响系统长时间运行的稳定性。

常用的内存泄漏测试方法

一般而言,可概括为两种思路:

1)内存分配、释放工具检查

如valgrind等内存测试工具。

2)linux系统性能监测

如zabbix等linux性能监测工具,以及团队自研的检测linux性能的工具。

在方法一中,工具的原理一般是通过检查当程序动态分配内存后,是否有释放来判断有没有发生内存泄漏。其优点很明显,发现泄漏时能很方便定位到代码的具体哪个地方在泄漏内存。但缺点也很明显:一是工具容易误判,二是工具要干涉程序编译过程,使得工具使用起来很麻烦。这两个缺点对于黑盒测试人员来说尤其容易感受到。

其实,还有第三个缺点。作为测试人员,真正关心的难道是程序结束时内存有没有free吗?不然。绝大多数的进程原本就该持续运行永不结束(至少我们希望是这样),测试人员真正关心的是进程所使用的内存是基本稳定的,还是持续增长的。如果是持续增长的,就有影响系统长时间运行稳定性的风险。

综上, Bamboo OS测试人员根据方法二总结了内存泄漏测试方法,并利用python实现了工具脚本。

linux内存管理机制

Linux的内存管理机制,网上的资料很多,就不多谈了。本文只对一些基本的概念啰嗦几句。

虚拟内存:linux上每个进程都有一个虚拟的地址空间,这个虚拟的地址空间大小在ps命令里体现为VSZ,在top命令里体现为VIRT。这空间可以很大,单个进程的VSZ超出整个系统的内存,也是很常见的。

常驻内存:只有实际要发生访问的内存,才会被映射到RAM上,在ps命令里体现为RSS,在top命令里体现为RES

如下图所示,vpp的VSZ为99G(你看,任性。),RSS为787M。

(注:PS命令中内存基本单位是KB,B代表bit)

Python脚本实现内存泄漏测试的方法及解决过程

进程使用的内存,还有一种分法:私有内存和共享内存。

顾名思义,私有内存即是被该进程独享的内存,共享内存是多个进程共享的内存,一般地,当多个进程依赖相同的链接库时,链接库也会被映射到每一个进程的地址空间里。所以,即使RSS也未真正的反映进程到底占用了系统多少内存资源。

综上,测试linux系统上进程内存泄漏的一个基本思路为:

定期通过ps、cat proc/$pid/status、pmap –d $pid等命令,观测进程的rss和私有内存的变化。如果两者都在持续上涨,那么该进程有很大嫌疑存在内存泄漏。如果只有其中之一在涨,需进一步使用定位方法(或者请求开发协助),最好能弄明白具体原因。

监测linux内存性能的命令有很多,除上文提到过的命令外,用户态进程还有smaps,vmstat以及其他命令监测,内核一般是查看slabinfo。本文不介绍这些命令的详细用法。

二、Bamboo 系统内存泄漏检测脚本的实现

设计测试方法

视对系统的了解程度,可以选择性地

1)通过审阅设计文档或历史缺陷、与开发沟通交流,找出项目动态分配内存的地方;

2)设计测试步骤,测试步骤应当让最终的状态与初始状态时一个状态。比如,创建router ospf实例,进行实例的初始化和资源分配、协议交互后,又删去了此实例,系统回到初始状态;

3)反复执行测试步骤并通过linux的命令观察内存变化。如果rss和私有内存持续上涨,则有嫌疑出现了内存泄漏;

4)定位(或协调开发来定位)问题,可通过pmap命令的详细信息对比、gdb调试、valgrind或其他工具来定位。

实现内存拷机测试脚本

内存拷机脚本工具包含两部分,memMonitor和mytest。

memMonitor是工作框架,依赖Bamboo系统的自动化测试平台,该平台能提供bamboos_ssh功能让脚本可以创建一个Bamboo系统实例并在该系统执行命令。笔者提供的版本是通过命令行来获取系统内存信息的,各功能函数通过分析字符串来获取数据,读者可以自行实现。内存监测结果的呈现可炫酷可简易,读者可自行实现。

memMonitor 的传参mytest是一个函数,这个函数里是测试人员设计的测试步骤(比如上文说过的创建和销毁ospf实例),对于工具的使用人员来说,他不需要关心memMonitor内部实现机制,只要设计他个人的mytest就可以了。

memMonitor脚本的基本架构如下。

import bamboos_ssh

  import re

  import time

  '''

  本用例通过linux提供的ps和pmap命令监控Bamboo系统里指定进程的内存变化。

  '''

  ##--------------全局参数设置--设置检测范围-------------------------------##

  processList = ['./omu','/bin/ffe/vpp/vpp','l3stackMain','srvc','nse','ospfd','nettool_server',

                 'infoc','ffe_mgmt','usermgr','nat','dhcpd','ntpd','bgpd','sysrepod']

  ##++++++++++++++++++++++++++++++++++++++++++++++++++++##

  def memMonitor(targetSystemIP,psName,repeatRounds,mytest):

      rssList = []

      privateList = []

      ##-----------------------------初始化工作------------------------------------- -##

      dut1_ssh = bamboos_ssh.bamboos_ssh(targetSystemIP)

      print('\n初始时完整获取ps信息,找到目标进程的进程号,获取该进程的pmap信息')

      psAllInfo = dut1_ssh.exe_cmd( ['ps -aux'])

      psID = getPsID(psName,psAllInfo)

      psAllRssStart = getPsAllRss(processList,psAllInfo)

      dut1_ssh.exe_cmd( ['pmap -d %s'%psID])

      dut1_ssh.exe_cmd(['exit'])

      ##-----------------------------拷机过程-----------------------------------------##

      ##主循环多次执行测试员的拷机脚本,每次执行后获取rss内存和private内存信息

      for i in range(0,repeatRounds+1):

          try:

              if 0 == i:

                  print('\n获取初始内存信息')

              else:

                  print('\n第%d轮测试' % i)

                  mytest(dut1_ssh)

                  print('\n第%d次获取内存信息' % i)

              rSSMem = getRssMem(dut1_ssh,psID)

              rssList.append(rssMem)

              privateMem = getPrivateMem(dut1_ssh,psID)

              privateList.append(int(privateMem))

              dut1_ssh.exe_cmd(['exit'])

          except BaseException as e:

              print(e);print('第%d轮测试时异常终止了'%i);resultPrint(psName, rssList, privateList);break

      ##最后一轮测试时再次获取ps信息,以及目标进程的pmap信息

      print('\n结束时完整获取ps信息,以及目标进程的pmap信息')

      psAllInfo = dut1_ssh.exe_cmd(['ps -aux'])

      psAllRssEnd = getPsAllRss(processList,psAllInfo)

      dut1_ssh.exe_cmd(['pmap -d %s' % psID])

      dut1_ssh.exe_cmd(['exit'])

      ##-------------------显示最终的监测结果------------------------------------------##

      print('=========================拷机测试的结果=====================')

      resultPrint(psName, rssList, privateList)

      compareAllPsRss(processList, psAllRssStart, psAllRssEnd)

      ##-------------------清理测试环境,结束测试---------------------------------------##

      dut1_ssh.close()

      ##++++++++++++++++++++++++++++++++++++++++++++##

  def getPsID(psName,psInfo):

  #根据PSInfo检索出psID

  #    return psID

  def getPsAllRss(psNameList,psAllInfo):

  #通过psALLInfo检索出所有ps的RSS并返回

  #    return psRssList

  def getRssMem(dut1_ssh,psID):

  #根据 'cat /proc/%s/status | grep VmRSS' 命令找出每一个ps的rss内存值

  #    return rssMem

  def getPrivateMem(dut1_ssh,psID):

  #根据 'pmap -d %s | grep mapped' 命令找出每一个ps的私有内存值

  #    return privateMem

  def resultPrint(psName,rssList,privateList):

  #根据需要输出内存监测结果,可以是炫酷的图形化输出,也可以是简易输出,例如:

      print('\n进程%s的物理内存占用趋势为:'%psName)

      print(rssList)

      print('\n进程%s的私有内存使用趋势为:'%psName)

      print(privateList)

  def compareAllPsRss(processList,psAllRssStart,psAllRssEnd):

  #对所有进程的一个输出,可以是图形化的,也可以是简易的

使用内存拷机测试脚本

使用实例:

1)测试同学怀疑ntp特性在配置本地时钟存在内存泄漏,所以设置主要监测的进程是ntpd

2)在mytest函数里定义了将反复执行的命令。

def mytest(dut1_ssh):

      for i in range(0,10):

          dut1_ssh.config(['ntp-service refclock-master 9'])

          time.sleep(2)

          dut1_ssh.config(['no ntp-service refclock-master'])

3)主程序将反复执行mytest,并周期性的查看ntpd进程的rss内存和私有内存信息

4)主程序在初始时和结束时获取了一次ntpd进程的完整pmap信息,方便在怀疑ntpd存在内存泄漏时进行进一步的定位分析。

运行结果:

主要的结果如下图所示:(笔者使用的版本当前未将数据图形化)

可以看到,ntpd的rss内存增长显著,私有内存也呈一直上涨趋势。所以,ntpd有很大嫌疑存在内存泄漏。

Python脚本实现内存泄漏测试的方法及解决过程

因为想进一步分析内存的变化,所以对比了程序执行前后ntpd的pmap信息。可以看到在结束时,pmap信息里多了更多的大小为4K的分页。测试人员将这一信息提供给开发同学,开发同学据此很快找到了内存泄漏的原因在于NTP记录日志后没有释放分页。

Python脚本实现内存泄漏测试的方法及解决过程

关于Python脚本实现内存泄漏测试的方法及解决过程问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网Python频道了解更多相关知识。

--结束END--

本文标题: Python脚本实现内存泄漏测试的方法及解决过程

本文链接: https://www.lsjlt.com/news/244202.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python脚本实现内存泄漏测试的方法及解决过程
    Python脚本实现内存泄漏测试的方法及解决过程,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。我下面这篇文章提供了一种轻巧的内存泄漏测试方法及其python实现,该方法在L...
    99+
    2023-06-05
  • android 如何进行内存泄漏检测及解决方法
    内存泄漏是在Android开发中常见的问题之一,它可能导致应用的内存占用逐渐增加,最终影响应用的性能和稳定性。以下是一些常见的方法来进行内存泄漏检测和解决: 1. 使用工具进行内存泄漏检测: Andr...
    99+
    2023-10-03
    android
  • golang内存泄漏的原因及解决方法是什么
    Golang中的内存泄漏是指程序中分配的内存没有被适时地释放,导致程序占用的内存逐渐增加,最终耗尽系统内存资源。内存泄漏的原因和解决...
    99+
    2023-10-20
    golang
  • java中ThreadLocal内存泄漏的解决方法
    小编给大家分享一下java中ThreadLocal内存泄漏的解决方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!java基本数据类型有哪些Java的基本数据类型...
    99+
    2023-06-14
  • android内存泄漏的原因及解决方法是什么
    Android内存泄漏的原因可能有以下几个:1. 长生命周期的对象持有短生命周期的引用:当一个长生命周期的对象持有了一个短生命周期对...
    99+
    2023-08-08
    android
  • C++ 内存泄漏的常见原因及其解决方法
    常见 c++++ 内存泄漏原因:1. 忘记释放指针;2. 双重释放;3. 循环引用;4. 静态变量;5. 全局对象。解决方法:1. 使用智能指针;2. 注意循环引用;3. 避免静态变量;...
    99+
    2024-05-02
    c++ 内存泄漏
  • 解决 PHP 函数中内存泄漏的方法
    php 函数中的内存泄漏可通过以下方法解决:1. 使用弱引用,防止对象被垃圾回收;2. 使用匿名函数,创建不泄漏引用的对象;3. 使用对象池,重复使用对象,优化内存管理。以上方法可有效防...
    99+
    2024-05-02
    php 内存泄漏
  • C++内存泄漏的检测与实现详细流程
    目录内存泄漏带来的问题难点hook实现泄漏判断与追踪(malloc和free重载)宏定义实现hook内存泄漏 malloc/new 调用在堆上分配的内存却没有相应的free/dele...
    99+
    2022-11-13
    C++ 内存泄漏检测 C++ 内存泄漏实现
  • 解决Go语言Websocket应用程序内存泄漏的方法
    解决Go语言Websocket应用程序内存泄漏的方法,需要具体代码示例Websocket是一种在网络上实现全双工通信的协议,常用于实时的数据传输和推送。在Go语言中,我们可以通过使用标准库net/http中的WebSocket模块来编写We...
    99+
    2023-12-14
    websocket Go语言 (Go) 内存泄漏 (Memory Leak)
  • c语言内存泄漏的解决方法是什么
    在C语言中,内存泄漏是指在动态内存分配后,没有释放该内存导致内存空间无法被再次使用的情况。解决内存泄漏的方法可以包括以下几个方面:1...
    99+
    2023-09-27
    c语言
  • Android 内存泄漏的常见原因及其对应的解决方案
    Android 内存泄漏 Android应用程序中常见的内存泄漏原因有很多,以下是一些常见的原因及对应的解决方案: 1. 静态引用导致的内存泄漏: 静态变量持有对Activity或Fragment的引...
    99+
    2023-09-15
    android
  • 解决NSTimer循环引用导致内存泄漏的六种方法
    解决NSTimer循环引用导致内存泄漏的六种方法如下:1. 使用weak引用:在创建NSTimer时使用weak引用来引用目标对象,...
    99+
    2023-09-20
    NSTimer
  • 怎么解析Flex内存泄露常见现象及解决方法
    怎么解析Flex内存泄露常见现象及解决方法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Flex性能优化常用手法总结众所周知,目前国内的宽带应用并不是像很多发达...
    99+
    2023-06-17
  • Linux环境中用Python脚本实现自动化测试的方法
    Linux环境中用Python脚本实现自动化测试的方法随着软件开发的迅猛发展,自动化测试在保证软件质量和提高开发效率方面起着至关重要的作用。而Python作为一种简单易用的编程语言,具有很强的可移植性和开发效率,被广泛应用于自动化测试中。本...
    99+
    2023-10-22
    Python 自动化测试 Linux 关键词:
  • 通过Jython调用Python脚本的实现方法
    前言 前面在 BeanShell 里面是通过 java 脚本实现请求的预处理,jmeter里面也可以调用python的脚本,需安装 jython.jar 的插件. Jython 是 ...
    99+
    2024-04-02
  • 教你用MAT工具分析Java堆内存泄漏问题的解决方法
    一、MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题。该工具提供了两种使用方式,一种是插件版,可以...
    99+
    2024-04-02
  • python抽样方法解读及实现过程
    目录抽样方法概览随机抽样—总体个数较少分层抽样——总体存在差异且对结果有影响整体抽样系统抽样——总体多过采样下采样过采样与...
    99+
    2023-02-01
    python抽样方法 python抽样 python抽样实现
  • 笔记本电脑物理内存过高的解决方法
    这篇文章主要介绍笔记本电脑物理内存过高的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!启动“Windows任务管理器”,快捷键“alt+ctrl+delete”点击“性能”选项卡,查看系统内存和物理内存的使用...
    99+
    2023-06-27
  • flyway实现java 自动升级SQL脚本的问题及解决方法
    为什么要用Flyway 在日常开发中,我们经常会遇到下面的问题: 自己写的SQL忘了在所有环境执行; 别人写的SQL我们不能确定是否都在所有环境执行过了; ...
    99+
    2024-04-02
  • 详解超星脚本出现乱码问题的解决方法(Python)
    这种情况在挂载脚本后无法答题,任何关于答题脚本的脚本都无法使用。 看这个字体,已经读不出原文了,一开始以为是加密尝试使用加密算法破解,然后用BP、其他工具尝试解码无果。 之后尝试用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作