Redis性能调优

  • Post author:
  • Post category:其他


Redis的性能在一定程度上会受到服务器CPU的多核架构影响。



CPU多核架构

一台计算机的处理器部分,在设计的时候有几种选择:多个单核CPU和单个多核CPU。举个例子1个8核的处理器,可以有如下设计选择:

  1. 把8个核全部做到一个大Die上,Die很大。这个Die加上一些外围电路组成一个单Die多核CPU。
  2. 弄4个小Die,每个Die 2个内核,每个Die很小。把这4个Die,加上互联总线和外围电路,全部封装(Packaging)到一个多Die多核CPU中。
  3. 还是弄4个Die,每个Die 2个内核,每个Die很小。每个Die加上外围电路封装成一个单独的CPU,4个CPU再通过总线组成一个多路(way/socket)系统。

性能上,大Die多核的处理器性能最好,同样造价最昂贵。

下面针对单Die多核的情况进行说明。

我们把一个运行核心看作一个物理核,一个物理核可以处理一个程序,每个物理核都拥有私有的一级缓存(一级指令+数据缓存),二级缓存,多个物理核可以共享一个三级缓存。

另外,现在主流的CPU处理器,每个物理核还可以通过超线程模拟两个逻辑核,因此两个逻辑核共享一级和二级缓存。整个关系可以表示如下:

在这里插入图片描述

如果服务器上的CPU设计采用开始例子中的第三种设计模式,则服务器上会存在多个CPU Socket,每个CPU都有自己的物理核核内存,不同处理器之间通过总线连接。

在这里插入图片描述

在多CPU架构上,应用程序在运行过程中,可能由于调度问题,运行在不同的处理器上。

跨socket进行内存访问要比直接访问本socket直连的内存增加延迟。

因此,我们可以总结出多核架构对应用程序运行的影响:

  1. 充分利用一级缓存和二级缓存,可以有效缩短应用程序的执行时间。
  2. 远端内存访问会增加执行延时。



Redis多核影响

对应到Redis上来说:

Redis的实例如果被频繁调度到不同的CPU上,就会影响请求处理延时。因为每次调度都需要重新加载运行时信息、指定和数据。


针对这种场景,我们可以尝试讲Redis实例和固定的CPU核进行绑定。

同时,我们考虑到Redis接收网络请求,网络中断程序是需要核Redis实例进行数据交互的,而

网络中断程序也可以通过绑定CPU来避免在不同的内存上切换造成的开销,提升网络处理性能。

此时,我们就要注意:


如果网络中断程序和Redis实例绑定的CPU核不在同一个CPU Socket上,那么Redis实例读取网络数据时,就需要跨CPU Socket进行内存访问,开销较大。



版权声明:本文为weixin_42574365原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。