从 Linux 内部禁用超线程(无法访问 BIOS)

从 Linux 内部禁用超线程(无法访问 BIOS)

我有一个在远程设施上运行金融交易应用程序的系统。我无法访问 ILO/DRAC,但需要禁用超线程。该系统运行 Intel Westmere 3.33GHz X5680 六核 CPU。我可以重新启动,但想确保系统不会因为性能问题而启用超线程。有没有一种干净的方法可以在 Linux 中执行此操作?

编辑:noht添加到内核启动命令行的指令不起作用。RHEL 也是如此。

看: https://bugzilla.redhat.com/show_bug.cgi?id=440321#c9

答案1

较新的内核提供了同步多线程 (SMT) 控制。

您可以使用以下命令检查 SMT 的状态;

cat /sys/devices/system/cpu/smt/active

使用以下方式改变状态

echo off | sudo tee /sys/devices/system/cpu/smt/control

选项有;

  • 离开
  • 强制关闭

我们已经使用 Linux Kernel 4.4.0 进行了测试

答案2

如果需要,您可以在运行时执行此操作。我找到了一个很好的解决方案,如下所述:http://www.absolutelytech.com/2011/08/01/how-to-disable-cpu-cores-in-linux/

步骤1:确定要关闭的 Linux CPU:

cat /proc/cpuinfo

查找具有相同“核心 ID”的 CPU,您需要关闭每对中的一个。

第2步:关闭超线程 CPU(在我的例子中是 Linux 看到的总共 8 个“CPU”中的最后 4 个)

echo 0 > /sys/devices/system/cpu/cpu4/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu7/online

您可以为自己设置一个在系统启动后立即运行的脚本。

答案3

在机器启动时禁用超线程的脚本...

为了禁用超线程,我在机器 /etc/rc.local 上包含了一个脚本。它不是特别干净,但易于安装,独立于 CPU 架构,并且应该可以在任何现代 Linux 发行版上运行。

nano /etc/rc.local

    # place this near the end before the "exit 0"

    for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
        CPUID=$(basename $CPU)
        echo "CPU: $CPUID";
        if test -e $CPU/online; then
                echo "1" > $CPU/online; 
        fi;
        COREID="$(cat $CPU/topology/core_id)";
        eval "COREENABLE=\"\${core${COREID}enable}\"";
        if ${COREENABLE:-true}; then        
                echo "${CPU} core=${CORE} -> enable"
                eval "core${COREID}enable='false'";
        else
                echo "$CPU core=${CORE} -> disable"; 
                echo "0" > "$CPU/online"; 
        fi; 
    done;    

这是如何运作的?

在现代 Linux 发行版中,Linux 内核信息和控件可以作为 /sys 目录中的文件进行访问。例如:

/sys/设备/系统/cpu/cpu3 包含逻辑 CPU 3 的内核信息和控制。

cat /sys/设备/系统/cpu/cpu3/拓扑/core_id 将显示该逻辑 CPU 所属的核心编号。

回显“0”> /sys/devices/system/cpu/cpu3/online 允许禁用逻辑 CPU 3。

它为何有效?

我不知道具体原因……但是关闭超线程后系统响应速度更快(在我的 i5 笔记本和拥有 60 多个内核的大型 Xeon 服务器上)。我猜这与每个 CPU 的缓存、每个 CPU 的内存分配、CPU 调度程序分配和进程优先级复杂迭代有关。我认为超线程的好处被制作知道如何使用它的 CPU 调度程序的复杂性所抵消。

对我来说,超线程的问题是:如果我启动与逻辑核心数量一样多的 CPU 密集型线程,那么对于 CPU 密集型任务,我将拥有快速的上下文切换,但对于后台任务,我将拥有昂贵的上下文切换,因为超线程完全被 CPU 密集型任务所消耗。另一方面,如果我启动与物理核心数量一样多的 CPU 密集型线程,那么我将没有上下文切换到这些任务,而对于后台任务,我将拥有快速的上下文切换。这似乎不错,但后台任务将找到空闲的逻辑处理器,并且几乎立即运行。它们就像是实时性能(不错的 -20)。

在第一种情况下,超线程是无用的,后台任务将使用昂贵的上下文切换,因为我在正常处理中将超线程用到了极致。第二种情况是不可接受的,因为我高达 50% 的 CPU 能力被优先用于后台任务。

我所说的“CPU 密集型”任务是人工智能数据挖掘和授权服务器(我的工作)。Blender 在廉价计算机和集群中进行渲染(用于勾勒我未来的房子)。

此外,这只是猜测。

我的印象是这更好,但事实可能并非如此。

答案4

对于非常老的内核(Linux 2.6.9 左右),附加诺特启动时内核的参数。

此内核命令行选项自 Linux 2.6.18 起已被删除


http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html

The `noht' Argument

This will disable hyper-threading on intel processors that have this feature. 

如果使用 lilo,请编辑 /etc/lilo.conf (然后运行 ​​lilo),或者如果使用 grub,请编辑 /boot/grub/menu.lst。

相关内容