[英]private memory of an empty python process forked by Python multiprocessing
我正在通過Python多處理創建多個子進程,但是這些子進程即使在為空進程時也會占用大量堆專用內存。 在啟用了THP(透明大頁面)的RHEL上運行時,這種情況變得越來越糟。
這是一個演示的簡單示例:
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
私人骯臟:4120 kB
參考:4120 kB
匿名:4120 kB
頁面數:0 kB
內核頁面大小:4 kB
子進程堆內存:
006cc000-00be4000 rw-p 00000000 00:00 0 [堆]
大小:5216 kB
Rss:4396 kB
積分:2530 kB
Shared_Dirty:3732 kB
私人_臟:664 kB
參考:676 kB
匿名:4396 kB
頁面數:0 kB
內核頁面大小:4 kB
每個過程中的主要內容之一是Python解釋器/ VM。 如果這是C程序,您會看到截然不同的畫面,但是即使使用“空” Python進程,除非使用線程,否則仍會產生解釋器的開銷。 每個Python解釋器都有大量的堆,堆棧和代碼,Python的多重處理是Linux進程的包裝(據我所知)。 所以基本上您正在處理fork()
。 分叉新進程意味着您將獲得一個新的Python解釋器。 即使操作系統對於“寫時復制”非常聰明,但Python解釋器的開銷還是會增加的。
我的建議是嘗試使用Python線程,或將其切換為非解釋語言以減少進程開銷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.