日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 默认站点!

默认站点

當前位置: 首頁 >

Redis源码分析-TCMalloc

發布時間:2023/11/27 31 豆豆
默认站点 收集整理的這篇文章主要介紹了 Redis源码分析-TCMalloc 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

redis很多地方都在調用zmalloc函數

zmalloc在這里定義zmalloc.c

void *zmalloc(size_t size) {void *ptr = malloc(size+PREFIX_SIZE);if (!ptr) zmalloc_oom_handler(size);
#ifdef HAVE_MALLOC_SIZEupdate_zmalloc_stat_alloc(zmalloc_size(ptr));return ptr;
#else*((size_t*)ptr) = size;update_zmalloc_stat_alloc(size+PREFIX_SIZE);return (char*)ptr+PREFIX_SIZE;
#endif
}


malloc的定義

/* Explicitly override malloc/free etc when using tcmalloc. */
#if defined(USE_TCMALLOC)
#define malloc(size) tc_malloc(size)
#define calloc(count,size) tc_calloc(count,size)
#define realloc(ptr,size) tc_realloc(ptr,size)
#define free(ptr) tc_free(ptr)
#elif defined(USE_JEMALLOC)
#define malloc(size) je_malloc(size)
#define calloc(count,size) je_calloc(count,size)
#define realloc(ptr,size) je_realloc(ptr,size)
#define free(ptr) je_free(ptr)
#endif

?

編譯時的src目錄下的makefile文件中的選項:

ifeq ($(MALLOC),tcmalloc)FINAL_CFLAGS+= -DUSE_TCMALLOCFINAL_LIBS+= -ltcmalloc
endififeq ($(MALLOC),tcmalloc_minimal)FINAL_CFLAGS+= -DUSE_TCMALLOCFINAL_LIBS+= -ltcmalloc_minimal
endififeq ($(MALLOC),jemalloc)DEPENDENCY_TARGETS+= jemallocFINAL_CFLAGS+= -DUSE_JEMALLOC -I../deps/jemalloc/includeFINAL_LIBS+= ../deps/jemalloc/lib/libjemalloc.a -ldl
endif

?

將tcmalloc通過“-ltcmalloc”鏈接器標志接入模塊

Tcmalloc概述
tcmalloc將內存請求分為兩類,大對象請求和小對象請求,大對象為>=32K的對象。|
tcmalloc會為每個線程分配線程局部緩沖
對于小對象請求,可以直接從線程局部緩沖區獲取,如果線程局部緩沖區沒有空閑內存,則從central heap中一次性獲取一連串小對象。
tcmalloc對于小內存,按8的整數次倍分配,對于大內存,按4K的整數次倍分配。
這樣做有兩個好處,一是分配的時候比較快。二是短期的收益比較大,分配的小內存至多浪費7個字節,大內存則4K
當某個線程緩存當緩存中所有對象的總共大小超過2MB的時候,會對他進行垃圾收集。垃圾收集閾值會自動根據線程數量的增加而減少,這樣就不會因為程序有大量線程而過度浪費內存。

內存泄露檢測
使用Tcmalloc的程序,用valgrind無法檢測內存泄露,可以使用google-perftools提供的heap checker
使用方法:
export? HEAPCHECK=TYPE
TYPE可以為:minimal、normal、strict、draconian

?


?

關于Tcmalloc

?


http://code.google.com/p/gperftools/downloads/list

Tcmalloc通過preload或者直接動態鏈接的方式對malloc等內存分配和釋放函數進行截獲并提供服務。Tcmalloc提供接口主要涵蓋malloc.h的接口

?

使用

要使用TCMalloc,只要將tcmalloc通過“-ltcmalloc”鏈接器標志接入你的應用即可。

你也可以通過使用LD_PRELOAD在不是你自己編譯的應用中使用tcmalloc:

$ LD_PRELOAD=”/usr/lib/libtcmalloc.so”

LD_PRELOAD比較討巧,我們也不十分推薦這種用法。

TCMalloc還包含了一個堆檢查器以及一個堆測量器。

如果你更想鏈接不包含堆測量器和檢查器的TCMalloc版本(比如可能為了減少靜態二進制文件的大小),你可以接入libtcmalloc_minimal。

TCMalloc給每個線程分配了一個線程局部緩存。小分配可以直接由線程局部緩存來滿足。需要的話,會將對象從中央數據結構移動到線程局部緩存中,同時定期的垃圾收集將用于把內存從線程局部緩存遷移回中央數據結構中。

TCMalloc將尺寸小于<=
32K的對象(“小”對象)和大對象區分開來。大對象直接使用頁級分配器(一個頁是一個4K的對齊內存區域)從中央堆直接分配。即,一個大對象總是頁對齊的并占據了整數個數的頁。

連續的一些頁面可以被分割為一系列小對象,而他們的大小都相同。例如,一個連續的頁面(4K)可以被劃分為32個128字節的對象。

小對象的分配

每個小對象的大小都會被映射到170個可分配的尺寸類別中的一個。例如,在分配961到1024字節時,都會歸整為1024字節。尺寸類別這樣隔開:較小的尺寸相差8字節,較大的尺寸相差16字節,再大一點的尺寸差32字節,如此類推。最大的間隔(對于尺寸 >= ~2K的)是256字節。

?

大對象的分配

一個大對象的尺寸(> 32K)會被除以一個頁面尺寸(4K)并取整(大于結果的最小整數),同時是由中央頁面堆來處理的。中央頁面堆又是一個自由列表的陣列。對于i < 256而言,第k個條目是一個由k個頁面組成的自由列表。

?

跨度(Span)

TCMalloc管理的堆由一系列頁面組成。連續的頁面由一個“跨度”(Span)對象來表示。一個跨度可以是已被分配或者是自由的。如果是自由的,跨度則會是一個頁面堆鏈表中的一個條目。如果已被分配,它會是一個已經被傳遞給應用程序的大對象,或者是一個已經被分割成一系列小對象的一個頁面。如果是被分割成小對象的,對象的尺寸類別會被記錄在跨度中。

?

解除分配

當一個對象被解除分配時,我們先計算他的頁面號并在中央陣列中查找對應的跨度對象。該跨度會告訴我們該對象是大是小,如果它是小對象的話尺寸類別是什么。如果是小對象的話,我們將其插入到當前線程的線程緩存中對應的自由列表中。如果線程緩存現在超過了某個預定的大小(默認為2MB),我們便運行垃圾收集器將未使用的對象從線程緩存中移入中央自由列表。

如果該對象是大對象的話,跨度會告訴我們該對象覆蓋的頁面的范圍。假設該范圍是[p,q]。我們還會查找頁面p-1和頁面q+1對應的跨度。如果這兩個相鄰的跨度中有任何一個是自由的,我們將他們和[p,q]的跨度接合起來。最后跨度會被插入到頁面堆中合適的自由列表中。

?

小對象的中央自由列表

就像前面提過的一樣,我們為每一個尺寸類別設置了一個中央自由列表。每個中央自由列表由兩層數據結構來組成:一系列跨度和每個跨度一個自由對象的鏈表。

?

線程緩存的垃圾收集

某個線程緩存當緩存中所有對象的總共大小超過2MB的時候,會對他進行垃圾收集。垃圾收集閾值會自動根據線程數量的增加而減少,這樣就不會因為程序有大量線程而過度浪費內存。

我們會遍歷緩存中所有的自由列表并且將一定數量的對象從自由列表移到對于得中央列表中。


?

注意

TCMalloc可能要比其他malloc版本在某種程度上更吃內存,(但是傾向于不會有其他malloc版本中可能出現的爆發性增長。)尤其是在啟動時TCMalloc會分配大約240KB的內部內存。

不要試圖將TCMalloc載入到一個運行中的二進制程序中(例如,在Java中使用JNI)。二進制程序已經使用系統malloc分配了一些對象,并會嘗試將它們傳遞到TCMalloc進行解除分配。TCMalloc是無法處理這種對象的。

翻譯參考:http://blog.163.com/cp7618@yeah/blog/static/70234777201251345350339/

?????? 原文地址:http://google-perftools.googlecode.com/svn/trunk/doc/tcmalloc.html

更多參考:glibc內存泄露以及TCmalloc 簡單分析

使用Google的開源TCMalloc庫,提高MySQL在高并發情況下的性能[張宴原創]

TCMalloc:線程緩存的Malloc

深入Linux的內存管理,關于PTMalloc3、Hoard和TCMalloc

在應用程序中替換Linux中Glibc的malloc的四種方法

Google performance Tools (gperftools) 使用心得

總結

以上是默认站点為你收集整理的Redis源码分析-TCMalloc的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得默认站点網站內容還不錯,歡迎將默认站点推薦給好友。