我的应用程序需要最大的单线程性能,并且由于切换到 Intel E 内核而受到影响。
我正在寻找一种方法,可以在我的 Ubuntu 20.04 机器上禁用 Intel i9-12900K 上的 E 核,而无需访问 BIOS(它是租用的专用服务器)。或者以任何可能的方式来区分此类核心并分配 CPU 亲和力,以taskset
将它们排除在执行之外。
我自己尝试在谷歌中找到答案。只发现目前确实存在调度程序问题,但没有针对我的问题的明确修复或解决方法。
答案1
taskset
是一项标准功能,用于将核心分配给在您的情况下完美运行的应用程序。例如,在 Intel Core i9 12900K 的情况下,将您的任务固定到前 16 个内核,然后您就可以开始了:
taskset 0xFFFF application
taskset -c 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 application
第二种形式更长但更容易阅读。
据我所知,标准 Linux 内核目前没有任何基础设施来提示内核某些应用程序需要使用某些类型的内核。是的,Linux 内核支持 BIG.little ARM 架构,但我还没有听说过使用此功能的 API。
截至 2022 年 1 月,Linux 内核确实不是支持任何形式的英特尔线程控制器。没有补丁,什么都没有。
最后,值得注意的是 Linux 和 Windows 在报告 HT/SMT 兄弟姐妹的方式上有所不同。
Windows 成对列出它们,即核心 1:线程 1 线程 2、核心 2:线程 1 线程 2 等。Linux 首先列出所有物理核心,然后列出它们的 HT/SMT 同级核心。
所以,如果你想测试物理核心没有对于 16 核 CPU 使用 HT/SMT,您将执行以下操作:
taskset -c 0,1,2,3,4,5,6,7 application
taskset 0xFF application
更多信息请点击这里:我如何知道哪些处理器是物理核心?
选项 N2:您可以将 E 核离线,它们将对您的系统变得不可见:
echo 0 | sudo tee /sys/devices/system/cpu/cpu{NN}/online
对于 Intel Core i9 12900K 来说
for i in {16..23}; do echo 0 | sudo tee /sys/devices/system/cpu/cpu${i}/online; done
答案2
不要完全禁用 e-core,而是使用isolcpus
用于将 e-core 与通用调度程序隔离的启动参数。
例如,对于 Intel Core i9 12900K:
$ sudo vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="isolcpus=16,17,18,19,20,21,22,23"
$ sudo update-grub
taskset
然后,您仍然可以通过使用或手动将 e-core 分配给特定进程来使用它们cset
:
$ sudo taskset -p 0xFF0000 <pid>
或者,也可以使用cset shield
。
答案3
您还可以chcpu -d [cpulist]
随时使核心离线。
看man chcpu