Redis五大影响性能原因(二):多CPU多核架构

一、先放结论:

  • 影响原因一(同CPU不同核,多核架构影响):程序在不同核之间切换运行时会有上下文切换(context switch),也就是要将程序原来放在核1上的数据迁移到核2上,影响程序指令执行速度。

解决方案:将Redis与某个核绑定,防止Redis进程在不同核之间切换。

  • 影响原因二(不同CPU不同核,多CPU架构影响):程序执行时需要通过网络中断程序得到网络数据,当网络中断程序与本程序在不同的CPU上执行时,需要“走远端内存访问”,有通信延迟。

解决方案:将网络中断程序与Redis程序绑定在同一个CPU上。

  • 以上用绑核的方法存在的问题:Redis本身除了与客户端连接的主线程外还有执行RDB、AOF操作的子进程和子线程,运行时都需要独占一个核,与Redis的主线程造成核资源竞争
  • 初级解决方案1(通过执行Redis指令):将Redis绑定到物理核(一个物理核中有两个逻辑核,一个逻辑核可以运行一个程序的一个线程)上,相当于可以同时运行Redis中的两个线程,仍然会有核资源竞争问题。

  • 高级解决方案2:(通过修改Redis源码):将Redis的每一个线程都绑定到同个CPU的不同逻辑核上,独占一个核资源

  • 对应整体的多核多CPU(NUMA)架构图如下:

请添加图片描述

二、介绍多CPU架构(NUMA,Non Uniform Memory Access架构)

一般服务器上有多个CPU处理器(CPU Socket),不同CPU处理器间通过总线连接,不同CPU处理器间传输数据时需要走远程内存访问(每个CPU的内存私有),会有通信延迟。对应多CPU架构图如下:
请添加图片描述
请添加图片描述
UMA结构存在的问题:CPU个数难以扩展,多个CPU共用一个内存,争抢内存地址资源冲突严重。

NUMA Aware机制:采用就近原则,线程中分配内存时会优先分配对象到离该线程所在CPU的私有内存中。

三、CPU多核架构

一个CPU种一般由十几二十个物理核,物理核中有两个逻辑核(超线程),每个逻辑核是线程运行的最小单元。同时CPU中还有内存缓存空间、物理核中除了逻辑核还有其私有缓存,单个CPU的内部成员逻辑图以及其资源共享情况如下:

请添加图片描述
L1和L2缓存为CPU中运行最快的单元,但是只有KB级空间,同一个物理核中的两个逻辑核共享L1和L2缓存(一般CPU会将访问频率最高的数据以及指令从内存中拷贝到此处存放,根据算法会更新缓存里的内容,缓存就类似于内存的内存)。

四、最后补充一些知识

  • 应用程序有很多线程,每个线程想要执行就要占用一个逻辑核
  • 多CPU多核架构中逻辑核的id编号先是遍历每一个物理核的逻辑核1,然后再遍历每一各物理核的逻辑核2(物核1的逻辑核1:id=1 —— 物核2的逻辑核2:id=2 —— 物核2的逻辑核2:id =3 —— 物核2的逻辑核2:id=4)。

参考文章:

https://time.geekbang.org/column/article/286082

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值