簡體   English   中英

Python多處理分叉的空python進程的私有內存

[英]private memory of an empty python process forked by Python multiprocessing

我正在通過Python多處理創建多個子進程,但是這些子進程即使在為空進程時也會占用大量堆專用內存。 在啟用了THP(透明大頁面)的RHEL上運行時,這種情況變得越來越糟。

  • 空子進程的堆專用內存中有什么?
  • 在Linux COW(寫時復制)下,子進程不應該共享所有內存,因為它沒有創建/修改任何內存頁嗎? 還是子進程試圖修改/寫入內存頁面,那么它試圖修改/寫入哪種數據?
  • 還是由於類似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

私人骯臟: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM