我有一个在远程设施上运行金融交易应用程序的系统。我无法访问 ILO/DRAC,但需要禁用超线程。该系统运行 Intel Westmere 3.33GHz X5680 六核 CPU。我可以重新启动,但想确保系统不会因为性能问题而启用超线程。有没有一种干净的方法可以在 Linux 中执行此操作?
编辑:noht
添加到内核启动命令行的指令不起作用。RHEL 也是如此。
答案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。