调试 CPython 内存碎片

cru*_*rky 6 python garbage-collection

我有一个长期运行的 CPython 3.8 进程。过了一会儿,它使用了大量的 RAM。我试过了

  1. 运行 gc.collect()
  2. 使用 pympler 发现所有已知的 Python 对象
import gc
import psutil
from pympler import muppy, summarize

gc.collect()
total_ram = psutil.Process().memory_info().rss
all_objects = muppy.get_objects(include_frames=True)
s = summary.summarize(all_objects)
python_objects_size = sum(row[2] for row in s)
Run Code Online (Sandbox Code Playgroud)

输出:102 MiB Python 对象,824 MiB RSS 内存!

[编辑] 3. 使用 tracemalloc; 它还返回价值约 100MiB 的 Python 对象

[编辑 2]export PYTHONMALLOC=malloc没有解决问题。

有没有办法查询 CPython 内存管理器来找出

  • 它持有多少 RAM,以便我可以从 RSS 中减去它并找出是否有任何未使用 PyMem_Malloc 并且正在泄漏的 C 库
  • 为什么它持有内存(例如,由于一个 20 字节的 PyObject 仍在被引用,因此发现它持有一个 64kb 的页面)
  • 识别调用 PyMem_Malloc 并且此后从未释放内存的 C 模块
  • 跟踪操作系统级别的 malloc() 和 free() 并将它们与 pymalloc 执行的进行交叉比较,以确定是否有一个 C 库不是使用 PyMem_Malloc 分配内存

有关的

小智 0

也许尝试不同的内存调试器。可以将valgrind与 python 一起使用。