我有一组共享一个大对象的python进程(共享是通过在初始化该对象后分叉这些进程来完成的)
我注意到一个奇怪的内存泄漏:
我的猜测是共享对象确实发生了变化(“逻辑上”是只读的,但是即使只是从中读取,某些内部私有变量也可能会发生变化)-这会导致复制内存页
有没有办法验证这一点?
答案 0 :(得分:1)
要回答您的特定问题“是否有办法对此进行验证?”,如果我正确理解的话,如果要查看包含大对象的页面是否有任何关联,可以执行以下操作。
1)确定“大型共享对象”的地址以及该对象结束的地址。
2)如果起始地址不在4K页面边界上,则将起始地址向下舍入到对象开始之前的页面边界。
3)如果结束地址不在4K边界上,则将结束地址向上舍入到对象结束后的页面边界。
4)将进程及其所有子进程的内存范围转储到单独的文件中并进行比较。
但是,我认为Will os.fork() use copy on write or do a full copy of the parent-process in Python?已经为至少需要复制的某些著作提供了解释。具体来说,python对象是引用计数,您的子进程将更改引用计数。
您是否考虑过使用python的线程而不是创建子进程?
答案 1 :(得分:0)
您可以尝试以下操作:
dtrace -n wp_page_copy:entry'/pid == 11111/ { @counts[ustack()] = count(); }'
不确定wp_page_copy
是否仅限于在写时复制期间使用。我似乎想起曾经读过它,但是如果没有证实,我不会打赌。您需要将11111更改为python pid。