你知道CPU结构也会影响Redis性能吗?
wptr33 2024-12-25 16:02 13 浏览
今天来分析下CPU结构对Redis性能会有影响吗?
在进行Redis性能分析的时候,通常我们会考虑下面这些方面,如:
1. 缩短 key 的长度
2. 禁止使用 keys *
我们都知道 keys *, 在使用的时候 Redis 会处于阻塞状态,导致其它任何命令在你的 Redis 实例中都无法执行。这个情况在 Redis 数据量大的时候就很明显,严重影响系统的运行。(一般我们用 scan 来代替)
3. 进行数据压缩
在把数据存入 Redis 中,我们一般不会使用完整全名的数据,一般会进行适当的数据压缩,这样可以提高 Redis 性能,方便我们数据的储存。
4. 设置过期时间
我们对一些不是永久性需要的数据,可以进行键的过期时间设置,这样到时间后,数据就会自动清除,节省我们 Redis 存储空间(内存)。
5. 使用回收策略
为数据设置相关的过期回收策略,节省内存的开销,提高 Redis 运行的性能。( Redis 目前有8种回收策略,有兴趣可以查看 redis.conf ,多了LFU)。
6. 适当使用 bit (位图)
适当使用 bit,可节省我们 Redis 存储的成本,即内存的大小。
7. 对所存储的数据字段进行优化
如:我们只需要在 Redis 存储关键信息即可,详细信息存储到磁盘上即可。
8. 使用管道进行数据操作
对于命令执行操作,我们要使用管道 pipeline,这样可以节省 Redis 传输过程的成本,提高 Redis 的性能。我们知道如果不适用管道,命令是一个一个进行操作,如果我们加上管道,这样由原来的单条命令变成多条命令进行传输操作,节省多次传输过程的网络开销。
N .... (还有很多很多~~)
但是,我们可能有时候会真正忽略 Redis 运行的前提条件,单核 CPU 和多核 CPU 对 Redis 性能影响也是相差甚远。在计算机组成原理中,我们都知道 CPU 是计算机的核心构成之一,中央处理器(Central Processing Unit),是计算机系统的运算和控制中心。一个CPU处理器中一般包含有多个运行核心(物理核),运行核心我们也叫作物理核,一般包含一级缓存(L1 Cache)和二级缓存(L2 Cache)。其架构图如下所示:
对于 L1 缓存和 L2 缓存,在每个物理核上都是独自拥有的,访问速度非常快,基本都在 ns 级别。我们设想如果把数据运行的指令放在这两个缓存上,那么可以大大提高计算机的访问性能。这样我们可以设想这样一个情形:
如果,我们把 Redis 实例的数据和指令绑定到一个 CPU 核上,那么当 Redis 频繁执行数据访问和操作时,都是基于CPU 上的缓存进行操作,那么性能是不是大大的提高了,没错,事实就是如此。但是,我们电脑一般都是多核 CPU 的,在进行数据访问和操作时,系统不会只有一个线程在进行操作,是有很多很多的线程在同时进行操作,会同时操作我们的CPU,也就是我们所说的多线程操作CPU。如果一个线程此时在CPU1上运行,后来又跑到了CPU2上运行,这时在CPU1上保留的数据和指令不在CPU2,这时要重新进行数据加载,会降低线程执行的效率,上述所发生的过程,我们也叫作上下文切换,这在操作系统内核环境下,是很常见的现象。
所以,我们要避免线程来回在CPU上进行切换,导致指令和数据进行多次加载,增加锁处理的时间。我们从CPU结构出发,如果在多核CPU上,如果我们的每个Redis实例都只在一个CPU上运行的话,那么我们离解决问题的步伐是不是又更近了一步。(问题都是一步一步的剖析,慢慢解开其真容(*?▽?*))。
对相关进程进行绑定,我们可以使用 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 实例绑定在其中一个逻辑核上,而是绑定在它们的物理核上呢?把 Redis实例绑定在一个物理核上,可以让该实例的主进程、子进程、后台线程都共享这个物理核内的两个逻辑核,这样可以使这些线程和进程不必只争抢一个逻辑核,一定程度上避免的CPU竞争。(因为内部有两个供他们选择使用,不会只因为使用一个而来回切换)。
以上这些操作,都是小小的起步,如果我们还需要进一步提升Redis性能,我们需要从源码程度去解读Redis,深入研究,在必要时刻我们可以修改Redis的源码,从根源上寻找适合当前问题最佳扳手。
作者:_BKing
来源:https://www.cnblogs.com/xiaowei123/p/13789806.html
相关推荐
- 【推荐】一款开源免费、美观实用的后台管理系统模版
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍...
- Android架构组件-App架构指南,你还不收藏嘛
-
本指南适用于那些已经拥有开发Android应用基础知识的开发人员,现在想了解能够开发出更加健壮、优质的应用程序架构。首先需要说明的是:AndroidArchitectureComponents翻...
- 高德地图经纬度坐标批量拾取(高德地图批量查询经纬度)
-
使用方法在桌面上新建一个index.txt文件,把下面的代码复制进去保存,再把文件名改成index.html保存,双击运行打开即可...
- flutter系列之:UI layout简介(flutter ui设计)
-
简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。...
- Android开发基础入门(一):UI与基础控件
-
Android基础入门前言:...
- iOS的布局体系-流式布局MyFlowLayout
-
iOS布局体系的概览在我的CSDN博客中的几篇文章分别介绍MyLayout布局体系中的视图从一个方向依次排列的线性布局(MyLinearLayout)、视图层叠且停靠于父布局视图某个位置的框架布局(M...
- TDesign企业级开源设计系统越发成熟稳定,支持 Vue3 / 小程序
-
TDesing发展越来越好了,出了好几套组件库,很成熟稳定了,新项目完全可以考虑使用。...
- WinForm实现窗体自适应缩放(winform窗口缩放)
-
众所周知,...
- winform项目——仿QQ即时通讯程序03:搭建登录界面
-
上两篇文章已经对CIM仿QQ即时通讯项目进行了需求分析和数据库设计。winform项目——仿QQ即时通讯程序01:原理及项目分析...
- App自动化测试|原生app元素定位方法
-
元素定位方法介绍及应用Appium方法定位原生app元素...
- 61.C# TableLayoutPanel控件(c# tabcontrol)
-
摘要TableLayoutPanel在网格中排列内容,提供类似于HTML元素的功能。TableLayoutPanel控件允许你将控件放在网格布局中,而无需精确指定每个控件的位置。其单元格...
- 12个python数据处理常用内置函数(python 的内置函数)
-
在python数据分析中,经常需要对字符串进行各种处理,例如拼接字符串、检索字符串等。下面我将对python中常用的内置字符串操作函数进行介绍。1.计算字符串的长度-len()函数str1='我爱py...
- 如何用Python程序将几十个PDF文件合并成一个PDF?其实只要这四步
-
假定你有一个很无聊的任务,需要将几十个PDF文件合并成一个PDF文件。每一个文件都有一个封面作为第一页,但你不希望合并后的文件中重复出现这些封面。即使有许多免费的程序可以合并PDF,很多也只是简单的将...
- Python入门知识点总结,Python三大数据类型、数据结构、控制流
-
Python基础的重要性不言而喻,是每一个入门Python学习者所必备的知识点,作为Python入门,这部分知识点显得很庞杂,内容分支很多,大部分同学在刚刚学习时一头雾水。...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
面试官:git pull是哪两个指令的组合?
-
git pull命令使用实例 git pull--rebase
-
git 执行pull错误如何撤销 git pull fail
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mysql max (33)
- vba instr (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)