Redis:性能风险之CPU核和NUMA架构的影响

2023-11-01

【关于作者】

关于作者,目前在蚂蚁金服搬砖任职,在支付宝营销投放领域工作了多年,目前在专注于内存数据库相关的应用学习,如果你有任何技术交流或大厂内推及面试咨询,都可以从我的个人博客(https://0522-isniceday.top/)联系我

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IRTiCXe-1680957421197)(https://zhangyuxiangplus.oss-cn-hangzhou.aliyuncs.com/boke/CPU核和NUMA架构的影响.png)]

1.主流CPU架构

物理核:CPU中一般有多个运行核心,一个运行核心称作物理核,每个物理核都可以独立的运行程序

一级缓存(Level 1 cache,简称L1 cache):为每个物理核所私有,包括一级指令缓存和一级数据缓存

二级缓存(Level 2 cache,简称L2 cache):为每个物理核所私有

物理核的私有缓存:指缓存空间只能被当前物理核所使用,其他物理核无法对该缓存空间的数据进行读取。一级、二级都是私有缓存,并且物理核访问L1和L2非常快,一般为10纳秒,但是L1和L2的空间非常小,一般为KB级别,如果L1或L2中找不到数据那么就只能从访存查找,速度大约为百纳秒。

物理核具体架构如下:

img

三级缓存(Level 3 cache,简称L3 cache):不同的物理核可以共享L3缓存,一般为几十MB,能够缓存更多数据,当L1、L2无法查询到数据时,可以从L3查找

逻辑核:每个物理核中会运行两个超线程,也叫逻辑核。同一个物理核的逻辑核会共享L1、L2

具体关系如下:

img

处理器:主流服务器上通常会有多个处理器(CPU Socket),而一个处理器上可能会有10-20个物理核(L1、L2缓存),L3缓存,以及连接的内存(不同处理器会连接不同的内存?),不同处理器通过主线连接

img

多CPU架构上,redis可以在不同的处理器上运行。例如Redis可以先在Socket 1上运行一段时间,然后再被调度到Socket 2上运行。

远端内存访问:redis在CPU Socket 1上运行并将数据存储到了其所连接的内存,这个时候被调度到Socket 2运行,此时如果读取数据需要连接到Socket 1的内存中取读取,这就叫远端内存访问。

非同一内存访问架构(Non-Uniform Memory Access,NUMA架构):多CPU架构下,应用程序访问直连内存和远端内存的延迟并不会一致,远端内存访问会增加应用程序的延迟,这个架构就叫非同一内存访问架构。不同Socket通过总线进行通信,不同物理核之间通过QPI(Quick Path Interconnect)进行通信

2.CPU多核对Redis的性能影响

运行时信息:在CPU核上运行时,应用程序需要记录自身用到的软硬件资源(例如栈指针,用到的寄存器的值等),这些信息称为运行时信息。同时应用程序访问最频繁的指令和数据会缓存在L1、L2缓存

多核场景下:应用程序可能会需要到一个新的核上运行,此时就需要重新加载运行时信息(context switch,上下文切换),并且重新加载L1、L2缓存的数据,这个过程会导致程序的运行时间增加

context switch :运行数据及L1、L2的重新加载就是上下文切换,频繁的context switch会影响应用程序,因为切换是需要耗费时间用于L1、L2或者L3缓存及运行时信息的重新加载,并且redis实例需要等待加载完成才能够处理请求。

如何避免上下文切换呢?

使用taskset命令将redis实例绑定在一个核上运行, -c 设置绑定的编号

taskset -c 0 ./redis-server

3.CPU的NUMA架构对Redis的性能影响

3.1.NUMA架构

由于采用NUMA架构的原因,所有实例会优先使用这一个节点的内存,当这个节点内存不足时,再经过总线去申请另一个CPU Socket下的内存,此时也会增加延迟。

3.2.NUMA架构对Redis的影响

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

img

在CPU多核的场景下,用taskset命令把Redis实例和一个核绑定,可以减少Redis实例在不同核上被来回调度执行的开销,避免较高的尾延迟;在多CPU的NUMA架构下,如果你对网络中断程序做了绑核操作,建议你同时把Redis实例和网络中断程序绑在同一个CPU Socket的不同核上,这样可以避免Redis跨Socket访问内存中的网络数据的时间开销

为了提升Redis的网络性能,我们有时还会把网络中断处理程序和CPU核绑定。在这种情况下,如果服务器使用的是NUMA架构,Redis实例一旦被调度到和中断处理程序不在同一个CPU Socket,就要跨CPU Socket访问网络数据,这就会降低Redis的性能。所以,我建议你把Redis实例和网络中断处理程序绑在同一个CPU Socket下的不同核上,这样可以提升Redis的运行性能

3.3.绑核所带来的风险及解决办法

当我们把Redis实例绑到一个CPU逻辑核上时,就会导致子进程、后台线程和Redis主线程竞争CPU资源,一旦子进程或后台线程占用CPU时,主线程就会被阻塞,导致Redis请求延迟增加

方案一:一个Redis实例对应绑一个物理核

在给Redis实例绑核时,我们不要把一个实例和一个逻辑核绑定,而要和一个物理核绑定,也就是说,把一个物理核的2个逻辑核都用上,这样,Redis的主线程、子进程和后台线程可以共享使用一个物理核上的两个逻辑核

方案二:优化Redis源码

如果你很熟悉Redis的源码,就可以在源码中增加绑核操作,把子进程和后台线程绑到不同的核上,这样可以避免对主线程的CPU资源竞争。不过,如果你不熟悉Redis源码,也不用太担心,Redis 6.0出来后,可以支持CPU核绑定的配置操作了,我将在第38讲中向你介绍Redis 6.0的最新特性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis:性能风险之CPU核和NUMA架构的影响 的相关文章

  • connect-redis - 如何保护会话对象免受竞争条件影响

    我使用 nodejs 和 connect redis 来存储会话数据 我将用户数据保存在会话中 并在会话生命周期中使用它 我注意到两个更改会话数据的请求之间可能存在竞争条件 我尝试过使用 redis lock 来锁定会话 但这对我来说有点问
  • python 3.5 中的 json.loads 和 Redis

    我使用 json dumps 创建了一个 JSON 对象 并在 Redis 列表中将其 RPUSH ed 当使用 LRANGE redis lrange 返回 JSON 时 我收到一个二进制字符串 b si 00 ff 所以 json lo
  • Stackexchange.redis 缺乏“WAIT”支持

    我在客户端应用程序正在使用的负载均衡器后面有 3 个 Web API 服务器 我正在使用这个库来访问具有一个主服务器和几个从服务器的 Redis 集群 目前不支持 WAIT 操作 我需要此功能来存储新创建的用户会话并等待它复制到所有从属服务
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • redis集群不断打印日志WSA_IO_PENDING

    当我启动redis集群的所有redis服务器时 所有这些服务器不断打印类似WSA IO PENDING clusterWriteDone的日志 9956 03 Feb 18 17 25 044 WSA IO PENDING writing
  • Redis键空间事件不触发

    我有两个 Redis 客户端 在一个文件中我有一个简单的脚本设置并删除了 Redis 键 var redis require redis var client redis createClient 6379 127 0 0 1 client
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • Caffeine Expiry 中如何设置多个过期标准?

    我正在使用 Caffeine v2 8 5 我想创建一个具有可变到期时间的缓存 基于 值的创建 更新以及 该值的最后一次访问 读取 无论先发生什么都应该触发该条目的删除 缓存将成为三层值解析的一部分 The key is present i
  • 在 aws-elasticache 上使用 memcached 或 Redis

    我正在 AWS 上开发一个应用程序 并使用 AWS elasticache 进行缓存 我对使用 memcached 或 redis 感到困惑 我阅读了有关 redis 3 0 2 更新以及它现在如何等同于 memchached 的文章 ht
  • 如何在Redis中从hmset()切换到hset()?

    我收到弃用警告 即 Redis hmset 已弃用 请改用 Redis hset 但是 hset 采用第三个参数 我不知道是什么name应该是 info users 10 timestamp datetime utcnow strftime
  • Redis Cluster 与 Pub/Sub 中的 ZeroMQ,用于水平扩展的分布式系统

    如果我要设计一个巨大的分布式系统 其吞吐量应随系统中的订阅者数量和通道数量线性扩展 哪个会更好 1 Redis集群 仅适用于Redis 3 0 alpha 如果是集群模式 您可以在一个节点上发布并在另一个完全不同的节点上订阅 消息将传播并到
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • Spring Data JPA Redis:无法编写基于自定义方法的查询

    我已经使用 Redis 配置了 Spring Data JPA 并使用RedisRepositorieswith 提供了类似的方法find findAll 所有这些方法似乎都工作得很好 但我无法编写我的自定义方法 RedisEntity f
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • 如何使redis中的“HSET”子键“过期”?

    我需要使 Redis 哈希中所有超过 1 个月的密钥过期 这不可能 https github com antirez redis issues 167 issuecomment 2559040 为了保持 Redis 简单 https git
  • Scala 使用的 Redis 客户端库建议

    我正在计划使用 Scala 中的 Redis 实例进行一些工作 并正在寻找有关使用哪些客户端库的建议 理想情况下 如果存在一个好的库 我希望有一个为 Scala 而不是 Java 设计的库 但如果现在这是更好的方法 那么仅使用 Java 客
  • 如何在Redis中只保存一个数据库?

    我是 Redis 新手 有一个与备份相关的问题 目前 我有一个实例在 Windows 服务器上运行 在这个实例中 我当前有一项 工作 将数据存储在一个数据库中 我不想备份这些数据 我必须创造一份新工作 我的第一个想法是将数据存储在另一个数据
  • Laravel 异常队列最大尝试次数超出

    我创建了一个应用程序来向多个用户发送电子邮件 但在处理大量收件人时遇到问题 该错误出现在failed jobs table Illuminate Queue MaxAttemptsExceededException App Jobs ESe

随机推荐

  • java opencv边缘提取

    1 下载opencv Releases OpenCV 2 找到jar包D opencv opencv build java 3 各种方式引入到项目中 这里直接buildpath 4 若报错no opencv java451 in java
  • 【蓝桥杯】第八届省赛 - 分巧克力(二分)

    儿童节那天有 K K K 位小朋友到小明家做客 小明拿出了珍藏的巧克力招待小朋友们 小明一共有 N N N 块巧克力 其中第 i
  • 案例:scrapy图片数据爬取之ImagesPipeline

    1 需求 爬取站长素材中的高清图片 http sc chinaz com tupian 2 编码流程 创建和使用 Scrapy 工程 scrapy startproject imgPro 创建出爬虫文件 cd myscrapy scrapy
  • 去除摇一摇功能(hook技术)破解防模拟器检测

    某某社区摇一摇功能 App入口为 com qufan vp module LaunchActivity 思路 首次安装APP会进入一个引导页面和摇一摇检测页面 检测过后在本地产生一个Code 然后第二进入时候会找到这个code进行对比 如果
  • vue3安装及环境配置

    1 安装 Node js Node js 官网 https nodejs org en download 根据直接的版本去下载 安装成功后 在cmd控制台输入nonde v 和npm v 验证是否安装成功 配置默认安装目录和缓存日志目录 创
  • TIDB简介及TIDB部署、原理和使用介绍

    TiDB简介及TiDB部署 原理和使用介绍 从MySQL架构到TiDB 数据库分类 介绍TiDB数据库之前 先引入使用场景 如今的数据库种类繁多 RDBMS 关系型数据库 NoSQL Not Only SQL NewSQL 在数据库领域均有
  • 从“火热”到“退烧”,付费自习室将何去何从?

    近几年随着考编 考研大军的人数爆炸式增长 国内付费自习室也愈加火热 逐渐开始替代图书馆 咖啡厅等传统自习室 成为备考人群的新选择 2019年 国内第一家付费自习室在北京成立 此后 付费自习室数量大幅上升 掀起一股热潮 据新华网报道 仅仅这一
  • Clickhouse创建用户

    clickhouse创建用户 clickhouse创建新用户并配置权限 需要修改配置文件users xml 其中 要配置的内容包括 1 用户名 设为test 2 密码 需事先确定好 并用sha256加密 3 可访问的数据库 设为test 具
  • 强化学习PPO:Proximal Policy Optimization Algorithms解读

    PPO算法是一类Policy Gradient强化学习方法 经典的Policy Gradient通过一个参数化决策模型来根据状态确定动作 其参数更新是通过下式进行的 用于衡量决策模型的优劣目标 决策模型的优化目标为寻找最优决策 使得该决策下
  • 物联网开发103 - Micropython ESP32用增强固件驱动st7735s显示屏显示日期时钟和汉字

    一 目的 这一节我们来学习如何使用SP32使用加强版本的固件 加载中文字库 驱动st7735显示屏来显示汉字 二 环境 ESP32开发板 MicroPython v1 15 13 g530c76f6c dirty on 2021 04 30
  • websocket握手失败_探讨Netty获取并检查Websocket握手请求的两种方式

    在使用Netty开发Websocket服务时 通常需要解析来自客户端请求的URL Headers等等相关内容 并做相关检查或处理 本文将讨论两种实现方法 方法一 基于HandshakeComplete自定义事件 特点 使用简单 校验在握手成
  • visual studio:安装visual studio 2019后发现MSVC v140-VS 2015 C++安装位置出错删除办法

    安装visual studio 2019发现vs140安装位置默认安装在D Program Files x86 然后安装vs2015发现安装位置被定死了怎么办 打开visual studio 2019的安装程序 gt 修改 gt 右侧 使用
  • mysqldump常用备份恢复方法

    mysqldump常用备份恢复方法 2015 04 24 14 28 33 mysqldump常用备份恢复方法 一 使用mysqldump对数据库进行备份 1 全备份单库 语法 mysqldump h主机名 P端口 u用户名 p密码 数据库
  • 中职网络安全2022国赛之隐写术应用

    简介 有什么不会的可以来问我 3316735898 需要题目 解题工具和脚本的也可以来找我 1 找出文件夹1中的文件 将文件中的隐藏信息作为Flag值提交 打开文件 将文件放入kali 查询文件内部是否有其他文件 binwalk final
  • upload-labs(还没做完)

    参考资料 pass 1 前端验证 这题前端验证 直接把js禁了就行 上传zoe php 成功 pass 2 MIME绕过 支持jpeg png gif类型 那就bp抓包该类型 pass 3 特殊后缀名绕过 没有禁特殊后缀名 那就用php3
  • 最全iOS12捷径库收集整理,iOS12捷径推荐

    收集整理一波iOS12的捷径库 使用方法见文末 大家使用过程中如果发现有啥问题或者想实现什么捷径 可以关注微信公众号 云峰小罗 找到我 1 抖音视频无水印下载 2 清除照片位置信息 3 获取热门新闻 4 照片拼图 5 录制音频笔记至印象笔记
  • Unity Image 适配 text 类似-父适配儿

    Unity Image 适配 text 类似 父适配儿
  • 在GNS3上模拟出虚拟私有网络(GRE与IPsec)

    GRE 实验背景 R1 R5为两间私有公司 R2 R4分别为该公司的边界路由器 R3为internet 现配置GRE协议 实现R1能够访问R5内网 实验拓扑 实验步骤 1 配置网络底层 R1 R5配置 以R1为例 R2 R4边界路由器的配置
  • 【C语言】消息队列

    C queue 读取消息队列代码 消息队列 写 代码 读取消息队列代码 include
  • Redis:性能风险之CPU核和NUMA架构的影响

    文章目录 关于作者 1 主流CPU架构 2 CPU多核对Redis的性能影响 3 CPU的NUMA架构对Redis的性能影响 3 1 NUMA架构 3 2 NUMA架构对Redis的影响 3 3 绑核所带来的风险及解决办法 关于作者 关于作