Redis实例绑定CPU物理核优化Redis性能

news2024/9/28 13:22:59

进入本次Redis性能调优之前,首先要知道CPU结构也会影响Redis的性能。接下来,具体了解一下!

为什么CPU结构也会影响Redis的性能?

主流的 CPU 架构

一个 CPU 处理器中一般有多个物理核,每个物理核都可以运行应用程序。每个物理核都拥有私有的一级缓存(Level 1 cache,简称 L1 cache),包括一级指令缓存和一级数据缓存,以及私有的二级缓存(Level 2 cache,简称 L2 cache)。物理核的私有缓存指缓存空间只能被当前的物理核使用,其他物理核无法对这个核的缓存空间进行数据存取。

因为 L1 和 L2 缓存是每个物理核私有的,当数据或指令保存在 L1、L2 缓存时,物理核访问它们的延迟不超过 10 纳秒,速度非常快。但是,这些 L1 和 L2 缓存的大小一般只有 KB 级别,存不下太多的数据。如果 L1、L2 缓存中没有所需的数据,应用程序就需要访问内存来获取数据。而应用程序的访存延迟一般在百纳秒级别,是访问 L1、L2 缓存的延迟的近 10 倍,不可避免地会对性能造成影响。所以,不同的物理核还会共享一个共同的三级缓存(Level 3 cache,简称为 L3 cache)。L3 缓存能够使用的存储资源比较多,所以一般比较大,能达到几 MB 到几十 MB,这就能让应用程序缓存更多的数据。当 L1、L2 缓存中没有数据缓存时,可以访问 L3,尽可能避免访问内存。现在主流的 CPU 处理器中,每个物理核通常都会运行两个超线程,也叫作逻辑核。同一个物理核的逻辑核会共享使用 L1、L2 缓存。

在主流的服务器上,一个 CPU 处理器会有 10 到 20 多个物理核。同时,为了提升服务器的处理能力,服务器上通常还会有多个 CPU 处理器(也称为多 CPU Socket),每个处理器有自己的物理核(包括 L1、L2 缓存),L3 缓存,以及连接的内存,同时,不同处理器间通过总线连接。,

在多 CPU 架构上,应用程序可以在不同的处理器上运行。在刚才的图中,Redis 可以先在 Socket 1 上运行一段时间,然后再被调度到 Socket 2 上运行。但是注意:如果应用程序先在一个 Socket 上运行,并且把数据保存到了内存,然后被调度到另一个 Socket 上运行,此时,应用程序再进行内存访问时,就需要访问之前 Socket 上连接的内存,这种访问属于远端内存访问。和访问 Socket 直接连接的内存相比,远端内存访问会增加应用程序的延迟。在多 CPU 架构下,一个应用程序访问所在 Socket 的本地内存和访问远端内存的延迟并不一致,所以也把这个架构称为非统一内存访问架构(Non-Uniform Memory Access,NUMA 架构)。

总结下 CPU 架构对应用程序运行的影响:

L1、L2 缓存中的指令和数据的访问速度很快,所以,充分利用 L1、L2 缓存,可以有效缩短应用程序的执行时间;

在 NUMA 架构下,如果应用程序从一个 Socket 上调度到另一个 Socket 上,就可能会出现远端内存访问的情况,这会直接增加应用程序的执行时间。

CPU 多核对 Redis 性能的影响

在一个 CPU 核上运行时,应用程序需要记录自身使用的软硬件资源信息(例如栈指针、CPU 核的寄存器值等),把这些信息称为运行时信息。同时,应用程序访问最频繁的指令和数据还会被缓存到 L1、L2 缓存上,以便提升执行速度。但是,在多核 CPU 的场景下,一旦应用程序需要在一个新的 CPU 核上运行,那么,运行时信息就需要重新加载到新的 CPU 核上。而且,新的 CPU 核的 L1、L2 缓存也需要重新加载数据和指令,这会导致程序的运行时间增加。如果在 CPU 多核场景下,Redis 实例被频繁调度到不同 CPU 核上运行,对 Redis 实例的请求处理时间影响就更大了。每调度一次,一些请求就会受到运行时信息、指令和数据重新加载过程的影响,这就会导致某些请求的延迟明显高于其他请求。要避免 Redis 总是在不同 CPU 核上来回调度执行。就要把 Redis 实例和 CPU 核绑定,让一个 Redis 实例固定运行在一个 CPU 核上。

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

实际应用 Redis 时,为了提升 Redis 的网络性能,把操作系统的网络中断处理程序和 CPU 核绑定。这个做法可以避免网络中断处理程序在不同核上来回调度执行,的确能有效提升 Redis 的网络处理性能。但是,网络中断程序是要和 Redis 实例进行网络数据交互的,一旦把网络中断程序绑核后,就需要注意 Redis 实例是绑在哪个核上了,这会关系到 Redis 访问网络数据的效率高低。

网络中断处理程序是指什么呢?

当网卡接收到数据后,会触发网卡中断,用来通知操作系统内核进行数据处理。因此,操作系统内核中用来处理网卡中断事件,把数据从内核的缓冲区拷贝到应用程序缓冲区的程序就是指网卡中断处理程序。Redis 实例和网络中断程序的数据交互:网络中断处理程序从网卡硬件中读取数据,并把数据写入到操作系统内核维护的一块内存缓冲区。内核会通过 epoll 机制触发事件,通知 Redis 实例,Redis 实例再把数据从内核的内存缓冲区拷贝到自己的内存空间,如下图所示:

在 CPU 的 NUMA 架构下,当网络中断处理程序、Redis 实例分别和 CPU 核绑定后,就会有一个潜在的风险:如果网络中断处理程序和 Redis 实例各自所绑的 CPU 核不在同一个 CPU Socket 上,那么,Redis 实例读取网络数据时,就需要跨 CPU Socket 访问内存,这个过程会花费较多时间。有人做过测试,和访问 CPU Socket 本地内存相比,跨 CPU Socket 的内存访问延迟增加了 18%,这自然会导致 Redis 处理请求的延迟增加。为了避免 Redis 跨 CPU Socket 访问网络数据,最好把网络中断程序和 Redis 实例绑在同一个 CPU Socket 上,这样一来,Redis 实例就可以直接从本地内存读取网络数据了,如下图所示:

注意:在 CPU 的 NUMA 架构下,对 CPU 核的编号规则,并不是先把一个 CPU Socket 中的所有逻辑核编完,再对下一个 CPU Socket 中的逻辑核编码,而是先给每个 CPU Socket 中每个物理核的第一个逻辑核依次编号,再给每个 CPU Socket 中的物理核的第二个逻辑核依次编号。假设有 2 个 CPU Socket,每个 Socket 上有 6 个物理核,每个物理核又有 2 个逻辑核,总共 24 个逻辑核。执行 lscpu 命令,查看到这些核的编号:

lscpu
Architecture: x86_64
...
NUMA node0 CPU(s): 0-5,12-17
NUMA node1 CPU(s): 6-11,18-23
...

NUMA node0 的 CPU 核编号是 0 到 5、12 到 17。其中,0 到 5 是 node0 上的 6 个物理核中的第一个逻辑核的编号,12 到 17 是相应物理核中的第二个逻辑核编号。NUMA node1 的 CPU 核编号规则和 node0 一样。所以,一定要注意 NUMA 架构下 CPU 核的编号方法,这样才不会绑错核。

绑核的风险和解决方案

当把 Redis 实例绑到一个 CPU 逻辑核上时,就会导致子进程、后台线程和 Redis 主线程竞争 CPU 资源,一旦子进程或后台线程占用 CPU 时,主线程就会被阻塞,导致 Redis 请求延迟增加。针对这种情况,解决方案是一个 Redis 实例对应绑一个物理核。在给 Redis 实例绑核时,不要把一个实例和一个逻辑核绑定,而要和一个物理核绑定,也就是说,把一个物理核的 2 个逻辑核都用上。eg:执行下面的命令,就把 Redis 实例绑定到了逻辑核 0 和 12 上,而这两个核正好都属于物理核 1。

taskset -c 0,12 ./redis-server

和只绑一个逻辑核相比,把 Redis 实例和物理核绑定,可以让主线程、子进程、后台线程共享使用 2 个逻辑核,可以在一定程度上缓解 CPU 资源竞争。

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

秒杀项目绑核实战

之前已经安装过redis了,查看是否实例还在运行;linux查看redis是否安装的命令:

whereis redis-cli
whereis redis-server

通过 lscpu 命令,查看到这些核的编号:

NUMA node0 的 CPU 核编号是0,1;代表双核与自己的云服务器配置符合。

绑核:

后续知识补充

阿里云ECS主机提供的vCPU是指虚拟核,一般对应一个物理核心上的一个超线程,这是因为底层服务器一般会开启超线程。通常,一个物理核心会对应2个超线程,每个超线程对应一个vCPU。多个vCPU一般是在同一个NUMA节点上。如果希望减少CPU超线程对性能的影响,可以通过阿里云SDK的选项关闭超线程。

个人收获:其实这样的Redis优化方案用到的计算机底层体系知识已经很深了,用到的知识和零拷贝关联性很强,关于零拷贝可以看下下面的文章:

https://blog.csdn.net/weixin_39406430/article/details/123715072

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

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

相关文章

docker-微服务篇

docker学习笔记1.docker简介1.1为什么会出现docker?1.2docker理念1.3虚拟机(virtual machine)1.4容器虚拟化技术1.5一次构建到处运行2.docker安装2.1前提条件2.2docker基本构成2.3docker安装步骤*2.4测试镜像3.docker常用命令3.1 启动docker3…

微信小程序 java ssm Springboot学生作业提交管理系统

系统具有良好的集成性,提供标准接口,以实现与其他相关系统的功能和数据集成。开放性好,便于系统的升级维护、以及与各种信息系统进行集成。功能定位充分考虑平台服务对象的需求。 一个微信小程序由.js、.json、.wxml、.wxss四种文件构成&…

zookeeper和kafka集群从0到1搭建(保姆教程)

一、环境准备 1、准备3台机器 主机名称 主机IP zookeeper版本 kafka版本 主机名称主机IPzookeeper版本kafka版本worker01192.168.179.128zookeeper-3.4.14.tar.gzkafka_2.12-2.2.1.tgzworker02192.168.179.129zookeeper-3.4.14.tar.gzkafka_2.12-2.2.1.tgzworker03192.168.1…

Arduino IDE 2.0.6中 ESP32开发环境搭建笔记

Arduino IDE 2.0.6中 ESP32开发环境搭建 Arduino IDE2.0 已上线一段时间,以后ESP32的学习转至新的IDE中 ,需对开发环境进行。 Arduino IDE2.0与1.0有很大差异。原来环境搭建方法已完全不同。下文主要记录环…

Docker进阶 - 13. Docker 容器监控之 CAdvisor+InfluxDB+Granfana (CIG) 简介

目录 1. CIG 产生原因 2. CIG 是什么 3. CIG 详细介绍 1. CIG 产生原因 使用docker stats命令可以看到当前宿主机上所有容器的CPU,内存以及网络流量等数据,简单的监控够用。但是docker stats统计结果只能是当前宿主机的全部容器,数据资料是实时的&am…

外包干了5年,寄了

前两天有读者想我资讯: 我是一名软件测试工程师,工作已经四年多快五年了。现在正在找工作,由于一直做的都是外包的项目。技术方面都不是很深入,现在找工作都是会问一些,测试框架,自动化测试,感…

微信公众号(二)每日推送详细教程(ChatGPT对话机器人)

微信公众号(二)每日推送详细教程(ChatGPT对话机器人)1.准备阶段1.1 基础性配置1.2 申请ChatGPT账号2. 配置阶段2.1 配置application.yml文件2.2 EnableChatGPT注解3. 部署效果图如下 1.准备阶段 1.1 基础性配置 首先下载源码…

Vue3+SpringBoot实现【登录】【毛玻璃】【渐变色】

首先创建Login.vue&#xff0c;编写界面和样式 这个是渐变色背景&#xff0c;登陆框背景为白色 <template><div class"wrapper"><div style"margin: 200px auto; background-color: #fff; width: 350px; height: 300px;padding: 20px;border-r…

hadoop高可用+mapreduce on yarn集群搭建

虚拟机安装 本次安装了四台虚拟机&#xff1a;hadoop001、hadoop002、hadoop003、hadoop004&#xff0c;安装过程略过 移除虚拟机自带jdk rpm -qa | grep -i java | xargs -n1 rpm -e --nodeps关闭防火墙 systemctl stop firewalld systemctl disable firewalld.service给普…

MyBatis-Plus基本CRUD

MyBatis-Plus基本CRUD三、基本CRUD1、BaseMapper2、插入3、删除a>通过id删除记录b>通过id批量删除记录c>通过map条件删除记录4、通过id修改一条记录5、查询a>根据id查询用户信息b>根据多个id查询多个用户信息c>通过map条件查询用户信息d>查询所有数据6、通…

微软ATP智汇十二道场 · 探索AI 驱动转型(北京专场)

为了推动微软与苏州人工智能产业创新中心共同构建企业级AI创新生态圈&#xff0c;微软ATP定于2023年3月3日在微软亚太研发集团总部&#xff08;北京&#xff09;举办“微软ATP智汇十二道场 探索AI 驱动转型”线下活动。 ▍微软探索AI商用&#xff0c;避免“创新陷阱”ChatGPT …

Lesson 6.6 多分类评估指标的 macro 和 weighted 过程 Lesson 6.7 GridSearchCV 的进阶使用方法

文章目录一、多分类评估指标的 macro 和 weighted 过程1. 多分类 F1-Score 评估指标2. 多分类 ROC-AUC 评估指标二、借助机器学习流构建全域参数搜索空间三、优化评估指标选取1. 高级评估指标的选用方法2. 同时输入多组评估指标四、优化后建模流程在正式讨论关于网格搜索的进阶…

Element UI框架学习篇(六)

Element UI框架学习篇(六) 1 删除数据 1.1 前台核心函数 1.1.1 elementUI中的消息提示框语法 //①其中type类型和el-button中的type类型是一致的,有info灰色,success绿色,danger红色,warning黄色,primary蓝色 //②message是你所要填写的提示信息 //③建议都用,因为比双引号…

字符串装换整数(atoi)-力扣8-java

一、题目描述请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。函数 myAtoi(string s) 的算法如下&#xff1a;读入字符串并丢弃无用的前导空格检查下一个字符&#xff08;假设还未…

合宙ESP32S3-CORE开发板|保姆级|Arduino IDE|windows11|esp32S3支持库|helloword例程:Arduino 环境搭建

Arduino主页网址&#xff1a; Software | Arduino 以windows11版本为例&#xff1a; Arduino IDE最新版本为2.0.3 左边的按钮是直接下载&#xff08;免捐赠&#xff09;&#xff1a; 下载安装完成后&#xff0c;更改软件默认语言&#xff1a; 默认的库是不支持ESP32的&#…

Allegro如何更改铜皮显示密度操作指导

Allegro如何更改铜皮显示密度操作指导 用Allegro做PCB设计的时候,铜皮正常显示模式如下图 铜皮的密度是基本填充满的,Allegro支持更改铜皮的显示密度 如下图 如何更改密度,具体操作如下 点击setup

Element UI框架学习篇(七)

Element UI框架学习篇(七) 1 新增员工 1.1 前台部分 1.1.1 在vue实例的data里面准备好需要的对象以及属性 addStatus:false,//判断是否弹出新增用户弹窗dailog,为true就显示depts:[],//部门信息mgrs:[],//上级领导信息jobs:[],//工作岗位信息//新增用户所需要的对象newEmp:…

Top-1错误率、Top-5错误率等常见的模型算法评估指标解析

Top-1 错误率&#xff1a;指预测输出的概率最高的类别与人工标注的类别相符的准确率&#xff0c;就是你预测的label取最后概率向量里面最大的那一个作为预测结果&#xff0c;如过你的预测结果中概率最大的那个分类正确&#xff0c;则预测正确&#xff0c;否则预测错误。比如预测…

Zabbix 构建监控告警平台(五)

Zabbix 自动发现Zabbix 自动注册1.Zabbix 自动发现 1.1前言 为了满足监控企业成千上万台服务器&#xff0c;因此我们需要使用Zabbix批量监控来实现。自动发现和自动注册。 1.2zabbix-server &#xff08;一&#xff09;1、创建自动发现规则 在“配置”->“自动发现”->“…

Spring Boot 快速入门(绝对经典)

目录 1、理论概述 1.1、什么是Spring Boot? 1.2、Spring Boot的特点 1.3、开发环境 2、实战——创建和配置项目 2.1、Spring Boot项目创建的两种方式 2.1.1、方法一&#xff1a;通过网站构建项目 2.1.2、使用Spring Initializr创建&#xff08;推荐&#xff09; 2.2、…