导航页源码分享⾮常简洁的Emlog技术导航⽹站源码NavTem模板
⾮常简洁的Emlog技术导航⽹站源码NavTem模板
NavTem模板是⼀款⾮常简洁的EMLOG技术导航的模板,有着⽆框架、精简、加载迅速著称,还有些许实⽤的功能,此模板是有史以来第⼀款Emlog完整版的技术导航模板,该模板不可以单独使⽤,我们配上了修改后的程序,也就是基于Emlog⼆次开发的
⽂件:
以下内容⽆关:
-------------------------------------------分割线---------------------------------------------
随笔 - 122 ⽂章 - 0 评论 - 14
Redis性能篇(⼆)CPU核和NUMA架构的影响
Redis被⼴泛使⽤的⼀个很重要的原因是它的⾼性能。因此我们必要要重视所有可能影响Redis性能的因素、机制以及应对⽅案。影响Redis 性能的五⼤⽅⾯的潜在因素,分别是:
Redis内部的阻塞式操作
CPU核和NUMA架构的影响
Redis关键系统配置
Redis内存碎⽚
Redis缓冲区
这⼀讲,我们来学习⼀下CPU对Redis的性能影响及应对⽅法。
主流CPU架构
学习之前,我们先来了解主流CPU架构有哪些,有什么特点,以便我们更好地了解CPU是如何影响Redis的。
CPU多核架构
CPU多核架构
⼀个CPU处理器中⼀般有多个运⾏核⼼,称为物理核。
物理核包括私有的⼀级指令/数据缓存(L1缓存)和⼆级缓存(L2缓存)。
每个物理核会运⾏两个超线程,也叫作逻辑核。同⼀个物理核的逻辑核会共享使⽤L1、L2缓存。
不同的物理核共享三级缓存(L3缓存)
多CPU Socket架构
多CPU Socket架构
在多CPU架构上,应⽤程序可以在不同的处理器上运⾏。
应⽤程序在不同的Socket间调度运⾏时,访问之前的Socket的内存,这种访问属于远端内存访问。
和访问Socket直接连接的内存相⽐,远端内存访问会增加应⽤程序的延迟。
把这个架构称为⾮统⼀内存访问架构(Non-Uniform Memory Access,NUMA架构)。
CPU多核对Redis性能的影响
如果在CPU多核场景下,Redis实例被频繁调度到不同CPU核上运⾏的话,那么,对Redis实例的请求
处理时间影响就更⼤了。每调度⼀次,⼀些请求就会受到运⾏时信息、指令和数据重新加载过程的影响,这就会导致某些请求的延迟明显⾼于其他请求。
要避免Redis总是在不同CPU核上来回调度执⾏。最直接的⽅法是把Redis实例和CPU核绑定了,让⼀个Redis实例固定运⾏在⼀个CPU核上。
通过taskset命令进⾏绑核:
taskset -c 0 ./redis-server
绑核不仅对降低尾延迟有好处,同样也能降低平均延迟、提升吞吐率,进⽽提升Redis性能。
CPU的NUMA架构对Redis性能的影响
在实际应⽤Redis时,有⼀种做法:为了提升Redis的⽹络性能,把操作系统的⽹络中断处理程序和CPU核绑定。
在CPU的NUMA架构下,当⽹络中断处理程序、Redis实例分别和CPU核绑定后,就会有⼀个潜在的风险:如果⽹络中断处理程序和Redis 实例各⾃所绑的CPU核不在同⼀个CPU Socket上,那么,Redis实例读取⽹络数据时,就需要跨CPU Socket访问内存,这个过程会花费较多时间。
image
为了避免Redis跨CPU Socket访问⽹络数据,我们最好把⽹络中断程序和Redis实例绑在同⼀个CPU Socket上,这样⼀来,Redis实例就可以直接从本地内存读取⽹络数据了。
image
CPU的NUMA架构下进⾏绑定要注意CPU核的编号规则,可以执⾏lscpu命令来查看核的编号。
复制代码
lscpu
Architecture: x86_64
…
NUMA node0 CPU(s): 0-5,12-17
NUMA node1 CPU(s): 6-11,18-23
…
复制代码
不过,凡事都有两⾯性,绑核也存在⼀定的风险。接下来就来了解下它的潜在风险点和解决⽅案。
绑核的风险和解决⽅案
⽅案⼀:⼀个Redis实例对应绑⼀个物理核
在给Redis实例绑核时,我们不要把⼀个实例和⼀个逻辑核绑定,⽽要和⼀个物理核绑定,也就是说,把⼀个物理核的2个逻辑核都⽤上。
⽅案⼆:优化Redis源码
通过修改Redis源码,把⼦进程和后台线程绑到不同的CPU核上。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论