Redis学習:zmallocメモリ管理(一)


レベルが限られていて、家族の言葉で、斧正を歓迎します.
zmallocはRedisの基礎です.Redisメモリ管理はzmalloc.hとzmalloc.cではc言語のメモリ管理を書き換えて完成し,主にtcmalloc(google),jemalloc(facebook),その他の(macシステムなど)のパッケージである.
注意:redis-2.4以上はjemallocを持参します.
コンパイル時にmallocを選択
<!-- lang: cpp -->
<!-- lang: cpp -->
#if defined(USE_TCMALLOC)
#define ZMALLOC_LIB ("tcmalloc-" __xstr(TC_VERSION_MAJOR) "." __xstr(TC_VERSION_MINOR))
#include <google/tcmalloc.h>
#if (TC_VERSION_MAJOR == 1 && TC_VERSION_MINOR >= 6) || (TC_VERSION_MAJOR > 1)
#define HAVE_MALLOC_SIZE 1
#define zmalloc_size(p) tc_malloc_size(p)
#else
#error "Newer version of tcmalloc required"
#endif

#elif defined(USE_JEMALLOC)
#define ZMALLOC_LIB ("jemalloc-" __xstr(JEMALLOC_VERSION_MAJOR) "." __xstr(JEMALLOC_VERSION_MINOR) "." __xstr(JEMALLOC_VERSION_BUGFIX))
#include <jemalloc/jemalloc.h>
#if (JEMALLOC_VERSION_MAJOR == 2 && JEMALLOC_VERSION_MINOR >= 1) || (JEMALLOC_VERSION_MAJOR > 2)
#define HAVE_MALLOC_SIZE 1
#define zmalloc_size(p) je_malloc_usable_size(p)
#else
#error "Newer version of jemalloc required"
#endif

#elif defined(__APPLE__)
#include <malloc/malloc.h>
#define HAVE_MALLOC_SIZE 1
#define zmalloc_size(p) malloc_size(p)
#endif

USE_TCMALLOC、USE_JEMALLOCとAPPLEは、どちらのmallocを使用するかを制御します.
この3つの定数はMakefileで定義されています.
例:redis-server:
TCMallocを使用してredisを最適化するには、次の手順に従います.
make USE_TCMALLOC=yes
<!-- lang: shell -->
#    
ifeq ($(uname_S),Linux)
    MALLOC=jemalloc
else
    MALLOC=libc
endif
……
#     MALLOC
ifeq ($(USE_TCMALLOC),yes)
    MALLOC=tcmalloc
endif

ifeq ($(USE_TCMALLOC_MINIMAL),yes)
    MALLOC=tcmalloc_minimal
endif

ifeq ($(USE_JEMALLOC),yes)
    MALLOC=jemalloc
endif
…………
……
##         
ifeq ($(MALLOC),tcmalloc)
FINAL_CFLAGS+= -DUSE_TCMALLOC
FINAL_LIBS+= -ltcmalloc
endif

ifeq ($(MALLOC),tcmalloc_minimal)
    FINAL_CFLAGS+= -DUSE_TCMALLOC
    FINAL_LIBS+= -ltcmalloc_minimal
endif

ifeq ($(MALLOC),jemalloc)
    DEPENDENCY_TARGETS+= jemalloc
    FINAL_CFLAGS+= -DUSE_JEMALLOC -I../deps/jemalloc/include
    FINAL_LIBS+= ../deps/jemalloc/lib/libjemalloc.a -ldl
endif
………………
###       
……
$(REDIS_SERVER_NAME): $(REDIS_SERVER_OBJ)
$(REDIS_LD) -o $@ $^ ../deps/hiredis/libhiredis.a ../deps/lua/src/liblua.a $(FINAL_LIBS)