是否可以监视派生的linux进程的写副本? (特别是python)

时间:2018-06-26 07:13:58

标签: python linux memory-leaks fork

我有一组共享一个大对象的python进程(共享是通过在初始化该对象后分叉这些进程来完成的)

我注意到一个奇怪的内存泄漏:

  • 进程内存(VSZ和RSS)几乎不变
  • 系统总内存稳步增长

我的猜测是共享对象确实发生了变化(“逻辑上”是只读的,但是即使只是从中读取,某些内部私有变量也可能会发生变化)-这会导致复制内存页

有没有办法验证这一点?

2 个答案:

答案 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。

相关问题