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