2015-08-28 58 views
1

我通过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

回答

1

之一在每个初级事进程是Python解释器/虚拟机。如果这是一个C程序,你会看到一个完全不同的画面,但即使是“空”的Python过程,除非使用线程,否则仍然会导致解释器的开销。每个Python解释器都有一堆堆,堆栈和代码,而且Python的多处理器是Linux进程中的一个封装器(据我所知);所以基本上你正在处理fork()。分叉一个新流程意味着你得到一个新的Python解释器。即使操作系统在Copy On Write方面非常聪明,Python解释器的开销也会增加。

我的建议是尝试Python线程或将其切换为非解释语言以减少进程开销。

+0

感谢梅尔文,但如果我在分叉新子进程之前在父进程中分配一个大内存(〜2GB,复杂的python对象),新分叉子进程的私有内存将增加到100MB,任何想法都可以解释这个? – qingpeng

+0

私人内存增加到100MB?我不确定我是否遵守,如果它在叉之前是2GB,它会增加到什么后面? – codenheim