[转帖]Redis如何绑定CPU

news/2024/9/26 5:21:51
https://wenfh2020.com/2023/10/08/https/

 

发布时间:2022-03-08 09:44:39 阅读:649 作者:小新 栏目:开发技术
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这篇文章主要介绍了Redis如何绑定CPU,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

绑定 CPU

Redis 6.0 开始支持绑定 CPU,可以有效减少线程上下文切换。

CPU 亲和性(CPU Affinity)是一种调度属性,它将一个进程或线程,「绑定」到一个或一组 CPU 上。也称为 CPU 绑定。

设置 CPU 亲和性可以一定程度避免 CPU 上下文切换,提高 CPU L1、L2 Cache 命中率。

早期「SMP」架构下,每个 CPU 通过 BUS 总线共享资源。CPU 绑定意义不大。

Redis如何绑定CPU
而在当前主流的「NUMA」架构下,每个 CPU 有自己的本地内存。访问本地内存有更快的速度。而访问其他 CPU 内存会导致较大的延迟。这时,CPU 绑定对系统运行速度的提升有较大的意义。

Redis如何绑定CPU
现实中的 NUMA 架构比上图更复杂,通常会将 CPU 分组,若干个 CPU 分配一组内存,称为 「node」

你可以通过 「numactl -H 」 命令来查看 NUMA 硬件信息。

$ numactl -H
available: 2 nodes (0-1)node 0 cpus: 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38
node 0 size: 32143 MB
node free: 26681 MB
node 1 cpus: 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
node 1 size: 32309 MB
node free: 24958 MB
node distances:
node 1
  0: 10 21
  1: 21 10

上图中可以得知该机器有 40 个 CPU,分组为 2 个 node。

node distances 是一个二维矩阵,表示 node 之间 「访问距离」,10 为基准值。上述命令中可以得知,node 自身访问,距离是 10。跨 node 访问,如 node 0 访问 node 1 距离为 21。说明该机器「跨 node 访问速度」比「node 自身访问速度」慢 2.1 倍。

其实,早在 2015 年,有人提出 Redis 需要支持设置 CPU 亲和性,而当时的 Redis 还没有支持 IO 多线程,该提议搁置。

而 Redis 6.0 引入 IO 多线程。同时,也支持了设置 CPU 亲和性

我画了一张 Redis 6.0 线程家族供你参考。

Redis如何绑定CPU

上图可分为 3 个模块

  • 主线程和 IO 线程:负责命令读取、解析、结果返回。命令执行由主线程完成。

  • bio 线程:负责执行耗时的异步任务,如 close fd。

  • 后台进程:fork 子进程来执行耗时的命令。

Redis 支持分别配置上述模块的 CPU 亲和度。你可以在 redis.conf 找到以下配置(该配置需手动开启)。

# IO 线程(包含主线程)绑定到 CPU 0、2、4、6
server_cpulist 0-7:2
# bio 线程绑定到 CPU 1、3
bio_cpulist 1,3
# aof rewrite 后台进程绑定到 CPU 8、9、10、11
aof_rewrite_cpulist 8-11
# bgsave 后台进程绑定到 CPU 1、10、11
bgsave_cpulist 1,10-11

我在上述机器,针对 IO 线程和主线程,进行如下测试:

首先,开启 IO 线程配置

io-threads 4 # 主线程 + 3 个 IO 线程io-threads-do-reads yes # IO 线程开启读和解析命令功能

测试如下三种场景:

  1. 不开启 CPU 绑定配置。

  2. 绑定到不同 node。
    「server_cpulist 0,1,2,3」

  3. 绑定到相同 node。
    「server_cpulist 0,2,4,6」

通过 redis-benchmark 对 get 命令进行基准测试,每种场景执行 3 次。

$ redis-benchmark -n 5000000 -c 50 -t get --threads 4

结果如下:

1.不开启 CPU 绑定配置

throughput summary: 248818.11 requests per second
throughput summary: 248694.36 requests per second
throughput summary: 249004.00 requests per second

2.绑定不同 node

throughput summary: 248880.03 requests per second
throughput summary: 248447.20 requests per second
throughput summary: 248818.11 requests per second

3.绑定相同 node

throughput summary: 284414.09 requests per second
throughput summary: 284333.25 requests per second
throughput summary: 265252.00 requests per second

根据测试结果,绑定到同一个 node,qps 大约提升 15%

使用绑定 CPU,你需要注意以下几点:

  1. Linux 下,你可以使用 「numactl --hardware」 查看硬件布局,确保支持并开启 NUMA。

  2. 线程要尽可能分布在 「不同的 CPU,相同的 node」,设置 CPU 亲和度才有效。否则会造成频繁上下文切换和远距离内存访问。

  3. 你要熟悉 CPU 架构,做好充分的测试。否则可能适得其反,导致 Redis 性能下降。

感谢你能够认真阅读完这篇文章,希望小编分享的“Redis如何绑定CPU”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/46071.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

【日记】梦到兄长要给鳄鱼换牙齿……(421 字)

正文今天中午睡了一个小时多一点,做了一个很奇怪的梦。梦见兄长要给一条鳄鱼换牙齿,还说早上不好操作,要三天之后的中午或晚上,颇有一种翻黄历寻个良辰吉日之感。但我没那样大的耐性,便捏住鳄鱼的嘴,左摔右摔给它摔晕了,叫哥哥来换。兄长说摔晕了没意思,后面记不清了。…

如何修改docker容器的重启策略(重启模式)?

如何修改docker容器的重启策略(重启模式)? 使用命令进行修改: docker container update --restart=unless-stopped mongodb示例: 执行命令:执行后成功的结果:Docker容器的重启策略Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。 Dock…

ToDesk勾上摄像头会看到我吗?如何关闭摄像头

ToDesk远程控制软件除了能跨系统跨设备进行远控连接外,其实还有很多实用的小功能在日常生活派上用场。 就比如远程摄像头,可以用来远程查看被控电脑的环境情况,用来监控家里宠物和小孩的情况等等。可能很多小伙伴使用的时候会顾虑,远程开启摄像头后是否会看到主控端的本人?…

ToDesk云电脑性能如何?价格划算吗?

云电脑是最近兴起的一种新型计算机形态。当用户面临电脑配置太低,无法顺畅打开大型软件,满足不了日常玩游戏或者高性能渲染,这时候你只需要租借一个高配置的云电脑。 不需要额外购入任何设备,在原来的电脑上下载云电脑的软件,通过网络连接就能在云端上使用云电脑,轻轻松松…

Android案例分享,基于瑞芯微RK3568国产平台!

开发环境说明 Windows开发环境:Windows7 64bit、Windows10 64bit 虚拟机:VMware15.5.5 AndroidSDK编译环境:Ubuntu18.04.4 64bit Android Studio版本:android-studio-2022.3.1.19(Windows版本) Android系统:Android 13 AndroidSDK:Rockchip_Android13_SDK_Release硬件平…

SQLMAP使用参数

get型常用参数 -u:指定注入的URL sqlmap -u URL --dbs:爆出所有数据库 sqlmap -u URL --dbs --dbms:指定数据库类型 sqlmap -u URL --dbms=mysql --users:查看数据库的所有用户 sqlmap -u URL --users --current-user:查看数据库当前用户 sqlmap -u URL --current-user …

SQL去重

记得很多年前,有个测试妹子找到我:强哥,我这个表数据重复了,怎么把重复的数据删掉呀?类似的需要将数据去重的场景,在实际工作中还是比较常见的。今天我们就来说说,使用SQL语句来去重,有哪些常见的方法。假如我们有一张student表:create table student( id int, …

Docker 部署 YApi 记录

最近想在 linux 环境部署YApi 对接口文档进行管理,只不过基于 官方的部署方式,需要npm 的配置,而且中间踩了很多坑比如 YApi版本, Node js版本......想着还是使用 Docker 部署吧, 找到了这位大佬的部署方式: https://www.jianshu.com/p/a97d2efb23c5 基于大佬的配置,终于…