是否可以监视分叉linux进程的写时拷贝?(特别是python)
我有一组python进程,它们共享一个大对象(共享是通过在初始化对象后分叉进程来完成的) 我注意到一个奇怪的内存泄漏:是否可以监视分叉linux进程的写时拷贝?(特别是python),python,linux,memory-leaks,fork,Python,Linux,Memory Leaks,Fork,我有一组python进程,它们共享一个大对象(共享是通过在初始化对象后分叉进程来完成的) 我注意到一个奇怪的内存泄漏: 进程内存(VSZ和RSS)几乎没有变化 系统内存总量稳步增加 我的猜测是共享对象确实发生了变化(它是“逻辑上”只读的,但某些内部私有变量可能在仅仅从它读取时也会发生变化),这会导致内存页被复制 是否有方法验证此内容?要回答您的特定问题“是否有方法验证此内容?”,如果我理解正确,您可以执行以下操作,以查看是否存在与包含大对象的页面相关的任何更改 1) 确定“大型共享对象”的地
- 进程内存(VSZ和RSS)几乎没有变化
- 系统内存总量稳步增加
是否有方法验证此内容?要回答您的特定问题“是否有方法验证此内容?”,如果我理解正确,您可以执行以下操作,以查看是否存在与包含大对象的页面相关的任何更改 1) 确定“大型共享对象”的地址以及该对象结束的地址 2) 如果起始地址不在4K页面边界上,请在对象开始之前将起始地址向下舍入到页面边界 3) 如果结束地址不在4K边界上,则将结束地址四舍五入到对象结束后的页面边界 4) 将进程及其所有子进程的内存范围转储到单独的文件中并进行比较 然而,我认为这可能已经为至少一些需要复制的文字提供了解释。具体来说,python对象是引用计数的,您的子进程将改变引用计数
您是否考虑过使用python的线程而不是创建子进程?您可以尝试以下方法:
dtrace -n wp_page_copy:entry'/pid == 11111/ { @counts[ustack()] = count(); }'
不确定
wp\u page\u copy
是否仅限于在写时复制期间使用。我似乎记得读过这本书,但我不会在没有确认的情况下打赌。您需要将11111更改为python pid。什么类型的对象?名单?口述?熊猫数据帧?您有权访问源代码吗?(对象的)数据帧是否与此相关?如果是这样的话,那么这可能是特定于操作系统的,您可以尝试在完成一段时间的工作后通过执行gc.collect()
手动触发垃圾收集。关于引用计数的引用很可能是最好的解释