V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Buffer2Disk
V2EX  ›  程序员

Python 程序内存泄漏,有什么好的排查方法吗?

  •  
  •   Buffer2Disk · 2018-10-08 21:08:06 +08:00 · 4320 次点击
    这是一个创建于 2016 天前的主题,其中的信息可能已经有所发展或是发生改变。

    线上的一台机器出现了内存泄漏的情况(内存 2G,htop 发现 Python 程序占用内存 200M,但是 free -m 发现真实使用内存达到了 1G )。

    想要找一款工具能够动态检测内存的,找到了这 2 个 pyrasite 和 memory_profiler

    第一个 pyrasite 安装极其麻烦,环境都是 centos6,有的机器能装上,有的装不上(依赖问题,要装的依赖软件很多), 装的上的机器使用后看了下,内存检测结果发现,dict 字典占用的内存最多,但是装上的这台机器不具有参考价值,因为不是线上的机器(线上那台装不上 pyrasite)

    第二个 memory_profiler 很强大,能检测到每行代码使用的内存变化情况,是使用 @profile 装饰器的,但是我发现这个好像每次只能检测一个 Python 文件? 没法检测整个项目里面加了 @profile 装饰器的吗?可能是我用法不对?

    想问下各位,Python 有没有什么好的排查方法来解决这种内存泄漏问题的

    8 条回复    2018-10-09 10:16:23 +08:00
    likuku
        1
    likuku  
       2018-10-08 21:26:34 +08:00
    htop/top 显示出的 python 内存占用你不信任它么?占用 200M 不多啊。

    linux 物理内存也不完全给 top 可见的进程用的。

    top 看看,频繁 I/O 时,程序运行时,闲置内存都会尽可能拿来用作系统 cache 和 buff

    内存泄露是这样定义的么?我怎么记得是:“某进程 /程序 随着运行时长增加,占用的内存持续增长,不释放内存 /释放内存速度小于新申请内存速度,最终耗尽系统内存"。
    Buffer2Disk
        2
    Buffer2Disk  
    OP
       2018-10-08 22:41:32 +08:00
    @likuku 重启 Python 进程后,系统真实使用内存 立马减少了 800M,所以我才判断是 python 程序内存泄漏了
    Buffer2Disk
        3
    Buffer2Disk  
    OP
       2018-10-08 22:42:35 +08:00
    @likuku 不是 cache 和 buffer

    total used free shared buffers cached
    Mem: 1926 1735 190 0 117 323
    -/+ buffers/cache: 1295 631
    Swap: 3999 0 3999
    loqixh
        4
    loqixh  
       2018-10-08 22:48:49 +08:00   ❤️ 1
    htop 显示出内存应该是你的真实内存占用, 重启 Python 立马减少, 是不是句柄泄漏, 占用了内核内存? 如果是这样的话用 pyrasite 和 memory_profiler 也是检测不到的
    Buffer2Disk
        5
    Buffer2Disk  
    OP
       2018-10-08 23:57:06 +08:00
    @loqixh 改了下代码,好像是 log 模块导致的。。。?

    最近在查另外一个 MySQL 连接的问题,所以在 for 循环里面打印了很多的 log,现在删掉这些 log 的代码,看起来好像正常了,内存没有暴增的现象
    samray
        6
    samray  
       2018-10-09 00:49:43 +08:00
    Buffer2Disk
        7
    Buffer2Disk  
    OP
       2018-10-09 10:12:45 +08:00
    @samray 大佬,你没审题啊,我要的检测内存占用的,你发的这个工具是分析时间占用的
    Buffer2Disk
        8
    Buffer2Disk  
    OP
       2018-10-09 10:16:23 +08:00
    @loqixh 如果是句柄泄漏的话,有什么好的排查方法吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4083 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 04:14 · PVG 12:14 · LAX 21:14 · JFK 00:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.