我的应用程序需要最大的单线程性能,并且由于切换到 Intel E 内核而受到影响。
我正在寻找一种方法,可以在我的 Ubuntu 20.04 机器上禁用 Intel i9-12900K 上的 E 核,而无需访问 BIOS(它是租用的专用服务器)。或者以任何可能的方式来区分此类核心并分配 CPU 亲和力,taskset
以将它们排除在执行之外。
我自己尝试在谷歌中找到答案。只发现目前确实存在调度程序问题,但没有针对我的问题的明确修复或解决方法。
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
Run Code Online (Sandbox Code Playgroud)
第二种形式更长但更容易阅读。
据我所知,标准 Linux 内核目前没有任何基础设施来提示内核某些应用程序需要使用某些类型的内核。是的,Linux 内核支持 BIG.little ARM 架构,但我还没有听说过使用此功能的 API。
截至 2022 年 1 月,Linux 内核不支持任何形式的英特尔线程控制器。没有补丁,什么都没有。
最后,值得注意的是,Linux 和 Windows 在报告 HT/SMT 兄弟姐妹的方式上有所不同。
Windows 成对列出它们,即核心 1:线程 1 线程 2、核心 2:线程 1 线程 2 等。Linux 首先列出所有物理核心,然后列出它们的 HT/SMT 同级核心。
因此,如果您想在不使用 HT/SMT 的情况下测试16 核 CPU 的物理核心,您可以这样做:
taskset -c 0,1,2,3,4,5,6,7 application
taskset 0xFF application
Run Code Online (Sandbox Code Playgroud)
更多信息请参见:我如何知道哪些处理器是物理核心?
选项 N2:您可以将 E 核离线,它们将对您的系统变得不可见:
echo 0 | sudo tee /sys/devices/system/cpu/cpu{NN}/online
Run Code Online (Sandbox Code Playgroud)
对于 Intel Core i9 12900K 来说
for i in {16..23}; do echo 0 | sudo tee /sys/devices/system/cpu/cpu${i}/online; done
Run Code Online (Sandbox Code Playgroud)