Redis实例映射到单独的CPU内核背后的机制

时间:2019-02-02 11:20:34

标签: redis

已记录,单独的Redis实例映射到单独的CPU内核。如果我在具有8个内核的Debian / Ubuntu机器上运行8个Redis实例,则它们都将分别映射到一个内核。

1)如果我将这台机器缩小到4核会怎样?

2)是自动进行更改(默认情况下)还是涉及某些显式配置?

第3)是否有任何的方式来控制的行为?如果是这样,到什么程度?

希望了解其背后的技术,非常欢迎有说明性的示例。我运行了一个托管在云中的应用程序,该应用程序使用redis作为后端。扩大(或缩小)机器的CPU内核是我必须做的事情之一,但是我想知道我首先要了解的内容。

谢谢!

2 个答案:

答案 0 :(得分:2)

没有魔术。由于redis是单线程的,因此redis的单个实例将仅一次占用一个核心。运行多个实例可能会导致一个以上的实例在不同的内核(如果有)上一次执行。如何完成此操作完全取决于操作系统。 Redis本身不会做任何事情来“将”实例“映射”到特定的内核。

实际上,在8个内核上运行8个实例可能可能会为您提供类似于实例到内核的直接映射的功能,因为智能操作系统会将进程分布在各个内核上(以最大程度地利用可用资源资源),并且应该显示一些偏爱在最近腾出的同一内核上运行进程(以充分利用缓存)。但充其量,这仅适用于1:1映射的简单情况,系统上没有其他进程,所有进程均等负载,不受网络驱动程序等的影响。

在一般情况下,您只能说操作系统将决定如何为运行的所有实例分配CPU时间,并且可能会做得很好,因为操作系统的调度部分是由知道自己在做什么的人撰写。

答案 1 :(得分:2)

Redis是一个(主要是)单线程进程,这意味着服务器实例将使用单个CPU内核。

服务器进程由操作系统映射到核心-这是OS负责的主要任务之一。重申一下,分配资源(包括CPU)是操作系统的决定,也是一项非常复杂的决定(即尝试读取内核调度程序的代码;)。

  

如果我在具有8个内核的Debian / Ubuntu机器上运行8个Redis实例,则它们都将各自映射到一个内核。

也许这取决于操作系统。不能保证每个实例都会有一个唯一的内核,并且一个实例可能会被多个实例使用。

  

1)如果将这台机器缩小到4核会发生什么?

按比例缩小表示重新启动。重新启动Redis服务器后,操作系统将为它们分配可用的内核。

  

2)更改是否自动发生(默认情况下),还是涉及一些显式配置?

不涉及任何更改-Redis与否的每个过程都有一个核心。内核在进程之间共享,操作系统负责协调整个过程。

  

3)有什么方法可以控制行为?如果是这样,到什么程度?

是的,大多数操作系统都提供用于控制资源分配的接口。具体来说,taskset Linux命令可用于设置或获取进程的CPU亲和力。

注意:您应该将CPU关联性设置留给操作系统-这应该是相当不错的。相反,请确保为负载正确配置服务器。