我通过Python多进程创建了多个子进程,但是这些子进程甚至在它们是空进程时也使用很多堆私有内存。在启用THP(透明巨大页面)的RHEL上运行时,情况会变得更糟。python多进程分叉的空python进程的私有内存
- 什么是在一个空的子进程的堆私人内存?
- 在linux下COW(copy-on-write),不应该子进程共享所有的内存,因为它不会创建/修改任何mem页面?或者子进程是 ,试图修改/写入mem页,然后尝试 修改/写什么样的数据?
- 或者它是由于像python对象引用计数或什么?
下面是一个简单的例子来演示这一点:
import os
import multiprocessing
print parent process's heap memory in /proc/<pid>/smaps
def emptyProcess():
print child process's heap memory in /proc/<pid>/smaps
return
multiprocessing.Process(name='p1', target=emptyProcess).start()
输出:
parent: pid: 20920: rss:8228864, shr:2781184, priv:5447680, swap:0, pss:6154240
child: pid: 20921: rss:6397952, shr:5472256, priv:925696, swap:0, pss:3381248
在子进程的私法内存什么的(925696B,或堆664KB)?
父进程的堆内存:
006cc000-00be4000 RW-P 00000000 00:00 0 [堆]
大小:5216 KB
RSS:4120 KB
Pss:4120 kB
Shared_Dirty:0 KB
Private_Dirty:4120 KB
引用:4120 KB
匿名:4120 KB
AnonHugePages:0 KB
KernelPageSize:4 KB
子进程堆内存:
006cc000-00be4000 RW-P 00000000 00:00 0 [堆]
大小:5216 KB
RSS:4396 KB
PSS的: 2530 kB
Shared_Dirty:3732 kB
Private_Dirty:664 KB
引用:676 KB
匿名:4396 KB
AnonHugePages:0 KB
KernelPageSize:4 KB
感谢梅尔文,但如果我在分叉新子进程之前在父进程中分配一个大内存(〜2GB,复杂的python对象),新分叉子进程的私有内存将增加到100MB,任何想法都可以解释这个? – qingpeng
私人内存增加到100MB?我不确定我是否遵守,如果它在叉之前是2GB,它会增加到什么后面? – codenheim