当前位置: 首页 > 面试题库 >

多核CPU上的Redis性能

梁马鲁
2023-03-14
问题内容

我正在寻找Redis,以便为我提供一个中间高速缓存存储,其中包含有关交集和并集之类的集合操作的大量计算信息。

我查看了redis网站,发现redis不是为多核CPU设计的。我的问题是,为什么会这样呢?

另外,如果是,我们如何在多核CPU上使用Redis来100%利用CPU资源。


问题答案:

我查看了redis网站,发现redis不是为多核CPU设计的。 我的问题是,为什么会这样?

这是设计决定。

Redis是带有epoll / kqueue的单线程,并且在I / O并发方面可以无限​​扩展。 -@ antirez(Redis的创建者)

选择事件驱动方法的原因是线程之间的 同步 是以软件(代码复杂性)和硬件级别(上下文切换)为代价的。除此之外,Redis的瓶颈通常是 网络
,而不是CPU。另一方面,单线程体系结构有其自身的优势(例如,原子性的保证)。

因此,对于像Redis这样的 高效可扩展的
系统,事件循环似乎是一个不错的设计。

另外,如果是,我们如何在多核CPU上使用Redis来100%利用CPU资源。

Redis 跨多个核心扩展的方法是
分片
,主要是与Twemproxy一起使用。

但是,如果由于某种原因仍要使用多线程方法,请看一下Thredis,但要确保了解其作者所做的工作(例如,不能将其用作复制主文件)。



 类似资料:
  • 问题内容: 我正在从一个线程发送网络数据包,并收到在不同CPU内核上运行的第二个线程的答复。我的过程测量每个数据包的发送和接收之间的时间(类似于ping)。我正在使用rdtsc来获取高分辨率,低开销的时序,这是我的实现所需的。 所有测量看起来都是可靠的。尽管如此,我仍担心rdtsc在内核之间的准确性,因为我一直在阅读一些文字,这些文章暗示tsc在内核之间不同步。 我在维基百科中找到了有关TSC的以

  • (在单CPU的情况下)为了理解volatile——我知道volatile强制线程使用主内存,并且不会将副本保留在其本地内存中。 在一篇StackOverFlow帖子中,我看到java线程使用CPU缓存,而使用volatile则会强制使用主内存 线程缓存和Java内存模型。 如果是这种情况,那么应该没有内存可见性的问题,因为一个线程可以看到其他线程写的值(假设在单个核心CPU上,我们将有单个缓存)。

  • 问题内容: 假设我的应用程序运行2个线程(例如渲染线程和游戏更新线程)。如果它运行在具有多核CPU的移动设备上(当今通常是这样),我是否可以期望在可能的情况下自动将线程分配给不同的内核? 我知道底层的OS内核(Android linux内核)决定调度。我的问题是我是否需要做 任何其他事情 才能启用多核功能,还是自动而透明的? 问题答案: 您需要做的是允许两个线程尽可能独立地运行。如果您有两个始终在

  • 有文档表明,独立的redis实例映射到独立的CPU内核。如果我有8个redis实例运行在一台Debian/Ubuntu机器上,有8个内核,那么所有的redis实例都会映射到一个内核。 1)如果我把这台机器缩小到4个内核,会发生什么? 2)更改是自动发生的(默认情况下),还是涉及到一些显式配置?

  • 我有一个连接到第三方服务并将结果返回给客户端的应用程序。在内部,应用程序向第三方服务发出GET请求并获取结果。我已经使用Reactor和reactive代码在重负载下扩展应用程序。这是一个SpringBoot项目,它运行嵌入式Tomcat并依赖于Web客户端(被动netty向第三方发出请求)。不知何故,CPU利用率和响应时间都比阻塞模式差。硬件设置在Kubernetes中运行单核。 该项目建立在库