2015-08-28 78 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