2016-02-26 166 views
9

減少內存碎片我一直在試用MALLOC_MMAP_THRESHOLD_和MALLOC_MMAP_MAX_ env變量來影響長時間運行的Python 2進程中的內存管理。 見http://man7.org/linux/man-pages/man3/mallopt.3.html使用MALLOC_MMAP_THRESHOLD_和MALLOC_MMR_HOLD_和MALLOC_MMAP_MAX_

我的想法從這個錯誤報告:http://bugs.python.org/issue11849

我已經是令人鼓舞的成績:內存碎片減少和長時間運行的過程中使用的典型的高水位標記在內存中可見較低。

我唯一擔心的是如果在使用這種低級別的調整時可能會反彈的其他副作用。有沒有人有使用它們的經驗?

這裏有一個例子腳本,顯示這些變量如何產生大辭典腳本影響RSS內存: https://gist.github.com/lbolla/8e2640133032b0a6bb9c 只要運行「alloc.sh」和比較輸出。這裏是我的輸出:

MALLOC_MMAP_THRESHOLD_=None MALLOC_MMAP_MAX_=None 
N=9 RSS=120968 
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=None 
N=9 RSS=157008 
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=None 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=None 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=None 
N=9 RSS=98496 
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=None 
N=9 RSS=98528 
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=0 
N=9 RSS=121008 
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=0 
N=9 RSS=121008 
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=0 
N=9 RSS=121012 
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=0 
N=9 RSS=121000 
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=0 
N=9 RSS=121008 
MALLOC_MMAP_THRESHOLD_=512 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=157004 
MALLOC_MMAP_THRESHOLD_=1024 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=2048 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98484 
MALLOC_MMAP_THRESHOLD_=4096 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98496 
MALLOC_MMAP_THRESHOLD_=100000 MALLOC_MMAP_MAX_=16777216 
N=9 RSS=98528 

正如你所看到的,在這個例子中,RSS使用比香草Python少了20%。

+0

解決此問題的一種方法是執行分支進程中的工作,然後退出。 – o9000

+0

@ o9000我不能那樣做,因爲有問題的進程是長期運行的。這是一個服務器,應該在那裏很長一段時間。 – lbolla

+0

@Iolla你甚至可以在服務器的情況下做到這一點。從服務器進程分叉,運行內存分配操作,從分叉進程返回到服務器進程,終止分叉進程,並將結果返回給請求它的客戶端。現在,這並不意味着你已經解決了這個問題。也許輸入和輸出非常大,無論如何都需要在服務器上分配大量內存。 YMMV,但你可以做到。 – marr75

回答

3

現在正在生產這個調整很長一段時間,沒有問題。 因此,在某些情況下,我認爲在長時間運行的Python進程中提高內存使用率是一個可行的選擇。