上头条导读:关于redis单线程的剖析

admin 6个月前 (04-16) 科技 40 0

redis为什么那么快?结论有三点,人人都知道,这里主要是剖析。

首先第一点

redis是内存接见的,以是快

固然这个人人都知道,以是不是重点

 

io密集型和cpu密集型

一样平常我们把义务分为io密集型cpu密集型

 

io密集型

  • IO密集型指的是系统的CPU性能相对硬盘、内存要好许多,此时,系统运作,大部分的状态是CPU在等I/O (硬盘/内存) 的读/写操作,此时CPU Loading并不高。
  • 对于io密集型的义务,它的主要时间都在磁盘io上,而io自己在发出中止见告cpu后,cpu只需要短暂的处置一下,之后就由DMA(详见附录)卖力数据传输,整个历程对cpu的行使率很低。因此我们需要开更多的线程去充执行使cpu。即一样平常线程数 = cpu核心数 * 2,如数据库连接池

 

cpu密集型

  • CPU密集型也叫盘算密集型,指的是系统的硬盘、内存性能相对CPU要好许多,此时,系统运作大部分的状态是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU另有许多运算要处置,CPU Loading很高。
  • 对于cpu密集型的义务,它对cpu的行使率很高,以是不需要开更多的线程去提高cpu行使率。若是增添线程,只会引起线程的频仍切换导致原本就不够用的cpu加倍不够用。以是一样平常是线程数 = cpu核心数 + 1

 

 

redis的瓶颈在那里

redis基本都在举行内存io,那它的瓶颈在io上吗?

redis在网络io上使用epoll实现了一个io多路复用的reactor模子,epoll是非壅闭io,以是避免了cpu壅闭在io上,以是它不是io密集型,瓶颈不在于守候io导致cpu行使率不高,不需要多个线程来屏障守候io执行完成的时间。固然redis的io行使率很高,然则io行使率高并不代表它是io密集型,由于它瓶颈不在守候io上。

 

以是第二点

redis在网络io上使用epoll实现了一个io多路复用的reactor模子使得cpu行使率更高,虚耗在io上的时间更少

redis并不需要多线程来提高cpu行使率削减io守候时间,而且单线程架构也对照容易实现,以是顺理成章就接纳了单线程架构。

关于epoll可以看我的这篇文章:https://www.cnblogs.com/fatmanhappycode/p/12362423.html

第三点

由于接纳了单线程架构,避免了线程线程切换发生的消耗

由于一次CPU上下文的切换大概在 1500ns 左右。

从内存中读取 1MB 的延续数据,耗时大约为 250us,假设1MB的数据由多个线程读取了1000次,那么就有1000次时间上下文的切换,

那么就有1500ns * 1000 = 1500us ,我单线程的读完1MB数据才250us ,你光时间上下文的切换就用了1500us了,我还不算你每次读一点数据 的时间

 

那么redis是cpu密集型吗?谜底是否认的。

redis也不是cpu密集型。大多数情况下redis机械上的cpu是很够用的。

 

redis的瓶颈在于内存大小和网络带宽。

 

若是想要更充实的行使多核cpu,可以接纳多个redis实例的方式,同时为了削减线程争用,可以将实例和cpu绑定的方式。

然则若是做了CPU绑定,在rdb和aof时子历程会与父历程共享使用一个CPU。子历程重写时对单核CPU使用率通常在90%以上,父历程与子历程将发生猛烈CPU竞争,极大影响Redis稳定性。(解决方式不清楚,也许多绑定一个CPU会好点?)

 

 

附录

DMA

DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作自己是由 DMA 控制器来执行和完成。

典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。例如内存移到磁盘。

 

最后老例附一图:

 

参考资料:

https://www.php.cn/redis/422123.html

https://blog.csdn.net/youanyyou/article/details/78990156

 

,

Sunbet

www.aLizhiye.com自1992年和阿里纸业合作以来,在资金实力、技术体系、贴心服务实现了质的飞跃。阿里纸业作为Sunbet亚洲独家代理,为官网下所有会员开户、代理提供买分卖分等业务。

Allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:上头条导读:关于redis单线程的剖析

网友评论

  • (*)

最新评论

文章归档

站点信息

  • 文章总数:439
  • 页面总数:0
  • 分类总数:8
  • 标签总数:870
  • 评论总数:126
  • 浏览总数:3177