操作系统: CentOS 7
Redis: 5.0.7
1、安装Redis
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
tar -xf redis-5.0.7.tar.gz
cd redis-5.0.7
使用TCMALLOC 内存分配器
a、安装TCMALLOC
###1、安装libunwind
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
###2、安装tcmalloc,tcmalloc包含在包google的gperftools中,实际上安装tcmalloc就是安装gperftools
./configure
make && make install
echo "/usr/local/lib" > /etc/ld.so.conf.d/locallib.conf
ldconfig
b、安装redis
###方法一
make MALLOC=TCMALLOC
make install
###方法二
make USE_TCMALLOC=yes
make install
使用jemalloc内存分配器
redis 自带有jemalloc 的源码包,位于源码目录下的deps 目录下的jemalloc 下
###方法一
make MALLOC=jemalloc
make install
###方法二
make USE_JEMALLOC=yes
make install
使用libc内存分配器
###方法一
make MALLOC=libc
make install
###方法二
make USE_JEMALLOC=no
make install
2、配置systemd管理redis服务
开启以守护进程方式运行redis
sed -i 's/daemonize no/daemonize yes/g' /usr/local/redis/conf/redis.conf
daemonize:yes:
redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。
在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
daemonize:no:
当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。
3、配置redis.service
touch /usr/lib/systemd/system/redis.service
cat > /usr/lib/systemd/system/redis.service << EOF
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
启动服务
systemctl daemon-reload
systemctl start redis
systemctl enable redis
4、redis的内存分配器
内存分配器的定义:src 目录下的zmalloc.c 中定义了内存分配器的使用规则。
1、检查是否有tcmalloc ,如果存在,则使用tcmalloc 。
2、如果不存在tcmalloc ,则检测是否存在jemalloc ,如果存在则使用jemalloc (在deps 目录下默认带了jemalloc 的源码包,所以如果不指定内存分配器则默认使用jemalloc )
3、如果不存在jemalloc ,则使用libc
详细定义如下
#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)
#define mallocx(size,flags) je_mallocx(size,flags)
#define dallocx(ptr,flags) je_dallocx(ptr,flags)
#endif
redis 的依赖的包的源码存在于deps 目录下,redis 依赖lua 包和内存分配器,redis 自身没有内存分配实现,利用的是已有的内存分配器,jemalloc 、tcmalloc 或者libc 。进入src 目录,打开Makefile 文件,可以看到如下内容
####默认安装选项,默认安装在/usr/local目录下
PREFIX?=/usr/local
INSTALL_BIN=$(PREFIX)/bin
INSTALL=install
###如果不是ARM处理器,则默认使用jemalloc,反之则使用libc
# Default allocator defaults to Jemalloc if it's not an ARM
MALLOC=libc
ifneq ($(uname_M),armv6l)
ifneq ($(uname_M),armv7l)
ifeq ($(uname_S),Linux)
MALLOC=jemalloc
endif
endif
endif
###定义内存分配器的选项,tcmalloc、jemalloc、libc分别使用USE_TCMALLOC、USE_JEMALLOC定义,其中jemalloc和libc分别用USE_JEMALLOC=yes或者no来定义
ifeq ($(USE_TCMALLOC),yes)
MALLOC=tcmalloc
endif
ifeq ($(USE_TCMALLOC_MINIMAL),yes)
MALLOC=tcmalloc_minimal
endif
ifeq ($(USE_JEMALLOC),yes)
MALLOC=jemalloc
endif
ifeq ($(USE_JEMALLOC),no)
MALLOC=libc
endif
所以编译的时候可以用make MALLOC=jemalloc 或者make USE_JEMALLOC=yes 来定义使用jemalloc ,tcmalloc 和libc 方式一致。安装目录可以用make PREFIX=xxxx install 来定义。
也可以用环境变量来定义
export MALLOC=jemalloc
export PREFIX=xxxx
在deps 目录下有个update-jemalloc.sh 脚本文件
可以通过执行./update-jemalloc.sh ${jemalloc_version} 的方式升级jemalloc 版本
在deps 目录下的Makefile 文件中,大约在第80行定义了jemalloc 的编译选项
5、验证redis安装
###执行以下指令
redis-server --version
###输出类似如下内容
Redis server v=5.0.7 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=61b4a113b60582f2
###其中malloc的值表示使用的内存分配器是jemalloc还是tcmalloc或者是libc
redis 默认使用jemalloc 内存分配器进行内存分配。
如果使用jemalloc 内存分配器的话会直接编译进redis-server 。
所以如果用lsof -n|grep redis|grep malloc 命令去查看调用情况会发现结果为空值
如果使用的是tcmalloc
用lsof -n|grep redis|grep malloc 命令去查看调用情况会发现结果为非空
原因是如果采用tcmalloc 或者libc 内存分配器的话,redis 使用的是动态调用的方式。
所以需要预先安装,而jemalloc 则不需要,redis 自带且编译进redis-server 可执行文件中
redis-ser 27124 root mem REG 253,1 3516776 1334638 /usr/local/lib/libtcmalloc.so.4.5.3
redis-ser 27124 27125 redis-ser root mem REG 253,1 3516776 1334638 /usr/local/lib/libtcmalloc.so.4.5.3
redis-ser 27124 27126 redis-ser root mem REG 253,1 3516776 1334638 /usr/local/lib/libtcmalloc.so.4.5.3
redis-ser 27124 27127 redis-ser root mem REG 253,1 3516776 1334638 /usr/local/lib/libtcmalloc.so.4.5.3