你知道CPU结构也会影响Redis性能吗?( 二 )


对相关进程进行绑定 , 我们可以使用 taskset :
taskset 是依据线程PID(TID)查询或设置线程的CPU亲和性(Affiliation)(与哪个CPU核心绑定) 。
如果有伙伴们不知道 taskset 如何使用 , 没关系 , 可以使用 man 或者 help 手册进行查看相关参数使用( man taskset 或 taskset -h ) 。 在进行绑定的时候 , 我们要知道自己机器的CPU的核数( cat /proc/cpuinfo ) , 以方便我们准确的进行CPU绑定 , 不会说不知道自己CPU核数随便绑定一个超过自己CPU核数的数 。
例子:假如我们要绑定CPU0这个CPU核 , 那么命令如下:
taskset -c 0 ./redis-server
这时 , 我们可以通过 Redis 的压测工具进行相关测试 redis-benchmark
例如:对 GET 、PUT 和 SET 进行测试:
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000 -t get
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000 -t put
redis-benchmark -h 127.0.0.1 -p 6379 -c 50 -n 10000 -t set
可以发现Redis实例的性能大大提升 。
Redis实例还可以和网络中断程序绑在 CPU Socket 上 , 这样能减小Redis 跨 Socket 访问内存的网络开销 。 (在网络传输过程中 , 这也是一个非常值得考虑优化的问题) 。
这里或许会有伙伴会问了(一个cpu物理核内部不是还有逻辑核吗 , 我们不应该绑定在逻辑核上吗?)
这个小伙伴思考的好!别急 , 我先给你们维基百科(面向搜索引擎)下这些知识点:

  • CPU:中央处理单元 , 记住:CPU不等于物理核 , 也不等于逻辑核 。
  • 物理核: 真实的cpu核 , 可以单独执行指令 , 由独立电路元件实体以及L1、L2缓存构成 。
  • 逻辑核(LCPU):在一个物理核内 , 逻辑层面的核 。 (内部物理核通过高速运算诞生的概念) 。
  • 超线程(HT):超线程可以在一个逻辑核等待指令执行的间隔(等待从cache或内存中获取下一条指令) , 把时间片分配到另一个逻辑核 。 高速在这两个逻辑核之间切换 , 让应用程序感知不到这个间隔 , 误认为自己是独占了一个核 。
注意啦!!这里里面的三角关系:
一个CPU可以有多个物理核 。 但是如果操作系统开启了超线程 , 一个物理核可以分成 n 个逻辑核 , n为超线程的数量 。 (分身)
来让我们看看单核CPU的草图:
你知道CPU结构也会影响Redis性能吗?文章插图
我们可以从上图看出 , 一个CPU核内在没有开启超线程的时候, 内部是有两个逻辑核的 , 但是为什么我们不把 Redis 实例绑定在其中一个逻辑核上 , 而是绑定在它们的物理核上呢?把 Redis实例绑定在一个物理核上 , 可以让该实例的主进程、子进程、后台线程都共享这个物理核内的两个逻辑核 , 这样可以使这些线程和进程不必只争抢一个逻辑核 , 一定程度上避免的CPU竞争 。 (因为内部有两个供他们选择使用 , 不会只因为使用一个而来回切换) 。
以上这些操作 , 都是小小的起步 , 如果我们还需要进一步提升Redis性能 , 我们需要从源码程度去解读Redis , 深入研究 , 在必要时刻我们可以修改Redis的源码 , 从根源上寻找适合当前问题最佳扳手 。
作者:_BKing
来源:


推荐阅读