基准测试:
我写了一个简单的 Ruby 脚本,它运行一个 while 循环,并将循环计数器的值与另一个变量相加。这个程序应该使用 CPU 核心的100%:
#!/usr/bin/env ruby
$-v = true
LOOPS = ENV['N'].to_i.then { |x| x < 1 ? 100_000_000 : x } + 1
i, j, t = 0, 0, Time.now
puts "Counting till #{LOOPS - 1} and adding values to V..."
while (i += 1) < LOOPS
if i % 10000 == 0
e = Time.now - t
r = LOOPS.*(e)./(i).-(e).round(2)
print "\e[2KN: #{i} | Done: #{i.*(100) / LOOPS}% | Elapsed: #{e.round(2)}s | Estimated Rem: #{r}s\r"
end
j += i
end
puts "\nV = #{j}\nTime: #{(Time.now).-(t).round(2)}s"
启用超线程技术后:
⮚ ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.55s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.55s
⮚ ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.54s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.54s
⮚ ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.67s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.67s
gnome-system-monitor 在测试运行期间报告了 Ruby 占用 25% 的 CPU 使用率。
- 没有超线程:
[ 使用 # echo 0 | tee /sys/devices/system/cpu/cpu{2,3}/online 命令来禁用超线程 ]
⮚ ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.72s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.72s
⮚ ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.54s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.54s
⮚ ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.56s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.56s
gnome-system-monitor 在测试运行期间报告了 Ruby 占用 50% 的 CPU 使用率。
我甚至在我的笔记本电脑上运行了这个测试,所花费的时间大约是在我的电脑上的两倍。但结果是相同的:禁用超线程并不能帮助进程更好地运行。而且更糟的是,我的笔记本电脑在多任务处理时变得稍微慢了一些。 因此,在非超线程模式下,Ruby 使用了两倍的 CPU 功率与超线程模式相比。但为什么它完成相同的任务所需的时间仍然是相同的呢?
echo 0 | tee /sys/devices/system/cpu/cpu{2,3}/online用于禁用超线程。” - 你确定这样正确地禁用了超线程吗?你可能只是将自己降为了一个带有超线程的核心,而不是两个没有超线程的核心。 - marcelmcat /sys/devices/system/cpu/cpuN/topology/core_id命令后输出0或1,那意味着它们在内部使用核心0和1。例如,在我的台式机和笔记本电脑上,都是双核i3处理器,执行cat /sys/devices/system/cpu/cpu{2,3}/topology/core_id命令分别输出0和1。而在我的树莓派3B上,输出结果为3和4,因为树莓派不支持超线程技术(在/proc/cpuinfo中也没有相关信息)。所以我认为对于我这个搭载i3双核处理器的系统来说,禁用3和4实际上就是禁用了超线程技术,对吗? - 15 Volts