joh*_*hn 20 performance configuration cpu 16.04
我正在运行 ubuntu 16.04 服务器。当我使用 lscpu 命令时,我可以看到启用了炒作线程。
这些都是很好的讨论,为什么超线程可能不好。但没有关于如何关闭它的明确解决方案。
任何人都可以提供禁用超线程的步骤吗?谢谢 。
Win*_*nix 11
这是个有趣的问题。对我个人来说,这可能是几个月来最有趣的事情之一。像 OP 一样,在我的旧 BIOS(2012 年发明,2016 年左右更新)中没有禁用超线程的选项。
任何使用Intel Skylake或Kaby Lake处理器的人都必须阅读几个月前浮出水面的有关超线程的错误报告。这个UK Register 的故事详细说明了 Debian 开发人员如何发现超线程如何使机器崩溃和损坏。
去年在 Ask Ubuntu 中报告了许多 Skylake 问题,人们想知道如何辨别哪些问题可能是由超线程错误引起的。
您可以在下方看到关闭超线程并执行 CPU 压力测试时的 CPU 利用率。大约 10 秒后,在打开超线程的情况下重复相同的脚本。最后 10 秒后,再次关闭超线程运行脚本:
显示分为两部分:
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 冻结在当前状态。
另请注意,无论您是打开还是关闭超线程,脚本仍会显示“支持超线程”。
查看下面的脚本时,请记住 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的拓扑结构。
为了使 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
脚本中的四行。
如果您有兴趣在 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
.
最近的内核支持 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
如果您阅读过讨论,那么您可能知道禁用它通常是不合理的,因此我假设您希望将其用于学习目的。
\n\nHT 的思想是为每个物理核心(所谓的虚拟核心)配备多组 CPU 寄存器。没有“更好”的虚拟核心,它们是相同的。有了这些知识,您就可以禁用虚拟核心,除了每个物理核心都有一个。
\n\n首先,您想知道哪对虚拟核心属于/sys/
文件系统中的哪个物理核心。您可以使用core_id
文件来实现:
\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
命令禁用每对中的一个:
\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 归档时间: |
|
查看次数: |
22913 次 |
最近记录: |