【发布时间】:2019-05-19 09:02:43
【问题描述】:
我正在尝试在 Python 中的父进程和子进程之间共享对象。为了实现这个想法,我创建了一个简单的 Python 脚本:
from multiprocessing import Process
from os import getpid
import psutil
shared = list(range(20000000))
def shared_printer():
mem = psutil.Process(getpid()).memory_info().rss / (1024 ** 2)
print(getpid(), len(shared), '{}MB'.format(mem))
if __name__ == '__main__':
p = Process(target=shared_printer)
p.start()
shared_printer()
p.join()
代码 sn-p 使用优秀的psutil 库来打印 RSS(驻留集大小)。当我使用 Python 2.7.15 在 OSX 上运行它时,我得到以下输出:
(33101, 20000000, '1MB')
(33100, 20000000, '626MB')
当我在 Ubuntu(Linux 4.15.0-1029-aws #30-Ubuntu SMP x86_64 GNU/Linux)上运行完全相同的 sn-p 时,我得到以下输出:
(4077, 20000000, '632MB')
(4078, 20000000, '629MB')
请注意,子进程的 RSS 在 OSX 上基本为 0MB,与父进程在 Linux 中的 RSS 大小大致相同。我曾假设写时复制行为在 Linux 中以相同的方式工作,并允许子进程引用父进程的大多数页面的内存(可能除了存储对象头部的那个)。
所以我猜这两个系统的写时复制行为存在一些差异。我的问题是:我可以在 Linux 中做些什么来获得类似 OSX 的写时复制行为吗?
【问题讨论】:
-
查看该问题的最佳答案stackoverflow.com/questions/1268252/…
-
可能只是操作系统如何报告 RSS 值的问题?除了查看进程的内存外,还要检查 fork 之前/之后的空闲内存,看看 600MB 是否消失。
-
您所有的库可能都在 CPython for MAC 中静态链接,而不是在 Ubuntu 上?看superuser.com/questions/1162037/…
-
@ShadowRanger 我的第一个想法也是关于 GC,但无论如何行为都是一致的。我认为这与 XNU 系统报告内存的方式有关。请参阅
host_statistics上的this question(由psutil使用)以及为什么其结果跨平台不一致的答案。
标签: python linux shared-memory python-multiprocessing copy-on-write