在 Ubuntu 中禁用超线程

joh*_*hn 20 performance configuration cpu 16.04

我正在运行 ubuntu 16.04 服务器。当我使用 lscpu 命令时,我可以看到启用了炒作线程。

我想禁用它。我浏览了ubuntu 论坛这里这里

这些都是很好的讨论,为什么超线程可能不好。但没有关于如何关闭它的明确解决方案。

任何人都可以提供禁用超线程的步骤吗?谢谢 。

Win*_*nix 11

介绍

这是个有趣的问题。对我个人来说,这可能是几个月来最有趣的事情之一。像 OP 一样,在我的旧 BIOS(2012 年发明,2016 年左右更新)中没有禁用超线程的选项。

Intel Skylake 和 Kaby Lake 中的超线程错误:

任何使用Intel SkylakeKaby Lake处理器的人都必须阅读几个月前浮出水面的有关超线程的错误报告。这个UK Register 的故事详细说明了 Debian 开发人员如何发现超线程如何使机器崩溃和损坏。

去年在 Ask Ubuntu 中报告了许多 Skylake 问题,人们想知道如何辨别哪些问题可能是由超线程错误引起的。

本回答分为三部分:

  • 关闭/打开超线程时的 CPU 显示
  • 用于自动关闭/打开超线程的 Bash 脚本
  • 如果超线程在启动前关闭,Conky 会崩溃

关闭/打开超线程时的 CPU 显示

您可以在下方看到关闭超线程并执行 CPU 压力测试时的 CPU 利用率。大约 10 秒后,在打开超线程的情况下重复相同的脚本。最后 10 秒后,再次关闭超线程运行脚本:

设置超线程 noht

显示分为两部分:

  • 在终端窗口的左半部分,set-hyper-threading使用参数 0(关闭)和 1(开启)调用脚本。
  • 右半部分conky显示 CPU 1 到 8 的 CPU 利用率百分比。

第一个脚本关闭超线程

第一次运行脚本时,CPU 编号 2、4、6 和 8(根据 Conky)被冻结在 3%、2%、2% 和 2%。运行压力测试时,CPU 编号 1、3、5 和 7 会飙升至 100%。

CPU 拓扑显示为关闭超线程,仅报告四个内核:

/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3
Run Code Online (Sandbox Code Playgroud)

第二个脚本运行超线程

第二次运行脚本时,超线程打开,所有 CPU 编号 1-8 在运行压力测试时都飙升至 100%。

CPU 拓扑在超线程打开的情况下显示,并且仅报告了四个内核和四个虚拟内核:

/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu1/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu3/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu5/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3
/sys/devices/system/cpu/cpu7/topology/core_id:3
Run Code Online (Sandbox Code Playgroud)

第三个脚本关闭超线程

请注意在第二个脚本结束后,CPU 2、4、6 和 8 如何以 4%、2%、3%、4% 空闲。这很重要,因为在第三个测试中关闭超线程会显示 CPU 百分比冻结在 4%、2%、3%、4%,而不是第一个测试中的 3%、2%、2% 和 2%。

因此,关闭超线程似乎只是将虚拟 CPU 冻结在当前状态。

另请注意,无论您是打开还是关闭超线程,脚本仍会显示“支持超线程”。


用于自动关闭/打开超线程的 Bash 脚本

查看下面的脚本时,请记住 Conky 将 CPU 编号为 1 到 8,而 Linux 将 CPU 编号为 0 到 7。

/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3
Run Code Online (Sandbox Code Playgroud)

注意:该程序stress内置于 Ubuntu 衍生的所有 Debian 系统中。因此,您无需下载和安装任何软件包即可在 Ubuntu 中运行此脚本。

如果您有双核 CPU,则需要删除(或用 注释掉#)控制 CPU 编号 5 和 7 的行。

感谢高新天使对于bash线grep "" /sys/devices/system/cpu/cpu*/topology/core_id显示CPU的拓扑结构。


如果超线程在启动前关闭,Conky 会崩溃

为了使 CPU 2、4、6、8 的利用率尽可能达到最低,我尝试在启动期间关闭超线程。我用这个脚本来做到这一点:

# NAME: /etc/cron.d/turn-off-hyper-threading
# DATE: Auguust 5, 1017
# DESC: This turns off CPU 1, 3, 5 & 7
# NOTE: Part of testing for Ubuntu answer:
#       https://askubuntu.com/questions/942728/disable-hyper-threading-in-ubuntu/942843#942843
# BUGS: Conky crashes with Segmentation Fault when CPU 2,4,6 & 8 (as conky calls them)
#       are off-line.
#
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu1/online
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu3/online
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu5/online
# @reboot   root    echo 0 > /sys/devices/system/cpu/cpu7/online
Run Code Online (Sandbox Code Playgroud)

但是conky,如果在启动时关闭超线程,则会因分段错误而崩溃。因此,我不得不注释掉@reboot脚本中的四行。

用于显示 CPU 百分比利用率和负载因子的 Conky 代码

如果您有兴趣在 Conky 中设置类似的显示,这里是相关的代码片段:

${color orange}${voffset 2}${hr 1}
${color2}${voffset 5}Intel® i-7 3630QM 3.4 GHz: ${color1}@  ${color green}${freq} MHz   
${color}${goto 13}CPU 1 ${goto 81}${color green}${cpu cpu1}% ${goto 131}${color3}${cpubar cpu1 18}
${color}${goto 13}CPU 2 ${goto 81}${color green}${cpu cpu2}% ${goto 131}${color3}${cpubar cpu2 18}
${color}${goto 13}CPU 3 ${goto 81}${color green}${cpu cpu3}% ${goto 131}${color3}${cpubar cpu3 18}
${color}${goto 13}CPU 4 ${goto 81}${color green}${cpu cpu4}% ${goto 131}${color3}${cpubar cpu4 18}
${color}${goto 13}CPU 5 ${goto 81}${color green}${cpu cpu5}% ${goto 131}${color3}${cpubar cpu5 18}
${color}${goto 13}CPU 6 ${goto 81}${color green}${cpu cpu6}% ${goto 131}${color3}${cpubar cpu6 18}
${color}${goto 13}CPU 7 ${goto 81}${color green}${cpu cpu7}% ${goto 131}${color3}${cpubar cpu7 18}
${color}${goto 13}CPU 8 ${goto 81}${color green}${cpu cpu8}% ${goto 131}${color3}${cpubar cpu8 18}
${color1}All CPU ${color green}${cpu}% ${goto 131}${color1}Temp: ${color green}${hwmon 2 temp 1}°C ${goto 250}${color1}Up: ${color green}$uptime
${color green}$running_processes ${color1}running of ${color green}$processes ${color1}loaded processes.
Load Avg. 1-5-15 minutes: ${alignr}${color green}${execpi .001 (awk '{printf "%s/", $1}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", $2}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", $3}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4}
${color1}NVIDIA  ${color}-GPU ${color green}${nvidia gpufreq} Mhz  ${color}-Memory ${color green}${nvidia memfreq} Mhz
${color1}GT650M ${color}-Temp ${color green}${nvidia temp}°C  ${color}-Threshold ${color green}${nvidia threshold}°C
${color orange}${voffset 2}${hr 1}
Run Code Online (Sandbox Code Playgroud)

注意:上面的 Nvidia 代码从未经过测试,因为我还没有在 Ubuntu 下使用 Nvidia GPU。现在任何一年:)


max*_*zig 11

您可以在 Linux 中以 root 或超级用户权限禁用超线程:

# echo off > /sys/devices/system/cpu/smt/control
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令显示当前的超线程状态

$ cat /sys/devices/system/cpu/smt/control
Run Code Online (Sandbox Code Playgroud)

此命令打印以下之一:

on|off|forceoff|notsupported|notimplemented
Run Code Online (Sandbox Code Playgroud)

或者,大多数 BIOS 固件还包括禁用超线程的选项。如果在 BIOS 中禁用它,则上述 cat 可能会返回forceoff.


Eld*_*eek 6

最近的内核支持 maxcpus内核参数。

这允许您将 CPU 的数量设置为物理内核的数量。这可能有助于缓解Intel 6 系列 CPU 上的MDS 漏洞造成的威胁。

如何:

使用 sudo (root) 权限使用您喜欢的文本编辑器打开 /etc/default/grub。

找到以GRUB_CMDLINE_LINUX_DEFAULT=开头的行

并将 maxcpus=n 添加到任何现有内核参数中,例如常见的安静启动参数(其中 n = 您的 CPU 具有的物理内核数。

例如,在我可信赖的 Intel(R) Core(TM) i3-3220 CPU @ 3.30GHz 双核超线程上,我添加了maxcpus=2以在启动时关闭超线程。

保存文件,然后发出命令sudo update-grub并重新启动。

您可以通过发出lscpu | grep "per core"应提供如下输出的命令来确认成功:

Thread(s) per core: 1

在内核 4.4.0 上测试

资料来源:

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/kernel-parameters.txt

https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html

https://unix.stackexchange.com/questions/145645/disabling-cpu-cores-on-quad-core-processor-on-linux


Hi-*_*gel 0

如果您阅读过讨论,那么您可能知道禁用它通常是不合理的,因此我假设您希望将其用于学习目的。

\n\n

HT 的思想是为每个物理核心(所谓的虚拟核心)配备多组 CPU 寄存器。没有“更好”的虚拟核心,它们是相同的。有了这些知识,您就可以禁用虚拟核心,除了每个物理核心都有一个。

\n\n

首先,您想知道哪对虚拟核心属于/sys/文件系统中的哪个物理核心。您可以使用core_id文件来实现:

\n\n
\xce\xbb grep "" /sys/devices/system/cpu/cpu*/topology/core_id\n/sys/devices/system/cpu/cpu0/topology/core_id:0\n/sys/devices/system/cpu/cpu1/topology/core_id:2\n/sys/devices/system/cpu/cpu2/topology/core_id:0\n/sys/devices/system/cpu/cpu3/topology/core_id:2\n
Run Code Online (Sandbox Code Playgroud)\n\n

从输出中您可以推断出 cpu0+cpu2 包含在一个物理核心中,而 cpu1+cpu3 包含在另一个物理核心中。现在提升权限,并使用echo命令禁用每对中的一个:

\n\n
\xce\xbb sudo -s\n# echo 0 > /sys/devices/system/cpu/cpu1/online\n# echo 0 > /sys/devices/system/cpu/cpu2/online\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,cpu0 没有“在线”文件并且无法禁用,因此我禁用了 cpu2。

\n