Linuxマシンでハイパースレッディングが有効になっているかどうかを確認するには、perlスクリプトを使用して確認しますか?
私は次の方法を試しています:
dmidecode -t processor | grep HTT
順調に進んでいるかどうか教えてください。
Linuxマシンでハイパースレッディングが有効になっているかどうかを確認するには、perlスクリプトを使用して確認しますか?
私は次の方法を試しています:
dmidecode -t processor | grep HTT
順調に進んでいるかどうか教えてください。
回答:
2014年7月8日に追加注:として、リッカルドMurriは、プロセッサのレポートは、ハイパースレッディングをサポートするかどうか、だけを示し、以下の私の答えを指摘しました。通常、* nix O / Sは、サポートされている場合、ハイパースレッディングを有効にするように構成されます。ただし、これを実際にプログラムで確認するには、たとえばNilsの答えを確認してください。
---- 2012年3月25日からの元の回答:
あなたは確かに正しい軌道に乗っています:)
dmidecode -t processor | grep HTT
Linuxでは、通常、の「フラグ」行で「ht」を探すだけです/proc/cpuinfo
。インスタンスを参照してください
grep '^flags\b' /proc/cpuinfo | tail -1
または、パターンに「ht」を含める場合
grep -o '^flags\b.*: .*\bht\b' /proc/cpuinfo | tail -1
(\b
単語の境界に一致し、「ht」が別のフラグの一部である場合の誤検知を回避するのに役立ちます。)
lscpu
確認する方法です。
私は常に次のものを使用し、「コアごとのスレッド:」を見てきました。
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
ただし、単純な方法で論理プロセッサがオフになっている場合、この手法は失敗します。
echo 0 > /sys/devices/system/cpu/cpuX/online
echo 0 > /sys/devices/system/cpu/cpu31/online
、現在lscpuが報告していThread(s) per core: 1
ます。悪いlscpu
!これはもう使用しないと思います。
論理プロセッサの数がHTのコア数の2倍の場合。次のスクリプトを使用して/ 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
我々は正しい、そのハイパースレッディングが有効になっていると言うことができますか?事実2 * $NUMCORE = $NUMLOG
、これは常に当てはまるのですか、それとも一部のCPUには4倍以上のコアがあるのでしょうか?
lscpu
利用でき、lscpu
追加のメタデータの多くからの出力と一緒に同じ情報を提供するlscpu
、より簡単に解析可能です。ただし、このソリューションは機能し、のみを使用し/proc/cpuinfo
ます。
上記の例は、CPUがHTに対応しているかどうかを示していますが、使用されているかどうかは示していません。最後の方法は機能しますが、Xenserver
物理CPU がないため、デュアルソケットサーバーとVMが物理CPUを表示しない場所でテストされていません。
これが最も簡単でコードの少ない方法であることがわかり、すべてのテスト環境でも機能しました。が必要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 ################################### "
これはすべてのプラットフォームで動作し、そのCPUが有効かどうか、有効になっているかどうかがわかります。少し厄介かもしれませんが、私はスクリプト作成の初心者です。CentOS XENSERVER vm、Ubuntu、およびOpenfiler(rpath)でテストしました
/sys/devices/system/cpu/smt/control
。オスカーの答え
このコマンドでCPUのHT機能を確認できます
# grep ht /proc/cpuinfo
次のコマンドを使用して、カーネルから見た物理CPUと論理CPUをリストできます。
# egrep -i "processor|physical id" /proc/cpuinfo
シングルコアHT対応CPUで次の出力を提供します。
processor : 0
physical id : 0
processor : 1
physical id : 0
次のように結果を読むことができます:
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
は、CPUフラグでアドバタイズします。
physical id
ソケット/チップを表しているようです。core id
同一の物理コアを指すように思える
この1つのライナーは私のためにトリックをしているようです(ルート権限が必要です):
dmidecode -t processor | grep -E '(Core Count|Thread Count)'
出力は次のとおりです。
Core Count: 2
Thread Count: 4
スレッド数はコア数の2倍なので、ハイパースレッディングを有効にします。
または、要求どおりにperlスクリプトが本当に必要な場合は...
perl -e 'print grep(/Core Count/ || /Thread Count/, `dmidecode -t processor`);'
dmidecode
は信頼できるとは思わない。
lscpu
必ずしも信頼できるとは限らないことを示しています。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
この結果は、siblings
数値(12)がcpu cores
(6)より大きいため、HTが有効になっていることを示しています
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
を読むと/sys/devices/system/cpu/cpu0/topology/thread_siblings_list
、CPU 0のスレッド兄弟(ハイパースレッド「コア」)のコンマ区切りリストが返されます。
たとえば、ハイパースレッディングを有効にした2ソケット6コアXeonでは、次のようになります。
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,12
しかし、BIOSでハイパースレッディングをオフにすると、次のようになります。
cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0
CPU 0が常に使用可能であると仮定すると、CPU 0のthread_sibling_list
procfsファイルで複数のノードを確認するか、コンマまたはを超えるものを探す0
ことで、ハイパースレッディングが有効かどうかを示します。
私はPerlで答えますが、1)Perlがわからない、2)解決策はかなり些細なワンライナーだと思います。
Linuxでは、これはうまく機能します。
$ 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
上記の例では、2つのNUMAソケットがあります(SOCKET = 1または2)。16個の物理コア(CORE = 0〜15)があります。各COREには兄弟ハイパースレッドがあります(たとえば、CORE = 0にはCPU 0,16が含まれます。
次のようにハイパースレッドを検証できます。
$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
0,16
キャッシュメモリの階層は次のとおりです。
CPU 0 --> L1D_0|L1I_0 -> L2_0 -> L3_0
^ ^
CPU 16 ---| |
|
CPU 1 --> L1D_1|L1I_1 -> L2_1 --->
^
CPU 17 ---|
...
lscpu -pは、簡単なプログラム解析のためにcsv形式の出力を提供します。
$ 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
...
Pythonベースのアプローチを次に示します-必要に応じて無効にする方法も提案します。
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
(BIOSで無効にする以外に)です。直接確認については、オスカーの回答も参照してください。
たくさんの警告とここにある答えの中にwhat-ifがあります...答えはそれほど明白ではないようです。lscpu
「コアと論理プロセッサを数えてから比較」という答えに当てはまる落とし穴があります。単純なエコーコマンドを使用して論理プロセッサを停止できるためです(...これは、たとえばターボモードに依存している大規模なエンタープライズ環境では重要になる可能性があります)。
これが私の試みです。インスピレーションをくれた@scottbbに感謝します。
printf "HT is "; egrep -q [:punct:] /sys/devices/system/cpu/cpu0/topology/thread_siblings_list && echo on || echo off
Dell Xeonベースのマシンでは、HTがオンの場合、兄弟リストにコンマが含まれています。私のラップトップには、ハイフン(i5-3210mプロセッサー)が含まれています。だから私は句読点のegrep'ingです。
考え?批判?
リクエスターがperlを要求したので、ここに行きます:
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 [-.]
これは入力するのが少ないので使用します。FWIW、私はいくつかのXeons / i5 / i7(モバイルバリアントを含む)をチェックしましたが、いずれにもハイフンがありませんthread_siblings_list
。cpu0をチェックするだけでは不十分ですgrep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
。したがって、このようなものはより堅牢になります。ただし、a grep 1 /sys/devices/system/cpu/smt/active -q
はさらに重要です-cf. オスカーの答え
SMT(HTの総称、Intelブランドのみ)がアクティブであるかどうかを確認する最も簡単な方法は次のとおりです。
cat /sys/devices/system/cpu/smt/active
非アクティブの場合は0、アクティブの場合は1
実際に実行時にオンまたはオフにすることができます:
echo [on|off] > /sys/devices/system/cpu/smt/control
「コアあたりのスレッド:1」が表示されるlscpuを確認すると、1コアあたり1つのスレッドのみを意味します。
# 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
ステファニーアはすでに言及していlscpu
ます。それにもう少し加えたいと思いました。
オフライン論理コアがあるたびに、私のAMD Epycのプロセッサ上で、lscpu
呼ばれる新しい追加の行を表示します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
はrootでなければなりません。