Python多进程脚本中malloc释放内存无法复用问题求助
PyTorch多进程脚本内存异常:已释放内存无法复用(Debian下malloc相关)
我有一个基于PyTorch多进程的Python脚本,依赖部分C/C++库。主循环每次迭代时,top显示内存占用持续增长,但理论上迭代间不应有大对象被持续引用。然而用Python的tracemalloc检测仅显示约100MiB内存占用,top却显示30GiB。
排查结果
为定位问题,让脚本运行1.5次迭代后中止生成core dump,用chap分析得到以下结果:
chap> count used 3547398 allocations use 0xa990c7f0 (2,844,837,872) bytes. chap> count free 34154 allocations use 0x4ff33cc08 (21,461,453,832) bytes. chap> count leaked 41752 allocations use 0x2cef18 (2,944,792) bytes.
可见仅存在少量内存泄漏或被占用,但有近21GB已释放内存。第一次迭代的内存已被标记为释放,但后续无法再使用,表现类似内存泄漏但并非真正泄漏。
假设与环境特征
我的假设:Python多进程与malloc存在异常交互,导致特定进程分配释放的内存无法被其他进程使用,进程结束后该内存也无法被脚本其他部分复用。
环境相关信息:
- 该问题仅在Debian机器出现,CentOS环境下无此问题
- 使用jemalloc时无此问题,因此确定与malloc实现相关
复现代码
mylist = [...] model = PytorchModel() for el in mylist: ds = PytorchDataset() dl = PytorchDataloader(num_workers=32) for x, y in dl: # 用x、y和model执行操作 # x和y最初为C对象,转换为numpy数组后转为torch张量
外层循环每次迭代后,仅model被保留引用,且model不会存储循环内创建的对象,这已被内存分配标记为free所证实。分配内存的进程在第二层循环结束后终止,但它们的"free"内存从未归还系统。
求助建议
目前我陷入了困境,恳请各位提供排查或解决的建议。
内容的提问来源于stack exchange,提问作者florobax
相关产品推荐
相关产品推荐

