Làm cách nào tôi có thể kiểm tra xem siêu phân luồng có được bật trên máy Linux hay không, sử dụng tập lệnh perl để kiểm tra?
Tôi đang thử cách sau:
dmidecode -t processor | grep HTT
Hãy cho tôi biết nếu tôi đi đúng hướng.
Làm cách nào tôi có thể kiểm tra xem siêu phân luồng có được bật trên máy Linux hay không, sử dụng tập lệnh perl để kiểm tra?
Tôi đang thử cách sau:
dmidecode -t processor | grep HTT
Hãy cho tôi biết nếu tôi đi đúng hướng.
Câu trả lời:
Ghi chú được thêm vào ngày 8 tháng 7 năm 2014: Như Riccardo Murri đã chỉ ra, câu trả lời của tôi dưới đây chỉ cho thấy liệu bộ xử lý có báo cáo hỗ trợ siêu phân luồng hay không. Nói chung, * nix O / S được cấu hình để cho phép siêu phân luồng nếu được hỗ trợ. Tuy nhiên, để thực sự kiểm tra điều này theo chương trình, hãy xem câu trả lời của Nils !
---- Câu trả lời gốc từ ngày 25 tháng 3 năm 2012:
Bạn đang thực sự đi đúng hướng :) với
dmidecode -t processor | grep HTT
Trên Linux, tôi thường chỉ tìm "ht" trên dòng "flags" của /proc/cpuinfo
. Xem ví dụ
grep '^flags\b' /proc/cpuinfo | tail -1
hoặc nếu bạn muốn bao gồm "ht" trong mẫu
grep -o '^flags\b.*: .*\bht\b' /proc/cpuinfo | tail -1
( \b
khớp với các ranh giới từ và giúp tránh các lỗi dương trong trường hợp "ht" là một phần của cờ khác.)
lscpu
là cách để kiểm tra
Tôi đã luôn luôn sử dụng những điều sau đây và xem xét 'Chủ đề cho mỗi lõi:'.
hostname:~ # lscpu
Architecture: x86_64
CPU(s): 24
Thread(s) per core: 2 <-- here
Core(s) per socket: 6
CPU socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 44
Stepping: 2
CPU MHz: 1596.000
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 12288K
Lưu ý, tuy nhiên, kỹ thuật này sẽ thất bại nếu bất kỳ bộ xử lý logic nào bị tắt đơn giản
echo 0 > /sys/devices/system/cpu/cpuX/online
echo 0 > /sys/devices/system/cpu/cpu31/online
, giờ là báo cáo lscpu Thread(s) per core: 1
. Xấu quá lscpu
! Đoán tôi sẽ không được sử dụng này nữa.
Nếu số lượng bộ xử lý logic gấp đôi số lượng lõi bạn có HT. Sử dụng để theo dõi tập lệnh để giải mã / Proc / cpuinfo :
#!/bin/sh
CPUFILE=/proc/cpuinfo
test -f $CPUFILE || exit 1
NUMPHY=`grep "physical id" $CPUFILE | sort -u | wc -l`
NUMLOG=`grep "processor" $CPUFILE | wc -l`
if [ $NUMPHY -eq 1 ]
then
echo This system has one physical CPU,
else
echo This system has $NUMPHY physical CPUs,
fi
if [ $NUMLOG -gt 1 ]
then
echo and $NUMLOG logical CPUs.
NUMCORE=`grep "core id" $CPUFILE | sort -u | wc -l`
if [ $NUMCORE -gt 1 ]
then
echo For every physical CPU there are $NUMCORE cores.
fi
else
echo and one logical CPU.
fi
echo -n The CPU is a `grep "model name" $CPUFILE | sort -u | cut -d : -f 2-`
echo " with`grep "cache size" $CPUFILE | sort -u | cut -d : -f 2-` cache"
$NUMCORE > $NUMLOG
chúng ta có thể nói rằng siêu phân luồng được kích hoạt, phải không? Thực tế nó sẽ như vậy 2 * $NUMCORE = $NUMLOG
, điều này luôn luôn đúng hay một số CPU có thể có nhiều lõi hơn gấp 4 lần?
lscpu
sẵn, lscpu
sẽ cung cấp cùng một thông tin cùng với rất nhiều dữ liệu meta bổ sung và đầu ra từ lscpu
dễ phân tích hơn. nhưng giải pháp này không hoạt động và chỉ sử dụng /proc/cpuinfo
.
Các ví dụ trên cho thấy CPU có khả năng HT không, nhưng nếu nó không được sử dụng. Phương pháp cuối cùng hoạt động nhưng không phải máy chủ ổ cắm kép và máy ảo được thử nghiệm ở Xenserver
nơi nó không hiển thị CPU vật lý, vì không có máy chủ nào.
Tôi thấy đây là cách dễ nhất và ít mã hơn, cũng hoạt động trên tất cả các môi trường thử nghiệm của tôi. nhưng đòi hỏi bc
.
echo "testing ################################### "
nproc=$(grep -i "processor" /proc/cpuinfo | sort -u | wc -l)
phycore=$(cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l)
if [ -z "$(echo "$phycore *2" | bc | grep $nproc)" ]
then
echo "Does not look like you have HT Enabled"
if [ -z "$( dmidecode -t processor | grep HTT)" ]
then
echo "HT is also not Possible on this server"
else
echo "This server is HT Capable, However it is Disabled"
fi
else
echo "yay HT Is working"
fi
echo "testing ################################### "
Tôi tin rằng điều này sẽ hoạt động trên tất cả các nền tảng và sẽ cho bạn biết CPU của nó có khả năng hay không và liệu nó có được kích hoạt hay không. Có thể hơi lộn xộn, mặc dù tôi là người mới bắt đầu viết kịch bản. Tôi đã thử nghiệm với centos XENSERVER vm, Ubuntu và Openfiler (rpath)
/sys/devices/system/cpu/smt/control
. Xem thêm câu trả lời của Oscar
Bạn có thể kiểm tra khả năng HT của CPU bằng lệnh này
# grep ht /proc/cpuinfo
Bạn có thể liệt kê CPU vật lý và logiciel mà Kernel nhìn thấy bằng lệnh sau:
# egrep -i "processor|physical id" /proc/cpuinfo
Nó cung cấp đầu ra này trên CPU kích hoạt HT lõi đơn:
processor : 0
physical id : 0
processor : 1
physical id : 0
Bạn có thể đọc kết quả như thế này:
processor : 0 (CPU 0, first logical)
physical id : 0 (CPU 0 is on the first physical)
processor : 1 (CPU 1, second logical)
physical id : 0 (CPU 1 is on the first physical)
=> It means I have HT enabled
ht
trong các cờ CPU.
physical id
dường như đại diện cho ổ cắm / chip. Các core id
dường như điểm đến cốt lõi vật lý như nhau
Lớp lót này dường như thực hiện thủ thuật cho tôi (yêu cầu quyền root):
dmidecode -t processor | grep -E '(Core Count|Thread Count)'
Đầu ra là:
Core Count: 2
Thread Count: 4
Số lượng chủ đề gấp đôi số lượng lõi, do đó tôi đã kích hoạt siêu phân luồng.
Hoặc nếu bạn thực sự muốn tập lệnh perl của mình, theo yêu cầu ...
perl -e 'print grep(/Core Count/ || /Thread Count/, `dmidecode -t processor`);'
dmidecode
là đáng tin cậy.
lscpu
sẽ không phải lúc nào cũng đáng tin cậy. Tôi thích câu trả lời của scottbb.
perl -ne'
$i++ if /^\s*$/;
push @{$x[$i]}, [/^(.+?) \s*:\s* (.+)/x] if /core|sibling|physical id/; }{
$r= shift @x;
for $i (0..$#$r) {
$$r[$i][1] .= " ".$$_[$i][1] for @x;
printf "%-15s: %s\n", @{$$r[$i]};
}
' /proc/cpuinfo
Kết quả này cho thấy HT được bật khi siblings
số (12) lớn hơn cpu cores
(6)
physical id : 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1
siblings : 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12
core id : 0 1 2 8 9 10 0 1 2 8 9 10 0 1 2 8 9 10 0 1 2 8 9 10
cpu cores : 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6
Nếu bạn đọc /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
, nó sẽ trả về một danh sách được phân tách bằng dấu phẩy của các anh chị em luồng (tức là "lõi" Hyperthread) của CPU 0.
Chẳng hạn, trên Xeon 6 lõi 2 ổ cắm của tôi, với tính năng siêu phân luồng được bật, tôi nhận được:
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,12
Nhưng sau khi tắt siêu phân luồng trong BIOS, tôi nhận được:
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0
Giả sử rằng CPU 0 sẽ luôn khả dụng, sau đó kiểm tra thread_sibling_list
tệp Procfs của CPU 0 để tìm nhiều hơn một nút hoặc tìm kiếm dấu phẩy, hoặc thậm chí bất cứ thứ gì nhiều hơn 0
, sẽ cho biết liệu siêu phân luồng có được bật hay không.
Tôi sẽ trả lời bằng Perl, nhưng 1) Tôi không biết Perl và 2) Tôi cho rằng giải pháp là một lớp lót khá tầm thường.
Trên Linux, nó hoạt động tốt:
$ lscpu -e
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
0 0 0 0 0:0:0:0 yes
1 0 0 1 1:1:1:0 yes
2 0 0 2 2:2:2:0 yes
3 0 0 3 3:3:3:0 yes
4 0 0 4 4:4:4:0 yes
5 0 0 5 5:5:5:0 yes
6 0 0 6 6:6:6:0 yes
7 0 0 7 7:7:7:0 yes
8 1 1 8 8:8:8:1 yes
9 1 1 9 9:9:9:1 yes
10 1 1 10 10:10:10:1 yes
11 1 1 11 11:11:11:1 yes
12 1 1 12 12:12:12:1 yes
13 1 1 13 13:13:13:1 yes
14 1 1 14 14:14:14:1 yes
15 1 1 15 15:15:15:1 yes
16 0 0 0 0:0:0:0 yes
17 0 0 1 1:1:1:0 yes
18 0 0 2 2:2:2:0 yes
19 0 0 3 3:3:3:0 yes
20 0 0 4 4:4:4:0 yes
21 0 0 5 5:5:5:0 yes
22 0 0 6 6:6:6:0 yes
23 0 0 7 7:7:7:0 yes
24 1 1 8 8:8:8:1 yes
25 1 1 9 9:9:9:1 yes
26 1 1 10 10:10:10:1 yes
27 1 1 11 11:11:11:1 yes
28 1 1 12 12:12:12:1 yes
29 1 1 13 13:13:13:1 yes
30 1 1 14 14:14:14:1 yes
31 1 1 15 15:15:15:1 yes
Trong ví dụ trên, chúng tôi có 2 ổ cắm NUMA (SOCKET = 1 hoặc 2). Chúng ta có 16 lõi vật lý (CORE = 0 đến 15). Mỗi CORE có một siêu liên kết anh chị em (Ví dụ CORE = 0 chứa CPU 0,16.
Chúng tôi có thể xác minh siêu phân luồng như vậy:
$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,16
Hệ thống phân cấp bộ nhớ cache là:
CPU 0 --> L1D_0|L1I_0 -> L2_0 -> L3_0
^ ^
CPU 16 ---| |
|
CPU 1 --> L1D_1|L1I_1 -> L2_1 --->
^
CPU 17 ---|
...
lscpu -p cung cấp đầu ra định dạng csv để phân tích chương trình dễ dàng.
$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,4,0,0,,4,4,4,0
...
Đây là một cách tiếp cận dựa trên python - nó cũng gợi ý các cách để vô hiệu hóa nó nếu cần.
import re
total_logical_cpus = 0
total_physical_cpus = 0
total_cores = 0
logical_cpus = {}
physical_cpus = {}
cores = {}
hyperthreading = False
for line in open('/proc/cpuinfo').readlines():
if re.match('processor', line):
cpu = int(line.split()[2])
if cpu not in logical_cpus:
logical_cpus[cpu] = []
total_logical_cpus += 1
if re.match('physical id', line):
phys_id = int(line.split()[3])
if phys_id not in physical_cpus:
physical_cpus[phys_id] = []
total_physical_cpus += 1
if re.match('core id', line):
core = int(line.split()[3])
if core not in cores:
cores[core] = []
total_cores += 1
cores[core].append(cpu)
if (total_cores * total_physical_cpus) * 2 == total_logical_cpus:
hyperthreading = True
print(" This system has %d physical CPUs" % total_physical_cpus)
print(" This system has %d cores per physical CPU" % total_cores)
print(" This system has %d total cores" % (total_cores * total_physical_cpus))
print(" This system has %d logical CPUs" % total_logical_cpus)
if hyperthreading:
print(" HT detected, if you want to disable it:")
print(" Edit your grub config and add 'noht'")
print(" -OR- disable hyperthreading in the BIOS")
print(" -OR- try the following to offline those CPUs:")
for c in cores:
for p, val in enumerate(cores[c]):
if p > 0:
print(" echo 0 > /sys/devices/system/cpu/cpu%d/online" % (val))
echo off > /sys/devices/system/cpu/smt/control
(bên cạnh việc tắt nó trong bios). Xem thêm câu trả lời của Oscar để kiểm tra trực tiếp.
Rất nhiều lời cảnh báo và những gì xảy ra trong câu trả lời ở đây ... có vẻ như câu trả lời không quá rõ ràng. lscpu
có gotcha của nó, áp dụng cho bất kỳ câu trả lời "đếm lõi và bộ xử lý logic nào, sau đó so sánh". Bởi vì bạn có thể tắt bộ xử lý logic bằng lệnh echo đơn giản (... điều này có thể rất quan trọng trong môi trường doanh nghiệp lớn, ví dụ như bạn phụ thuộc vào chế độ turbo).
Đây là cố gắng của tôi; cảm ơn @scottbb đã truyền cảm hứng:
printf "HT is "; egrep -q [:punct:] /sys/devices/system/cpu/cpu0/topology/thread_siblings_list && echo on || echo off
Trên các máy dựa trên Dell Xeon của tôi, danh sách anh chị em bao gồm dấu phẩy khi bật HT. Trên máy tính xách tay của tôi, nó bao gồm một dấu gạch nối (bộ xử lý i5-3210m). Vì vậy, tôi đang chuẩn bị chấm câu.
Suy nghĩ? Phê bình?
Người yêu cầu yêu cầu perl, vì vậy ở đây bạn đi:
perl -ane 'chomp; print "Hyperthreading is "; if (/\D/) { print "ON\n" } else { print "OFF\n" }' < /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
grep -q [-.]
vì đây là ít để gõ. FWIW, tôi đã kiểm tra một số Xeons / i5 / i7 (bao gồm cả các biến thể di động) và không ai trong số chúng có dấu gạch nối trong thread_siblings_list
. Chỉ kiểm tra cpu0 là không đủ - do đó, một cái gì đó như thế này sẽ mạnh mẽ hơn : grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
. Tuy nhiên, chỉ là một vấn đề grep 1 /sys/devices/system/cpu/smt/active -q
thậm chí còn hơn thế Câu trả lời của Oscar
Cách dễ nhất để kiểm tra xem SMT (chung cho HT, chỉ là thương hiệu Intel) có hoạt động hay không:
cat /sys/devices/system/cpu/smt/active
cung cấp cho bạn 0 cho không hoạt động hoặc 1 cho hoạt động
Bạn thực sự có thể bật hoặc tắt khi chạy với:
echo [on|off] > /sys/devices/system/cpu/smt/control
/sys/devices/system/cpu/smt/control
là cũng có thể và sản lượng on|off|forceoff|notsupported|notimplemented
.
Tốt hơn bạn nên kiểm tra lscpu, nơi bạn có thể thấy "Chủ đề trên mỗi lõi: 1", nghĩa là chỉ một luồng trên 1 lõi.
# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 2
NUMA node(s): 2
Vendor ID: GenuineIntel
CPU family: 6
Model: 63
Model name: Intel(R) Xeon(R) CPU E5-2623 v3 @ 3.00GHz
Stepping: 2
CPU MHz: 1200.000
BogoMIPS: 5992.82
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 10240K
NUMA node0 CPU(s): 0,1,4,5
NUMA node1 CPU(s): 2,3,6,7
Stephaniea đã được đề cập lscpu
. Tôi muốn thêm một chút nữa vào đó.
Trên Bộ xử lý AMD Epyc của tôi, bất cứ khi nào có lõi logic ngoại tuyến, lscpu
sẽ hiển thị một dòng bổ sung mới được gọi làOff-line CPU(s) list:
# echo 0 > /sys/devices/system/cpu/cpu9/online
# echo 0 > /sys/devices/system/cpu/cpu16/online
#
#lscpu
CPU(s): 64
On-line CPU(s) list: 0-8,10-15,17-63
Off-line CPU(s) list: 9,16
dmidecode
bạn phải là root.