Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以监视分叉linux进程的写时拷贝?(特别是python)_Python_Linux_Memory Leaks_Fork - Fatal编程技术网

是否可以监视分叉linux进程的写时拷贝?(特别是python)

是否可以监视分叉linux进程的写时拷贝?(特别是python),python,linux,memory-leaks,fork,Python,Linux,Memory Leaks,Fork,我有一组python进程,它们共享一个大对象(共享是通过在初始化对象后分叉进程来完成的) 我注意到一个奇怪的内存泄漏: 进程内存(VSZ和RSS)几乎没有变化 系统内存总量稳步增加 我的猜测是共享对象确实发生了变化(它是“逻辑上”只读的,但某些内部私有变量可能在仅仅从它读取时也会发生变化),这会导致内存页被复制 是否有方法验证此内容?要回答您的特定问题“是否有方法验证此内容?”,如果我理解正确,您可以执行以下操作,以查看是否存在与包含大对象的页面相关的任何更改 1) 确定“大型共享对象”的地

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

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

  • 进程内存(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()
手动触发垃圾收集。关于引用计数的引用很可能是最好的解释