redis 性能优化一

目录

前言

尾延迟


前言

说到redis 性能优化,优化的目的是什么?提高响应,减少延迟。就要关注两点,一是尾延迟,二是Redis 的基线性能。只有指标,我们的优化,才有意义,才能做监控以及报警。这些指标需要借助一定工具进行压力测试,高于这个值就说明需要优化了,这些值,不是绝对的,不同的服务器配置,都会有一些变化,下面我将介绍这两点。

尾延迟

不同公司,不同业务有不同的要求。比如有些公司要求redis 的请求 99% 的 GET 请求要小于400微妙,PUT 请求要小于500微妙。99% 是什么呢?比如说,我们有1000个请求,假设按请求延迟从小到大排序后,第 991 个请求的延迟实测值是 1ms,而前 990 个请求的延迟都小于 1ms,所以,这里 99% 尾延迟就是 1ms。这就是尾延迟,我们必须要把前991个请求的延迟时间在我们的要求范围内。

对于这个问题,我们该怎么优化呢?可以从下面这几个方面考虑

  1. 降低操作命令的复杂度

  2. 同时关闭RDB 和 AOF

  3. 一个 Redis 实例对应绑一个物理核

第1点有点难,操作命令复杂度其实与业务有关,但是也可以考虑用复杂度低的操作,这个看业务

第2点根据业务和架构,如果redis 不是主从也不是集群以及这些数据不需要实例话,那么可以关闭RDB和AOF的

第3点我只想稍微解释下,需要大家对cpu 的结构有一定的理解,我从网上找了一个cpu架构图。

上图中第一个L3 cache 代表第一个cpu,第二哥 L3 cache 代表第二个cpu。每个cpu 都有两个物理核。

上面是多cpu 架构,在多cpu架构上,应用程序可以在不同的处理器上运行。也就是说Redis 可以现在第一个cpu 上运行一段时间,然后在被调度到第二个cpu 运行。Redis 现在第一个cpu 上运行,并且把数据保持到了L1,L2 ,L3 cache。然后又被调度到第二个cpu上运行,此时在访问数据就会去第一个cpu 的 L1,L2 ,L3 cache上的数据,这种属于远程远端内存访问。

在一个 CPU 核上运行时,应用程序需要记录自身使用的软硬件资源信息(例如栈指针、CPU 核的寄存器值等),我们把这些信息称为运行时信息。同时,应用程序访问最频繁的指令和数据还会被缓存到 L1、L2 缓存上,以便提升执行速度。

但是,在多核 CPU 的场景下,一旦应用程序需要在一个新的 CPU 核上运行,那么,运行时信息就需要重新加载到新的 CPU 核上。而且,新的 CPU 核的 L1、L2 缓存也需要重新加载数据和指令,这会导致程序的运行时间增加。

这个优化点不是一股脑的就去优化,我们仔细检测 Redis 实例运行时的服务器 CPU 的状态指标值,如果redis CPU 的 context switch 次数比较多,就需要优化。

context switch 是指线程的上下文切换,这里的上下文就是线程的运行时信息。在 CPU 多核的环境中,一个线程先在一个 CPU 核上运行,之后又切换到另一个 CPU 核上运行,这时就会发生 context switch。

当 context switch 发生后,Redis 主线程的运行时信息需要被重新加载到另一个 CPU 核上,而且,此时,另一个 CPU 核上的 L1、L2 缓存中,并没有 Redis 实例之前运行时频繁访问的指令和数据,所以,这些指令和数据都需要重新从 L3 缓存,甚至是内存中加载。这个重新加载的过程是需要花费一定时间的。而且,Redis 实例需要等待这个重新加载的过程完成后,才能开始处理请求,所以,这也会导致一些请求的处理时间增加。

在linux 系统下可以用下面命令查看程序的context switch:

cswch 表示自愿的上下文切换,进程运行时由于系统资源不足,如IO,内存等原因不得不进行切换。

nvcswch 表示非自愿的上下文切换,比如时间片用完,系统调度让其他任务运行,或者竞争CPU的时候也会发生。

cswch/s 表示每秒上下文切换次数。

那么怎的绑定呢,可以用 taskset 命令,命令如下:

taskset -c 0 ./redis-server

就把 Redis 实例绑在了 0 号核上,其中,“-c”选项用于设置要绑定的核编号。

我们在《redis 为什么会阻塞》讲过,redis 不仅有对redis 主线程关键路径上的操作,还有子线程aof 重写,生成rdb 操作。主线程和子线程都会资源竞争,在aof 重写等情况下,主线程会被阻塞,为了缓解这么状况,应该把cpu物理核的所有核都绑定上。

我们用lscpu 查看cpu 所有的逻辑核:

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

上面表示的一个服务器,有两个cpu 分别是node0,node1 。 每个cpu 是6个物理核,每个物理核又有两个逻辑核,总共24个逻辑核。它的编号规则是,先编号每个物理核的第一个逻辑核,在编号第二个物理核的所有逻辑核

对于node0 来说 0-5 的意思是:

0 第一个物理核的第一个逻辑核 ,1 第二个物理核的第一个逻辑核,2 第三个物理核的第一个逻辑核,3 第四个物理核的第一个逻辑核,4 第五个物理核的第一个逻辑核,5 第六个物理核的第一个逻辑核

对于node0 来说 12-17 的意思是:

12 第一个物理核的第二个逻辑核,13 第二个物理核的第二个逻辑核,14 第三个物理核的第二个逻辑核,15 第四个物理核的第二个逻辑核,16 第五个物理核的第二个逻辑核,17 第六个物理核的第二个逻辑核

那么如我我们要绑定cpu 的第一个物理核上,综上所述可以这么写:

taskset -c 0,12 ./redis-server

还可以进一步优化,把子进程和后台线程绑到不同的 CPU 核上。对于Redis 6.0 以上的版本可以通过配置 (redis.conf) :

io-threads-affinity 1,13   //绑定到第一个cpu第二个物理核上

对于 Redis 6.0 以下可以修改源码,现在大家用的都是高版本,对于修改源码不讲解了,大家用的也不会太多,而且必须对源码有很深的理解。

篇幅比较长下基线性能测试放到下一篇了。

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

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

相关文章

玩一会小乌龟

滚滚长江东逝水,浪花淘尽英雄。 是非成败转头空。青山依旧在,几度夕阳红。 白发渔樵江渚上,惯看秋月春风。 一壶浊酒喜相逢。古今多少事,都付笑谈中。 画一个正方形 import turtle# 创建一个Turtle对象 t turtle.Turtle()# 循环…

【开发工具】Git模拟多人开发场景理解分支管理和远程仓库操作

我们来模拟一个多人多分支的开发场景。假设你有一个新的空白远程仓库,假设地址是 https://github.com/user/repo.git。 克隆远程仓库到本地 $ git clone https://github.com/user/repo.git这会在本地创建一个 repo 目录,并自动设置远程主机为 origin。 创建本地开发分支并推送…

学术论文GPT的源码解读与二次开发:从ChatPaper到gpt_academic

前言 本文的前两个部分最早是属于此旧文的《学术论文GPT的源码解读与微调:从ChatPaper到七月论文审稿GPT第1版》,但为了每一篇文章各自的内容更好的呈现,于是我今天做了以下三个改动 原来属于mamba第五部分的「Mamba近似工作之线性Transfor…

开源模型应用落地-工具使用篇-Spring AI(七)

一、前言 在AI大模型百花齐放的时代,很多人都对新兴技术充满了热情,都想尝试一下。但是,实际上要入门AI技术的门槛非常高。除了需要高端设备,还需要面临复杂的部署和安装过程,这让很多人望而却步。不过,随着…

Kap - macOS 开源录屏工具

文章目录 关于 Kap 关于 Kap Kap 是一个使用web技术的开源的屏幕录制工具 官网:https://getkap.cogithub : https://github.com/wulkano/Kap 目前只支持 macOS 12 以上,支持 Intel 和 Apple silicon 你可以前往官网,右上方下载 你也可以使…

案例介绍:信息抽取技术在汽车销售与分销策略中的应用与实践

一、引言 在当今竞争激烈的汽车制造业中,成功的销售策略、市场营销和分销网络的构建是确保品牌立足市场的关键。作为一名经验丰富的项目经理,我曾领导一个专注于汽车销售和分销的项目,该项目深入挖掘市场数据,运用先进的信息抽取…

EasyExcel3.1.1版本上传文件忽略列头大小写

1、背景 项目中使用easyExcel3.1.1版本实现上传下载功能,相关数据DTO以 ExcelProperty(value "dealer_gssn_id") 形式规定其每一列的名称,这样的话easyExcel会完全匹配对应的列名,即用户上传文件时,列名写成Dealer_…

利用websocket +定时器简易的实现一个网络聊天室

其实原理非常简单,就是客户端用户通过websoket来连接websocket服务端。然后服务端,收集每个用户发出的消息, 进而将每条用户的消息通过广播的形式推送到每个连接到服务端的客户端。从而实现用户的实时聊天。 // TODO : 我主要是讲一下实现思路。并未完善其功能。 1.后端 依赖 …

使用数据库实现增删改查

#include<myhead.h>//定义添加数据函数int do_add(sqlite3 *ppDb) {//1.准备sql语句,输入要添加的信息int add_numb; //工号char add_name[20]; //姓名char add_sex[10]; //性别double add_score; //工资printf("请输入要添加的工号:")…

恢复IDEA误删除的git提交,提交被删除,尝试恢复提交

​​​​​​ dgqDESKTOP-JRQ5NMD MINGW64 /f/IdeaProjects/workspace/spzx-parent ((8bb112e...)) $ git reflog 8bb112e (HEAD, origin/master, master) HEAD{0}: checkout: moving from master to 8bb112e5ac18dfe4bbd64adfd06363e46b609f21 8bb112e (HEAD, origin/master, …

微信小程序开发系列(二十一)·wxml语法·setData()修改数组类型数据(增加、修改、删除)

目录 1. 新增数组元素 方法一&#xff1a;push&#xff08;&#xff09; 方法二&#xff1a;concat() 方法三&#xff1a;ES6中的扩展运算符 ... 2. 修改数组元素 样式一&#xff1a;数字 样式二&#xff1a;元素 3. 删除数组元素 方法一&#xff1a;splice&#x…

vue2源码分析-vue入口文件global-api分析

文章背景 vue项目开发过程中,首先会有一个初始化的流程,以及我们会使用到很多全局的api,如 this.$set this.$delete this.$nextTick,以及初始化方法extend,initUse, initMixin , initExtend, initAssetRegisters 等等那它们是怎么实现,让我们一起来探究下吧 源码目录 global-…

Windows下 OracleXE_21 数据库的下载与安装

Oracle 数据库的下载与安装 数据库安装包下载数据库安装访问数据库进行测试Navicat连接数据库 1. 数据库安装包的下载 1.1 下载地址 Oracle Database Express Edition | Oracle 中国 1.2 点击“下载 Oracle Database XE”按钮&#xff0c;进去到下载页面&#xff08;选择对…

Stable diffusion零基础课程

该课程专为零基础学习者设计&#xff0c;旨在介绍和解释稳定扩散的基本概念。学员将通过简单易懂的方式了解扩散现象、数学模型及其应用&#xff0c;为日后更深入的科学研究和工程应用打下坚实基础。 课程大小&#xff1a;3.8G 课程下载&#xff1a;https://download.csdn.ne…

灵魂指针,教给(一)

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 C语言知识 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 一、内存和地址 1.1 内存 在介绍知识之前&#xff0c;先来想一个生活中的小栗子&#xff1a; 假如把你放在一个有100间屋子的酒店…

第三讲 汇编初步 课程随手记

一、寄存器 32位CPU通用寄存器如下图所示&#xff1a; 因为教材依照的是32位CPU寄存器&#xff0c;而我安装的是64位寄存器&#xff0c;所以找了一下64位的寄存器的资料 PS&#xff1a;一般来说&#xff0c;Intel处理器字节存储顺序为小端法存储&#xff0c;是指数据的高字节保…

基于Skywalking开发分布式监控(四)一个案例

上一篇我们简单介绍了基于SkyWalking自定义增强的基本架构&#xff0c;即通过把Trace数据导入数据加工模块进行加工&#xff0c;进行持久化&#xff0c;并赋能grafana展示。 现在我们给出一个例子&#xff0c;对于量化交易系统&#xff0c;市场交易订单提交&#xff0c;该订单…

关于springboot一个接口请求后,主动取消后,后端是否还在跑

1、最近在思考一个问题&#xff0c;如果一个springboot的请求的接口比较耗时&#xff0c;中途中断该请求后&#xff0c;则后端服务是否会终止该线程的处理&#xff0c;于是写了一个demo RequestMapping(value "/test", method RequestMethod.GET)public BasicResul…

云消息队列 Confluent 版正式上线!

作者&#xff1a;阿里云消息队列 前言 在 2023 年杭州云栖大会上&#xff0c;Confluent 成为阿里云技术合作伙伴&#xff0c;在此基础上&#xff0c;双方展开了深度合作&#xff0c;并在今天&#xff08;3月1日&#xff09;正式上线“云消息队列 Confluent 版”。 通过将 Co…

android基础学习

从上面的描述就可以知道&#xff0c;每一个Activity组件都有一个对应的ViewRoot对象、View对象以及WindowManager.LayoutParams对象。这三个对象的对应关系是由WindowManagerImpl类来维护的。具体来说&#xff0c;就是由WindowManagerImpl类的成员变量mRoots、mViews和mParams所…