OpenLiteSpeed里的CPU Affinity正确设置提高Cache命中率

OpenLiteSpeed里的CPU Affinity正确设置提高Cache命中率插图

今天虾皮路发现在OpenLiteSpeed里有一个选项:CPU Affinity,而自带的中文翻译为CPU亲缘性。百度了一下,这个也叫做CPU亲和性。正确的设置可以提高Cache命中率。那么,如何设置CPU Affinity呢?这里虾皮路就分享一下如何在OpenLiteSpeed进行CPU Affinity的正确设置。

一、什么是CPU Affinity(CPU亲和性)

简单来说就是利用linux内核提供给用户的API,强行将进程或者线程绑定到某一个指定的cpu核运行。

在 Linux 内核中,所有的进程都有一个相关的数据结构,称为 task_struct 这个结构非常重要,原因有很多;其中与 亲和性(Affinity)相关度最高的是cpus_allowed 位掩码。这个位掩码由n位组成,与系统中的n个逻辑处理器一一对应。 具有 4 个物理 CPU 的系统可以有 4 位。如果这些 CPU 都启用了超线程,那么这个系统就有一个 8 位的位掩码。

如果为给定的进程设置了给定的位,那么这个进程就可以在相关的 CPU 上运行。因此,如果一个进程可以在任何 CPU 上运行,并且能够根据需要在处理器之间进行迁移,那么位掩码就全是 1。实际上,这就是 Linux 中进程的缺省状态。

二、为什么要使用CPU Affinity(CPU亲和性)

通常 Linux 内核都可以很好地对进程进行调度,在应该运行的地方运行进程(这就是说,在可用的处理器上运行并获得很好的整体性能)。内核包含了一些用来检测 CPU 之间任务负载迁移的算法,可以启用进程迁移来降低繁忙的处理器的压力。

一般情况下,在应用程序中只需使用缺省的调度器行为。然而,您可能会希望修改这些缺省行为以实现性能的优化。让我们来看一下使用CPU亲和性(Affinity) 的 3 个原因。

原因 1. 有大量计算要做

基于大量计算的情形通常出现在科学和理论计算中,但是通用领域的计算也可能出现这种情况。一个常见的标志是您发现自己的应用程序要在多处理器的机器上花费大量的计算时间。

原因 2. 提高Cache命中率

在多核运行的机器上,每个CPU都有自己的缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此一来CPU Cache命中率就低了。当绑定CPU后,程序就会一直在指定的cpu跑,不会由OS调度到其他CPU上,提高CPU Cache命中率。

原因 3. 正在运行时间敏感的、决定性的进程

我们对 CPU 亲和性(Affinity)感兴趣的最后一个原因是实时(对时间敏感的)进程。例如,您可能会希望使用硬亲和性(Affinity)来指定一个 8 路主机上的某个处理器,而同时允许其他 7 个处理器处理所有普通的系统调度。这种做法确保长时间运行、对时间敏感的应用程序可以得到运行,同时可以允许其他应用程序独占其余的计算资源。

以上说的比较专业,其实大白话就是没开启CPU 亲和性或者默认设置的话,大部分的工作全部都由单独一个CPU内核去处理,就像本来是个多人团队,结果工作全部给1个人做了,剩下几个人都在看着不帮忙。而开启或者设置好后,这些工作分给不同的人来做,共同完成。

三、如何在在OpenLiteSpeed里进行CPU Affinity设置

登陆OpenLiteSpeed面板,点击【服务器】=>【常规】,点击右上角的编辑

OpenLiteSpeed里的CPU Affinity正确设置提高Cache命中率插图1

官方默认是未进行设置,默认值是0,注释如下:

CPU关联将进程绑定到一个或多个CPU(核心)。 始终使用同一CPU对进程来说是有益的,因为这样进程可以利用CPU缓存中剩余的数据。 如果进程移至其他CPU,则不会使用CPU缓存,并且会产生不必要的开销。
CPU Affinity设置控制一个服务器进程将与多少个CPU(核心)相关联。 最小值为0,它将禁用此功能。 最大值是服务器具有的核心数。 通常,1是最佳设置,因为它会最严格地使用CPU亲和力,从而最大程度地利用CPU缓存。
Default value: 0
语法: Integer value from 0 to 64. (0 will disable this feature)

那我们该设置为0还是1还是多少呢?

其实这里是跟自己的服务器CPU核心数有关,比如自己的主机是双核CPU,那么就设置为1,如果是单核CPU,这里就无需设置或者设置为0。那如果自己的主机是4核或者8核甚至更高呢?

官方解释是:如果超过2核或以上,无论你多少核,都设置为1。

My server has 16 cores still you suggest set it to 1 ?

It doesn’t matter how many cores you have, when setting it to 1, you’re telling the process (or processes), to pin themselves to a specific core, if you have a license with two workers then they’ll pin themselves to two individual cores.
The benefit in pinning the processes to specific cores is that you’re keeping data local at a given core, so you’ll be able to use the CPU cache more efficiently. As well as lowering your interrupts slightly, which matters a lot in a high traffic environment.

OpenLiteSpeed里的CPU Affinity正确设置提高Cache命中率插图2

然后保存,再重启LiteSpeed即可。

四、如何验证是否生效

设置好后,怎么验证是否生效呢?如何确定不同的进程自动分配给不同的内核?

很简单,只要登录SSH,输入如下命令:

ps -eF | grep litespeed

得到如下类似的反馈

$ ps -eF | grep litespeed
root     16116     1  0 39337 109780  0 11:54 ?        00:00:22 litespeed (lshttpd - main)
nobody   16162 16116  4 376097 700492 0 11:54 ?        00:13:46 litespeed (lshttpd - #01)

在这种情况下,将lshttpd-main分配给核心0,并将#01分配给核心4。

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

虾皮路版权所有,未经允许不得转载:虾皮路 » OpenLiteSpeed里的CPU Affinity正确设置提高Cache命中率

分享到: 更多 (0)

评论 抢沙发

  • QQ号
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
切换注册

登录

加载中...

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册

我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活