当前位置: 首页 > news >正文

Python Flask内存泄漏分析定位

通过蓝图注册内存跟踪分析接口

示例代码如下,开启内存分析跟踪需要在Flask服务启动前注入环境变量
export PYTHONTRACEMALLOC=1

from typing import Literal
from flask import Blueprint, jsonify, request
import tracemalloc
import os
import linecachesnapshot = None
run_path = os.path.dirname(__file__) # 根据实际需要修改为项目目录,目的是方便后续只追踪本项目的内存泄漏app_bus_blueprint = Blueprint('memory', __name__)def filter_traces(snapshot: tracemalloc.Snapshot, left_trace:Literal['only my code', 'all', 'beside my code']='only my code'):filter_list = (# tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),# tracemalloc.Filter(False, "<unknown>"),# tracemalloc.Filter(False, "<frozen importlib._bootstrap_external>"),tracemalloc.Filter(False, tracemalloc.__file__),tracemalloc.Filter(False, linecache.__file__),tracemalloc.Filter(False, f"*.vscode-server*"),# tracemalloc.Filter(True, jober.__file__),)trace_store = {'only my code': (tracemalloc.Filter(True, f"{run_path}*"),),'all': (),'beside my code':(tracemalloc.Filter(False, f"{run_path}*"),)}filter_list = filter_list + trace_store[left_trace]snapshot = snapshot.filter_traces(filter_list)return snapshotdef display_top(snapshot: tracemalloc.Snapshot, key_type='lineno', limit=30):lines = []# snapshot = filter_traces(snapshot)top_stats = snapshot.statistics(key_type)lines.append("Top %s lines" % limit)for index, stat in enumerate(top_stats[:limit], 1):frame = stat.traceback[0]lines.append("#%s: %s:%s: %.1f KiB"% (index, frame.filename, frame.lineno, stat.size / 1024))# lines.extend(stat.traceback.format())line = linecache.getline(frame.filename, frame.lineno).strip()if line:lines.append('    %s' % line)lines.append('---------------------------------')other = top_stats[limit:]if other:size = sum(stat.size for stat in other)lines.append("%s other: %.1f KiB" % (len(other), size / 1024))total = sum(stat.size for stat in top_stats)lines.append("Total allocated size: %.1f KiB" % (total / 1024))return linesif str(os.getenv('PYTHONTRACEMALLOC', 0)) == '1':tracemalloc.start(25)@app_bus_blueprint.route('/memory_snapshot', methods=['POST', 'GET'], strict_slashes=False)def memory_snapshot():is_compare = isinstance(request.args.get('compare', False), str)global snapshotif not snapshot:snapshot = tracemalloc.take_snapshot()snapshot = filter_traces(snapshot)return "Taken snapshot."else:lines = []snapshot_current = tracemalloc.take_snapshot()snapshot_current = filter_traces(snapshot_current)if is_compare:top_stats = snapshot_current.compare_to(snapshot, 'lineno')# 过滤出只有增长的内存分配increased_stats = [stat for stat in top_stats if stat.size_diff > 0]# 取出增长最多的前10条数据top_increased_stats = sorted(increased_stats, key=lambda stat: stat.size_diff, reverse=True)for stat in top_increased_stats[:20]:lines.append("%s memory blocks: %.1f KiB" % (stat.count, stat.size / 1024))lines.extend(stat.traceback.format())# lines.append(str(stat))lines.append('-----------------------------------')total_increased = sum(stat.size_diff for stat in top_increased_stats)total_decreased = sum(stat.size_diff for stat in top_stats if stat.size_diff < 0)totol_allocated = sum(stat.size for stat in top_stats)lines.append(f"Total increased size: {total_increased / 1024:.1f} KiB")lines.append(f"Total decreased size: {total_decreased / 1024:.1f} KiB")lines.append(f"Absolute change size: {(total_increased + total_decreased) / 1024:.1f} KiB")lines.append(f"Total allocated size: {totol_allocated / 1024:.1f} KiB")else:lines = display_top(snapshot_current, key_type='traceback')snapshot = snapshot_currentreturn jsonify(lines)

通过trace filter,可以选择’only my code’, ‘all’, 'beside my code’三种trace筛选策略,意思为:只跟踪我的工作区代码,所有,非我的代码/第三方包。

参考文章:

  1. 获取一个内存块的溯源;
  2. 定位python内存泄漏问题

http://www.mrgr.cn/news/60322.html

相关文章:

  • gateway 整合 spring security oauth2
  • 远程:HTTP基本身份验证失败。提供的密码或令牌不正确,或者您的账户启用了两步验证,您必须使用个人访问令牌而不是密码。
  • 树莓派用代理上网
  • Halcon 3D分割,筛选,矫正
  • FPGA采集adc,IP核用法,AD驱动(上半部分)
  • web3对象如何连接以太网络节点
  • Vue前端开发:数据绑定方法
  • php伪协议和move_uploaded_file、rename、copy等文件操作
  • 从0到1,搭建vue3项目
  • 单应性矩阵与相机内外参之间的关系
  • [Mv]_× = M [v]_× M^T的证明
  • flowable 去掉自带的登录权限
  • 基本法代码阅读
  • UDS诊断刷写–跳转执行
  • Sigrity Power SI Noise coupling analysis模式如何观测PDN系统的交流耦合噪声以及平面间电压波动操作指导(二)
  • 未定义项目JDK 解决办法
  • C语言数据结构学习:单链表
  • python3的基本数据类型:Bool(布尔类型)
  • Screen简介和使用
  • Notepad++如何同时检索多个关键字
  • Python自动化个人健康日志与建议:记录日常活动并提供建议
  • Javascript高级:正则表达式基础与应用
  • OOP特性 多态
  • c语言错题——#define对应的查找替换
  • 【JavaEE】【多线程】线程池
  • WebGIS开发之编辑功能(分割、融合、捕捉、追踪)