天天看点

使用 filprofiler 分析器调试 Python 内存不足崩溃

使用 Fil 检测程序的内存使用量

运行你的 Python 程序,它崩溃了——它的内存不足。这只是​​您的程序在内存不足情况下可能失败​​​的​​多种方式​​之一。

你怎么知道是什么用完了你的程序的所有内存?

一种方法是使用开源 Fil 内存分析器,它专门支持调试内存不足崩溃。 让我们看看如何使用它。

一个例子

考虑以下 Python 程序:

import numpy as np

ALLOCATIONS = []


def add1(x):
    ALLOCATIONS.append(np.ones((1024 * 1024 * x)))


def add2():
    add1(5)
    add1(2)


def main():
    while True:
        add2()
        add1(3)
        x = np.ones((1024 * 1024,))


if __name__ == '__main__':
    main()      

当我运行这个程序时,进程被 Linux 内存不足杀手杀死。不打印回溯。

$ python oom.py
Killed      

现在,在这种情况下,程序足够简单,您可以通过读取它来找出内存泄漏,但真正的程序不会那么容易。所以你想要的是一个帮助你调试情况的工具,一个像 Fil 内存分析器这样的工具。

使用 Fil 内存分析器

为了帮助您调试内存不足的崩溃,​​Fil 内存分析器​​支持在崩溃时转储当前的内存分配。事实上,它会尽最大努力及早发现问题,在您的计算机大幅减速或您的进程被操作系统杀死之前。

让我们看看你如何使用 Fil 来调试它。

首先,在 virtualenv 中使用 pip 安装 Fil(目前仅适用于 Linux 和 macOS):

$ pip install --upgrade pip
$ pip install filprofiler      

确保您使用的是 v0.14.1 或更高版本,因为这包括改进的内存不足检测。

接下来,我们在 filprofiler 下运行程序。filprofiler 检测内存不足情况并写出一份报告,说明进行了哪些内存分配导致内存不足:

$ fil-profile run oom.py 
...
=fil-profile= Wrote memory usage flamegraph to fil-result/2020-06-15T12:37:13.033/out-of-memory.svg
=fil-profile= Wrote memory usage flamegraph to fil-result/2020-06-15T12:37:13.033/out-of-memory-reversed.svg      

filprofiler 会在当前文件夹下面生成一个fil-result文件夹,在里面会有一个以时间命名的文件夹,文件夹中会有两个svg文件,如下图所示: 

使用 filprofiler 分析器调试 Python 内存不足崩溃

这是​

​out-of-memory.svg​

​看起来的样子:

使用 filprofiler 分析器调试 Python 内存不足崩溃

正如你所看到的,这个节目正是所有的记忆都来自于工艺运行内存不足的时间。这意味着您现在有了减少内存使用量的起点。

此外,如果内存不足,Fil 将始终以退出代码 53 退出,如果您以自动方式运行它,则可以轻松识别内存不足问题。

内存占用太高?

Fil 可以帮助您找出崩溃的程序在哪里分配内存。但它也可以通过测量​​数据处理程序的峰值使用来​​​帮助您处理非崩溃​​程序​​。