在我们的工作中,我们使用ddagent ver。5作为收集工具,收集和报告托管服务器的性能指标,并对ddagent进行一定程度的定制。经过多次功能迭代,发现一批在线运行时间长的托管服务器占用了太多内存。分析问题机器上进程树中每个节点的占用情况,可以看出ddagent集合进程的内存占用仍然很高。

我们将学习最基本的流程控制工具,比如

if 条件判断

for 循环

while 循环

作为保证业务系统稳定运行的监控组件,存在内存泄漏,这自然是非常严重的,所以我们开始了我们的“故障排除之旅”。

if-elif-else 判断

分析

有很多工具可以分析和导出Python程序的内存状态。在这里,我们使用pyrasite,它可以附加到正在运行的Python程序,生成内存快照,并检查当前哪些对象类型占用了多少内存,并从大到小排序。

使用命令非常简单: pyrasite-memory-viewer  ,同时会生成一份快照文件: /tmp/pyrasite--objects.json 。

由于无法提供真实的生产数据,下面提到的所有数据都来自问题版本在测试环境中运行12小时后的采样。

在pyrasite提供的Cui视图中,我们可以清楚地看到字典类型的对象实例占用的内存最多,达到3.4mb,有6621个实例:

while 循环

While循环也是一种常见的循环方式。这种循环通常以循环体类或条件方式结束。它不可能无限期地进行下去。

对于泄漏情况,我们有以下事实和猜测:

一个或多个位置持续创建空字典对象,并且无法回收它们,从而导致内存泄漏

内存泄漏量随时间而增加。在索引收集业务中,泄漏很可能是在每个收集过程中引起的,并在间隔期之后重复触发

我们看不到当前依赖的ddagent版本存在尚未关闭的相关问题,这可能是在我们的定制过程中引入的错误

[

[

[".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],

[".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],

[".../modules/monitor/bot/schedule.py",51,"run","task.run()"],

[".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],

[".../modules/monitor/bot/task.py",18,"run","self.check()"],

[".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],

[".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],

[".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],

[".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]

],

[

[".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],

[".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],

[".../modules/monitor/bot/schedule.py",51,"run","task.run()"],

[".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],

[".../modules/monitor/bot/task.py",18,"run","self.check()"],

[".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],

[".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],

[".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],

[".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]

],

[

[".../embedded/lib/python2.7/threading.py",774,"__bootstrap","self.__bootstrap_inner()"],

[".../embedded/lib/python2.7/threading.py",801,"__bootstrap_inner","self.run()"],

[".../modules/monitor/bot/schedule.py",51,"run","task.run()"],

[".../modules/monitor/bot/task.py",50,"run","super(RepeatTask, self).run()"],

[".../modules/monitor/bot/task.py",18,"run","self.check()"],

[".../modules/monitor/checks/collector.py",223,"wrapper","_check.run()"],

[".../modules/monitor/checks/__init__.py",630,"run","self._roll_up_instance_metadata()"],

[".../modules/monitor/checks/__init__.py",498,"_roll_up_instance_metadata","dict((k, v) for (k, v) in self._instance_metadata))"],

[".../modules/monitor/tracer.py",33,"__init__","self.trace_info = traceback.extract_stack()"]

],

...

重播

我们不提“做好设计审查和规范审查”、“加强试验阶段质量检验工作”等“老生常谈”,也值得我们反思。

要彻底防止和控制内存泄漏几乎是不可能的,像rust这样的安全编程语言也不能保证程序不会泄漏内存。

许多引发内存不安全的行为,如数组访问越界、访问释放后的内存等,都可以通过制定更严格的编程模型(如rust提出的所有权+生命周期规则)甚至数据竞争问题来避免。

然而,触发内存泄漏的行为,如竞争条件,需要开发人员将开发组件和业务规则结合起来。设想一个需要手动触发刷新的数据队列。结果,我们在推送数据时忘记调用它。这种内存泄漏无法通过任何常规检查规则来识别。

关键字函数是为了更形象地说明传入参数的位置和具体用法。如果一个函数有四个或五个参数,而且一次传入的参数太多,那么很难让人眼花缭乱。如果key=value用于传入。

总结

通过本节的学习,我们了解了通过if else在不同条件下控制代码流和执行不同代码。for/while和如何定义函数有两种不同的循环方法,包括函数的返回值和参数传递方法、position参数传递和向函数传递参数时的key=value参数传递。

python tracer函数_Python流程控制常用工具和函数定义相关推荐

  1. python流程控制-Python流程控制常用工具详解

    在我们的工作中,我们使用ddagent ver.5作为收集工具,收集和报告托管服务器的性能指标,并对ddagent进行一定程度的定制.经过多次功能迭代,发现一批在线运行时间长的托管服务器占用了太多内存 ...

  2. 14 MySQL--事务函数与流程控制

    一.事务 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性. 一堆sql语句:要么同时执行成功,要么同时失败 # 事务的原子性场景: ...

  3. Python期末复习题:流程控制

    Python期末复习题:流程控制 文章目录 Python期末复习题:流程控制 一.成绩转换 二.Leibniz公式计算圆周率 三.输出回文素数 四.输出该日期是这一年的第几天 一.成绩转换 请编写一个 ...

  4. 08. 函数和流程控制

    函数和流程控制 -- 临时把语句结束 ; 改为以 $$ DELIMITER $$ SELECT * FROM student$$ DELIMITER ; -- 改回来 -- 函数格式 -- DELIM ...

  5. 变量、函数、流程控制与游标

    实验七:变量.函数.流程控制与游标 实验内容与完成情况(记录所有的实验过程): 1. 使用局部变量.全局变量 (1)定义一个tinyint的整型变量,为其赋值68,并显示变量的值. declare @ ...

  6. Shell之函数及流程控制语序

    Shell之函数及流程控制语序 脚本中的函数 作用: 把一个复杂的语句块定义成一个字符串的方法 把一个脚本写成一个变量,用变量去调动程序 例如: 一个重复检测网络是否畅通的脚本: #!/bin/bas ...

  7. 【Android 逆向】函数拦截实例 ( 函数拦截流程 | ① 定位动态库及函数位置 )

    文章目录 一.函数拦截流程 二.定位动态库及函数位置 一.函数拦截流程 函数拦截流程 : 定位动态库及函数位置 : 获取该动态库在内存中的位置 , 以便于 查找函数位置 ; 插桩 : 在函数的入口处插 ...

  8. python:基础知识—流程控制—函数与模块—数据结构—类与GUI和Turtle—异常处理与文件,概括全书(上万字最详细版)

    这里是一张夜景,给大家放松一下. !!无锡南长街 文章目录 模块一:基础知识 1.python语言 2.常见数字类型 3.字符串 4.数字类型转换 5.标识符命名 6.常见关键字 7.运算符与表达式 ...

  9. python语言流程控制语句的格式while循环_Python流程控制-while循环-for循环

    写重复代码 是可耻的行为 -------------- 完美的分割线  -------------- 程序在一般情况下是按顺序执行的,编程语言提供了各种控制结构,允许更复杂的执行路径. 循环(loop ...

最新文章

  1. Rust和C / C ++的跨语言链接时间优化LTO
  2. 三维感知,这些干货足够了!(自动驾驶/三维重建/SLAM/点云/标定/深度估计/3D检测)...
  3. Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】...
  4. python在财务上的应用-python 与财务
  5. docker-compose报错:(root) Additional property mail-service is not allowed
  6. 3、HTML导入外部样式表(HTML导入CSS文件)
  7. 中职计算机专业英语说课稿,高职高专英语说课稿
  8. 菜鸟程序员如何提升自己的潜在价值
  9. python类属性数据三维图_Python图表属性
  10. paip.php-gtk 桌面程序 helloworld总结
  11. Java连接数据库驱动包下载
  12. 软考软件设计师下午真题-面向对象的程序设计与实现-访问者设计模式(2015年上半年试题六)Java代码讲解
  13. 计算机软件研究方法与技术路线,项目的研究方法与技术路线
  14. 新浪微博开放平台第三方登陆请求授权出现错误码:21322(重定向地址不匹配)的解决方法
  15. 阿里云轻量应用服务器如何升级?
  16. CentOS中使用VeraCrypt(四):进阶操作
  17. Java实现图片的镜像处理
  18. v90绝对值编码器回零_由“V90使用绝对值编码器掉电后位置丢失”所想到的
  19. 2022年测绘资质怎么办理及办理流程?
  20. MySQL入门学习之——MySQL Cluster初体验

热门文章

  1. UITableView长按拖动排序(支持不同行高,不同section间交换)
  2. 美国Vitamix亮相2017上海AWE,绽放百年料理机品牌魅力
  3. Android View之用户界面...
  4. 在Mac OS X 10.10.3下使用源码包编译安装GCC5.1
  5. Android下pm命令详解
  6. Widows Live Writer
  7. ASP.NET 配置概览
  8. 15.分布式文档系统-document id的手动指定与自动生成两种方式解析
  9. 14.初步解析document的核心元数据以及图解剖析index创建反例
  10. php天津旅游设计网站作品