如何设置指定进程的CPU亲和性

如何设置指定进程的CPU亲和性,第1张

实现方法进程与指定cpu绑定:SetProcessAffinityMask(GetCurrentProcess(),dwMask);

线程与指定cpu绑定:

SetThreadAffinityMask(GetCurrentThread(),dwMask);dwMask为CPU序号的或运算值:1(0001)

代表只运行在CPU1,2(0010)代表只运行在CPU2,3(0011)代表可以运行在CPU1和CPU2

,以此类推。

 在服务器压力特别大,心跳经常丢失从而造成服务超时。经过分析发现网络没有问题,心跳网络包都发过来了而且也正常进入了dispatch队列,但是由于dispatch在处理别的request的时候耗时过长,而且要命的是它还hold着一把全局的锁,导致队列里面的其他queue也无法正常被dispatch。所以我们想到可以利用设置CPU亲和性来保证 核心进程/线程 得到足够的时间片,从而不让服务超时。

 说到亲和性,如果我们不隔离CPU,那么就只能减少CPU切换,提高cpu cache的命中率,从而减少内存访问损耗,提高程序的速度。但是这样做只能保证自己不被调度到的别的CPU,却不能阻止其他线程不来我这个CPU。这样就成了“ 我的是公共的,别人的我不能用! ”,岂不是我得到的时间片更少了?所以为了防止这样的窘境,我们还得先“ 隔核 ”再“ 绑核 ”。

我们可以用如下命令来查看自己的服务器有多少个核心:

隔核方法: 修改grub

环境: CentOS7

具体步骤: (隔离4,5核心)

更改一个进程的CPU affinity mask,可以设置一个进程在某个CPU核心上执行,也可以设置该进程在除了某CPU 核心之外的其他CPU核心上执行。如果第一个参数pid为0,则设置当前进程的mask。

 其实这个mask是一个针对线程组内的线程属性,可以被独立调节。所以我们可以用gettid()的参数作为第一个参数,同样如果第一个参数为0,则设置当前线程。如果传的getpid的返回值,则设置该线程组的主线程mask属性。

更改一个线程的CPU affinity mask, 同样也是可以设置一个线程在某个CPU核心上执行,也可以设置该线程在除了某CPU 核心之外的其他CPU核心上执行。这两个接口在底层也是调用sched_setaffinity/sched_getaffinity。当第一个参数为0时,就是设置当前thread的mask。

上面我们介绍了两种设置CPU affinity mask的接口,但是无论是哪一种接口有个共同的特性:创建出来的子线程默认会继承父亲线程的CPU affinity mask。在复杂的系统中有时并不希望这个属性的出现,因为可能会导致某个隔离出来的cpu上还是运行了很多的thread。所以我就想了一个解决方案来解决这个问题。

<1> http://man7.org/linux/man-pages/man3/pthread_setaffinity_np.3.html

<2> https://linux.die.net/man/2/sched_setaffinity

把cpu性能调到最佳方法:

*** 作设备:联想笔记本。

设备系统:win11。

*** 作软件:电脑属性。

第一步,右键此电脑,打开“ 属性 ”。

第二步,打开其中的“ 高级系统设置 ”。

第三步,进入“ 高级 ”,点击性能下的“ 设置 ”。

第四步,勾选开启“ 调整为最佳性能 ”。

第五步,进入“ 高级 ”,勾选“ 程序 ”最后“ 确定 ”保存即可调整为最佳性能。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7735879.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存