Glibc內存管理--ptmalloc2源代碼分析

【轉】 http://mqzhuang.iteye.com/blog/1014287

Ptmalloc主要提供以下幾個配置選項用於調優,這些選項可以通過mallopt()進行設置:

1.    M_MXFAST

M_MXFAST用於設置fast bins中保存的chunk的最大大小,默認值爲64B,fast bins中保存的chunk在一段時間內不會被合併,分配小對象時可以首先查找fast bins,如果fast bins找到了所需大小的chunk,就直接返回該chunk,大大提高小對象的分配速度,但這個值設置得過大,會導致大量內存碎片,並且會導致ptmalloc緩存了大量空閒內存,去不能歸還給操作系統,導致內存暴增。

M_MXFAST的最大值爲80B,不能設置比80B更大的值,因爲設置爲更大的值並不能提高分配的速度。Fast bins是爲需要分配許多小對象的程序設計的,比如需要分配許多小struct,小對象,小的string等等。

如果設置該選項爲0,就會不使用fast bins。

 

2.    M_TRIM_THRESHOLD

M_TRIM_THRESHOLD用於設置mmap收縮閾值,默認值爲128KB。自動收縮只會在free時才發生,如果當前free的chunk大小加上前後能合併chunk的大小大於64KB,並且top chunk的大小達到mmap收縮閾值,對於主分配區,調用malloc_trim()返回一部分內存給操作系統,對於非主分配區,調用heap_trim()返回一部分內存給操作系統,在發生內存收縮時,還是從新設置mmap分配閾值和mmap收縮閾值。

         這個選項一般與M_MMAP_THRESHOLD選項一起使用,M_MMAP_THRESHOLD用於設置mmap分配閾值,對於長時間運行的程序,需要對這兩個選項進行調優,儘量保證在ptmalloc中緩存的空閒chunk能夠得到重用,儘量少用mmap分配臨時用的內存。不停地使用系統調用mmap分配內存,然後很快又free掉該內存,這樣是很浪費系統資源的,並且這樣分配的內存的速度比從ptmalloc的空閒chunk中分配內存慢得多,由於需要頁對齊導致空間利用率降低,並且操作系統調用mmap()分配內存是串行的,在發生缺頁異常時加載新的物理頁,需要對新的物理頁做清0操作,大大影響效率。

         M_TRIM_THRESHOLD的值必須設置爲頁大小對齊,設置爲-1會關閉內存收縮設置。

         注意:試圖在程序開始運行時分配一塊大內存,並馬上釋放掉,以期望來觸發內存收縮,這是不可能的,因爲該內存馬上就返回給操作系統了。

 

3.    M_MMAP_THRESHOLD

M_MMAP_THRESHOLD用於設置mmap分配閾值,默認值爲128KB,ptmalloc默認開啓動態調整mmap分配閾值和mmap收縮閾值。

當用戶需要分配的內存大於mmap分配閾值,ptmalloc的malloc()函數其實相當於mmap()的簡單封裝,free函數相當於munmap()的簡單封裝。相當於直接通過系統調用分配內存,回收的內存就直接返回給操作系統了。因爲這些大塊內存不能被ptmalloc緩存管理,不能重用,所以ptmalloc也只有在萬不得已的情況下才使用該方式分配內存。

但使用mmap分配有如下的好處:

l   Mmap的空間可以獨立從系統中分配和釋放的系統,對於長時間運行的程序,申請長生命週期的大內存塊就很適合有這種方式。

l   Mmap的空間不會被ptmalloc鎖在緩存的chunk中,不會導致ptmalloc內存暴增的問題。

l   對有些系統的虛擬地址空間存在洞,只能用mmap()進行分配內存,sbrk()不能運行。

使用mmap分配內存的缺點:

l   該內存不能被ptmalloc回收再利用。

l   會導致更多的內存浪費,因爲mmap需要按頁對齊。

l   它的分配效率跟操作系統提供的mmap()函數的效率密切相關,Linux系統強制把匿名mmap的內存物理頁清0是很低效的。

所以用mmap來分配長生命週期的大內存塊就是最好的選擇,其他情況下都不太高效。

 

4.    M_MMAP_MAX

M_MMAP_MAX用於設置進程中用mmap分配的內存塊的最大限制,默認值爲64K,因爲有些系統用mmap分配的內存塊太多會導致系統的性能下降。

如果將M_MMAP_MAX設置爲0,ptmalloc將不會使用mmap分配大塊內存。

         Ptmalloc爲優化鎖的競爭開銷,做了PER_THREAD的優化,也提供了兩個選項,M_ARENA_TEST和M_ARENA_MAX,由於PER_THREAD的優化默認沒有開啓,這裏暫不對這兩個選項做介紹。

         另外,ptmalloc沒有提供關閉mmap分配閾值動態調整機制的選項,mmap分配閾值動態調整時默認開啓的,如果要關閉mmap分配閾值動態調整機制,可以設置M_TRIM_THRESHOLD,M_MMAP_THRESHOLD,M_TOP_PAD和M_MMAP_MAX中的任意一個。但是強烈建議不要關閉該機制,該機制保證了ptmalloc儘量重用緩存中的空閒內存,不用每次對相對大一些的內存使用系統調用mmap去分配內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章