超线程更有效地使用处理器资源,使多个线程能够在每个核心上运行。作为一种性能特性,它还可以提高处理器吞吐量,从而提高线程化软件的总体性能。带有超线程的单个物理CPU内核在操作系统中显示为两个逻辑CPU。
建议禁用HT的方法是在BIOS中禁用,如果可能的话,也可以通过操作系统使用以下步骤来实现。
在运行时为单个逻辑 CPU 禁用 HT
在开始之前让我们检查一下 lscpu stat
# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 32 On-line CPU(s) list: 0-31 Thread(s) per core: 2 Core(s) per socket: 8 Socket(s): 2
此处显示每个内核有 2 个线程,因此我们知道最有可能启用了超线程
以下文件将显示所有逻辑 CPU 及其 HT 对关系
# grep -H . /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
要确定应该禁用哪些 CPU,必须识别在同一 CPU 内核上运行的线程。
文件 /sys/devices/system/cpu/cpuN/topology/thread_siblings_list 其中 N 是 CPU 插槽编号。
该文件将包含每个物理插槽的逻辑 (HT) CPU 编号。
# grep -H . /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | sort -n -t ',' -k 2 -u /sys/devices/system/cpu/cpu0/topology/thread_siblings_list:0,16 /sys/devices/system/cpu/cpu17/topology/thread_siblings_list:1,17 /sys/devices/system/cpu/cpu18/topology/thread_siblings_list:2,18 /sys/devices/system/cpu/cpu19/topology/thread_siblings_list:3,19 /sys/devices/system/cpu/cpu20/topology/thread_siblings_list:4,20 /sys/devices/system/cpu/cpu21/topology/thread_siblings_list:5,21 /sys/devices/system/cpu/cpu22/topology/thread_siblings_list:6,22 /sys/devices/system/cpu/cpu23/topology/thread_siblings_list:7,23 /sys/devices/system/cpu/cpu24/topology/thread_siblings_list:8,24 /sys/devices/system/cpu/cpu25/topology/thread_siblings_list:9,25 /sys/devices/system/cpu/cpu10/topology/thread_siblings_list:10,26 /sys/devices/system/cpu/cpu11/topology/thread_siblings_list:11,27 /sys/devices/system/cpu/cpu12/topology/thread_siblings_list:12,28 /sys/devices/system/cpu/cpu13/topology/thread_siblings_list:13,29 /sys/devices/system/cpu/cpu14/topology/thread_siblings_list:14,30 /sys/devices/system/cpu/cpu15/topology/thread_siblings_list:15,31
这意味着 CPU0 和 CPU16 是同一内核上的线程。
1 和 17 相同,以此类推。
对于绑定到物理内核的特定应用程序,可以根据需要关闭单个逻辑 HT CPU。
或者以下脚本将禁用所有这些,从逻辑 CPU 16 到 31
# cat /tmp/disable_ht.sh #!/bin/bash for i in {12..23}; do echo "Disabling logical HT core $i." echo 0 > /sys/devices/system/cpu/cpu${i}/online; done
要禁用单个逻辑 CPU,请使用以下命令并将 <cpu_id> 替换为 (16..31) 中的 id
echo 0 > /sys/devices/system/cpu/<cpu_id>/online
重新启用 HT
# cat /tmp/enable_ht.sh for i in {12..23}; do echo "Enabling logical HT core $i." echo 1 > /sys/devices/system/cpu/cpu${i}/online; done
永久禁用 HT
对于带有 GRUB 的 Linux 变体
例如在 SuSE Enterprise Linux 11 中
# vim /boot/grub/menu.lst # Modified by YaST2. Last modification on Wed Nov 8 00:37:57 CET 2015 default 0 timeout 8 ##YaST - activate ###Don't change this comment - YaST2 identifier: Oroirnal name: linux### title SUSE Linux Enterprise Server 11 SP4 - 3.0.101-71.1.10543.0.PTF root (hd0,4) kernel /vmlinuz root=/dev/md1 console=ttyS0,115200 console=tty0 splash=silent crashkernel= showopts panic=1 numa=off noht initrd /initrd
最后重新启动服务器以激活更改。
对于带有 GRUB2 的 Linux 变体
要永久禁用超线程,请在“/etc/sysconfig/grub”文件中的“GRUB_CMDLINE_LINUX”下添加“noht”,如下所示
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="novga panic=1 numa=off crashkernel=auto noht rhgb quiet console=tty0" GRUB_DISABLE_RECOVERY="true"
接下来使用重新生成 grub2 配置文件
# grub2-mkconfig -o /boot/grub2/grub.cfg Generating grub configuration file ... Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64 Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img Found linux image: /boot/vmlinuz-0-rescue-a311757619b943238cda551a0f1b2743 Found initrd image: /boot/initramfs-0-rescue-a311757619b943238cda551a0f1b2743.img done
最后重新启动服务器以使更改生效。
重要说明:在某些情况下,超线程是通过硬件的 BIOS 控制的,因此我们还必须在 BIOS 中禁用 HT,单独从操作系统禁用将不起作用