Redisは異なるメモリディスペンサのフラグメントレート比較を採用

4686 ワード

Redisはメモリプールを自分で実現しておらず、標準的なシステムメモリディスペンサに自分のものを加えていないことを知っています.したがって、システムメモリディスペンサのパフォーマンスとフラグメント率は、Redisにいくつかのパフォーマンスに影響を与えます.
Redisのzmalloc.cソースコードでは、次のコードが表示されます.
 48 /* Explicitly override malloc/free etc when using tcmalloc. */
 49 #if defined(USE_TCMALLOC)
 50 #define malloc(size) tc_malloc(size)
 51 #define calloc(count,size) tc_calloc(count,size)
 52 #define realloc(ptr,size) tc_realloc(ptr,size)
 53 #define free(ptr) tc_free(ptr)
 54 #elif defined(USE_JEMALLOC)
 55 #define malloc(size) je_malloc(size)
 56 #define calloc(count,size) je_calloc(count,size)
 57 #define realloc(ptr,size) je_realloc(ptr,size)
 58 #define free(ptr) je_free(ptr)
 59 #endif

上記のコードから、Redisはコンパイル時にtcmallocを使用するかどうかを判断し、もしそうであれば、標準的なlibcの関数実装をtcmallocに対応する関数で置き換えることがわかります.次にjemallocが使用できるかどうかを判断し、最後に使用しない場合は標準のlibcのメモリ管理関数を使用します.
最新の2.4.4バージョンでは、jemallocはソースパケットの一部としてソースパケットに含まれているため、直接使用することができる.tcmallocを使用する場合は、自分でインストールする必要があります.
以下、tcmallocパッケージのインストール方法を簡単に説明します.tcmallocはgoogle-proftoolsの一部なので、実際にgoogle-proftoolsをインストールする必要があります.64ビットマシンにインストールする場合は、依存するlibunwindライブラリをインストールする必要があります.
wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
tar zxvf libunwind-0.99-alpha.tar.gz
cd libunwind-0.99-alpha/
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install

Google-preftolsのインストールを行います.
wget http://google-perftools.googlecode.com/files/google-perftools-1.8.1.tar.gz
tar zxvf google-perftools-1.8.1.tar.gz
cd google-perftools-1.8.1/
./configure  --disable-cpu-profiler --disable-heap-profiler --disable-heap-checker --disable-debugalloc --enable-minimal
make && make install  

sudo echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf  #        ,     
sudo /sbin/ldconfig

その後Redisのインストールを行い、make時に対応するパラメータを指定してtcmallocを有効にします.
$ curl -O http://redis.googlecode.com/files/redis-2.4.4.tar.gz
$ tar xzvf redis-2.4.4.tar.gz
$ cd redis-2.4.4
$ make USE_TCMALLOC=yes FORCE_LIBC_MALLOC=yes
$ sudo make install

Redisを再起動するとinfoコマンドで使用するメモリディスペンサが表示されます.
ここでは、tcmalloc、jemalloc、libcに対応する3つのメモリディスペンサについて説明します.パフォーマンスと破片率はどうですか?以下は、Redisが持参したredis-benchmarkを用いて等量のデータを書き込んでテストする簡単なテスト結果であり、データは異なるディスペンサを採用したときのRedis info情報から抜粋される.tcmallocを用いた場合、フラグメント率は1.01で最も低く、jemallocは1.02であり、libcのディスペンサフラグメント率は1.31であり、以下のようにはならない.
used_memory:708391440
used_menory_human:675.57M
used_memory_rss:715169792
used_memory_peak:708814040
used_memory_peak_human:675.98M
mem_fragmentation_ratio:1.01
mem_allocator:tcmalloc-1.7
used_memory:708381168
used_menory_human:675.56M
used_memory_rss:723587072
used_memory_peak:708803768
used_memory_peak_human:675.97M
mem_fragmentation_ratio:1.02
mem_allocator:jemalloc-2.2.1
used_memory:869000400
used_menory_human:828.74M
used_memory_rss:1136689152
used_memory_peak:868992208
used_memory_peak_human:828.74M
mem_fragmentation_ratio:1.31
mem_allocator:libc

上のテストデータはすべて小さいデータで、つまり単一のデータは大きくありません.次にbenchmarkの-dパラメータを設定して、value値を1 kサイズに調整して、テスト結果にいくつかの変化が発生しました.
used_memory:830573680
used_memory_human:792.10M
used_memory_rss:849068032
used_memory_peak:831436048
used_memory_peak_human:792.92M
mem_fragmentation_ratio:1.02
mem_allocator:tcmalloc-1.7
used_memory:915911024
used_memory_human:873.48M
used_memory_rss:927047680
used_memory_peak:916773392
used_memory_peak_human:874.30M
mem_fragmentation_ratio:1.01
mem_allocator:jemalloc-2.2.1
used_memory:771963304
used_memory_human:736.20M
used_memory_rss:800583680
used_memory_peak:772784056
used_memory_peak_human:736.98M
mem_fragmentation_ratio:1.04
mem_allocator:libc

大きなメモリと小さなメモリを割り当てる上で、いくつかのディスペンサの破片率の差が大きいことがわかります.Redisを使うときは、できるだけ自分の本当のデータでテストして、自分のデータに最適なディスペンサを選択します.