参考《redis核心技术与实践》并修改了其中代码的问题
在多核CPU架构下,Redis如果在不同的核上运行,就需要频繁地进行上下文切换,这个过程会增加Redis的执行时间,客户端也会观察到较高的尾延迟了。所以,建议你在Redis运行时,把实例和某个核绑定,这样,就能重复利用核上的L1、L2缓存,可以降低响应延迟。
为了提升Redis的网络性能,我们有时还会把网络中断处理程序和CPU核绑定。在这种情况下,如果服务器使用的是NUMA架构,Redis实例一旦被调度到和中断处理程序不在同一个CPU Socket,就要跨CPU Socket访问网络数据,这就会降低Redis的性能。所以,我建议你把Redis实例和网络中断处理程序绑在同一个CPU Socket下的不同核上,这样可以提升Redis的运行性能。
虽然绑核可以帮助Redis降低请求执行时间,但是,除了主线程,Redis还有用于RDB和AOF重写的子进程,以及4.0版本之后提供的用于惰性删除的后台线程。当Redis实例和一个逻辑核绑定后,这些子进程和后台线程会和主线程竞争CPU资源,也会对Redis性能造成影响。所以,我给了你两个建议:
- 如果你不想修改Redis代码,可以把按一个Redis实例一个物理核方式进行绑定,这样,Redis的主线程、子进程和后台线程可以共享使用一个物理核上的两个逻辑核。
- 如果你很熟悉Redis的源码,就可以在源码中增加绑核操作,把子进程和后台线程绑到不同的核上,这样可以避免对主线程的CPU资源竞争。
代码修改详细过程:
这里使用的是redis5.0,如果redis6.0可以直接配置不用修改源码
后台线程:
以下文件都在安装包安装路径下的src文件内
bio.c 文件中的 bioProcessBackgroundJobs 函数
该函数:不停的从线程任务队列中取出任务,根据任务类型,调用不同的函数处理
rab线程
rdb.c 文件 rdbSaveBackground 函数
该函数作业负责在后台生成 RDB 文件,创建一个子进程,由子进程将数据快照保存到磁盘中。
aof线程
aof.c 文件:rewriteAppendOnlyFileBackground 函数。
该函数作用:后台进行AOF数据文件写入操作。
编译:
cd /redis-5.0.9
make
make install PREFIX=/usr/local/redis