请选择 进入手机版 | 继续访问电脑版

CPU结构对redis性能的影响

[复制链接]
小小海 发表于 2021-1-1 17:47:28 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
主流CPU结构



  • 一个CPU处置惩罚器中一般有多个运行焦点,一个运行焦点称之为一个物理核。每个物理核都可以运行应用程序。每个物理核都拥有私有的一级缓存,包罗一级指令缓存和一级数据缓存,以及私有的二级缓存。
  • 因为L1和L2缓存是每个物理核私有的,所以物理核访问他们的速度非常块,不到10纳秒。但是受限于制造技能,这些L1和L2缓存的巨细一般只有KB级别。
  • 差异的物理核还会共享一个共同的三级缓存,能存储的资源较多,能达到几MB到几十MB,这样当L1和L2缓存中没有掷中时,可以访问L3。制止访问内存。
  • 现在主流的CPU处置惩罚器,每个物理核通常会运行两个超线程,也叫做逻辑核,同一个物理核的逻辑核共享使用L1和L2缓存。

  • 主流的服务器上,通常拥有多个CPU处置惩罚器(也称为多CPU Socket),每个CPU处置惩罚器拥有自己的物理核(包罗L1和L2缓存),L3缓存,以及毗连的内存。差异处置惩罚器通过总线毗连。

  • 在多 CPU 架构上,应用程序可以在差异的处置惩罚器上运行。如果应用先在一个Socket上运行,而且把数据生存到了内存,然后调治到另一个Socket上运行。此时再举行内存访问时,就需要访问之前Socket上毗连的内存,这种访问属于远端内存访问,和访问Socket直连的内存相比会增加延迟。所以,这种架构也叫非统一内存访问架构(Non-Uniform Memory Access,NUMA 架构)
CPU多物理查对Redis性能的影响



  • 在一个CPU核上运行时,应用需要纪录自身使用的软硬件资源信息(运行时信息),访问最频繁的指令和数据会被缓存到L1和L2缓存中,以提升速度。
  • 在多核CPU场景下,一旦应用程序被切换到新的物理核运行,那么运行时信息就需要重新加载到新的物理核上,L1和L2缓存也需要重新加载数据和指令,这会导致程序的运行时间增加。这种情况叫跨核上下文切换。每调治一次,一些请求就会受到运行时信息、指令和数据重新加载过程的影响,这就会导致某些请求的延迟显着高于其他请求。
  • 管理办法可以使用绑核。好比使用taskset下令将redis实例绑定到0号物理核。
  1. taskset -c 0 ./redis-server
复制代码
CPU 的 NUMA 架构(多CPU架构)对 Redis 性能的影响



  • 网络中断程序绑定的物理核最好和Redis实例绑定的物理核相同。
  • 来看下 Redis 实例和网络中断程序的数据交互:网络中断处置惩罚程序从网卡硬件中读取数据,并把数据写入到操纵系统内核维护的一块内存缓冲区。内核会通过 epoll 机制触发事件,通知 Redis 实例,Redis 实例再把数据从内核的内存缓冲区拷贝到自己的内存空间。

  • 如果网络中断处置惩罚程序和 Redis 实例各自所绑的 CPU 核不在同一个 CPU Socket 上,那么,Redis 实例读取网络数据时,就需要跨 CPU Socket 访问内存,这个过程会耗费较多时间。

  • 需要注意的是,在 CPU 的 NUMA 架构下,对 CPU 核的编号规则,并不是先把一个 CPU Socket 中的所有逻辑核编完,再对下一个 CPU Socket 中的逻辑核编码,而是先给每个 CPU Socket 中每个物理核的第一个逻辑核依次编号,再给每个 CPU Socket 中的物理核的第二个逻辑核依次编号。可以使用lscpu下令检察
  • 好比两个CPU Socket,每个Socket有6个物理核,每个物理核有2个逻辑核。

    • 先给1号cpu的1号物理核的第一个逻辑核编号0,再给1号cpu的2号物理核的第一个逻辑核编号1,直到给1号cpu的6号物理核的第一个逻辑核编号5。
    • 然后给2号cpu的1号物理核的第一个逻辑核编号6,直到给2号cpu的6号物理核的第一个逻辑核编号11。
    • 然后给1号cpu的1号物理核的第二个逻辑核编号12,直到然后给1号cpu的6号物理核的第二个逻辑核编号17。
    • 然后给2号cpu的1号物理核的第二个逻辑核编号18,直到然后给2号cpu的6号物理核的第二个逻辑核编号23。
    • 总结来讲就是先给每个物理核的第一个逻辑核编号,再给每个物理核的第二个逻辑核编号。

  1. lscpuArchitecture: x86_64...NUMA node0 CPU(s): 0-5,12-17NUMA node1 CPU(s): 6-11,18-23...
复制代码


  • 将redis实例绑定到同一个物理核的两个逻辑核
  1. taskset -c 0,12 ./redis-server
复制代码


  • 和只绑一个逻辑核相比,把 Redis 实例和物理核绑定,可以让主线程、子进程、背景线程共享使用 2 个逻辑核,可以在一定程度上缓解 CPU 资源竞争。但是,因为只用了 2 个逻辑核,它们相互之间的 CPU 竞争仍然还会存在。
  • 更进一步淘汰CPU竞争的方法可以通过修改 Redis 源码,把子进程和背景线程绑到差异的 CPU 核上。

来源:https://blog.csdn.net/weixin_40108561/article/details/111942640
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )