我有一个系统在远程设施上运行金融交易应用程序。 我无法访问ILO / DRAC,但需要禁用超线程。 该系统运行Intel Westmere 3.33GHz X5680六核CPU。 我可以重新启动,但要确保系统不会由于性能问题而启用超线程。 有没有一种干净的方式,在Linux内做到这一点?
编辑:添加到内核启动命令行的noht
指令不起作用。 RHEL也一样。
请参阅: https : //bugzilla.redhat.com/show_bug.cgi?id = 440321#c9
如果你愿意,你可以在运行时执行此操作。 我在这里find了一个很好的解决scheme: http : //www.absolutelytech.com/2011/08/01/how-to-disable-cpu-cores-in-linux/
第1步:确定您要closures的Linux CPU:
cat /proc/cpuinfo
查找具有相同“核心ID”的CPU,您要closures每对中的一个。
第2步:closures超线程CPU(在我的情况下是Linux看到的总共8个“CPU”中的最后四个CPU)
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
您可以设置一个脚本,在系统启动后运行。
要禁用超线程,我在机器/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 / devices / system / cpu / cpu3包含逻辑cpu 3的内核信息和控制。
cat / sys / devices / system / cpu / cpu3 / topology / core_id将显示这个逻辑CPU所属的核心编号。
echo“0”> / sys / devices / system / cpu / cpu3 / online允许禁用逻辑cpu 3。
我不知道为什么……但是系统变得更加灵敏,超线程closures(在我的i5笔记本电脑和60+核心的大型至强服务器上)。 我想这与每个cpucaching,每个cpu内存分配,cpu调度程序分配和进程优先级复杂的迭代有关。 我认为超线程的好处在于让CPU调度器知道如何使用它的复杂性。
对于我来说,超线程的问题是:如果我启动的CPU密集型线程数多于我拥有的逻辑内核数量,那么对于CPU密集型任务,我将拥有快速的上下文切换,但是对于后端任务来说, cpu密集型任务。 另一方面,如果我启动的CPU密集型线程数与物理内核数量相同,那么我将没有上下文切换到后台任务的上下文切换。 看起来不错,但后台任务将会find免费的逻辑处理器,并且几乎可以正常运行。 这就像他们是实时表演(好-20)。
在第一种情况下,超线程是uselles,后台任务将使用昂贵的上下文切换,因为我用正常处理超出了超线程。 第二个是不可能的,因为我的cpu能力的50%被优先考虑到后台任务。
我所说的“cpu密集型”任务是人工智能数据挖掘和授权服务器(我的工作)。 在廉价的电脑和集群(搅拌我的未来的房子)搅拌机渲染。
而且,这是猜测。
我有一个更好的印象,但它可能不会。
对于真正旧的内核(Linux 2.6.9左右),在启动时将noht参数附加到内核。
至less从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。
您可以使用每个核心的“thread_siblings_list”来closuresHT对中的第二个核心。
下面的命令pipe道是hacky,没有进行优化,而且希望这样做可以更容易理解。
cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | \ awk -F, '{print $2}' | \ sort -n | \ uniq | \ ( while read X ; do echo $X ; echo 0 > /sys/devices/system/cpu/cpu$X/online ; done )
所以,取所有的线程兄弟列表,为每一对提取第二个CPU,得到一个唯一的列表,然后closures它们。
这是否有意义?
如果我在执行上面的命令之后执行“cat / proc / cpuinfo”,则核心数量减半。
卢卡斯的答案是好的,但是对于禁用HT并不起作用,因为核心ID不能用于识别HT兄弟姐妹。 这个脚本代替了:
#!/bin/bash for CPU in /sys/devices/system/cpu/cpu[0-9]*; do CPUID=`basename $CPU | cut -b4-` echo -en "CPU: $CPUID\t" [ -e $CPU/online ] && echo "1" > $CPU/online THREAD1=`cat $CPU/topology/thread_siblings_list | cut -f1 -d,` if [ $CPUID = $THREAD1 ]; then echo "-> enable" [ -e $CPU/online ] && echo "1" > $CPU/online else echo "-> disable" echo "0" > $CPU/online fi done
我必须等到我能进入国际劳工组织/ Drac。 内核启动参数在当前的Linux发行版上不起作用。
在libsmbios-bin包(Debian,Ubuntu等)中,你有二进制文件isCmosTokenActive和activateCmosToken。 与令牌列表一起,您可以尝试如下所示:
# isCmosTokenActive 0x00d1 # CPU_Hyperthreading_Enable [...] Type 0x00d1 Location 0x46 AND(fe) OR(0) BITFIELD: 1 # isCmosTokenActive 0x00d2 # CPU_Hyperthreading_Disable [....] Type 0x00d2 Location 0x46 AND(fe) OR(1) BITFIELD: 0
然后激活CPU_Hyperthreading_Disable标记:
# activateCmosToken 0x00d2 # CPU_Hyperthreading_Disable [...] Type 0x00d2 Location 0x46 AND(fe) OR(1) BITFIELD: 1
校验:
# isCmosTokenActive 0x00d1 # CPU_Hyperthreading_Enable [...] Type 0x00d1 Location 0x46 AND(fe) OR(0) BITFIELD: 0 # isCmosTokenActive 0x00d2 # CPU_Hyperthreading_Disable [...] Type 0x00d2 Location 0x46 AND(fe) OR(1) BITFIELD: 1
现在,最大的问题是您是否需要重新启动才能生效,或者是否需要完整的电源循环。 试试吧,看看它是怎么回事!