Perlスクリプトを使用してハイパースレッディングがLinuxマシンで有効になっているかどうかを確認するにはどうすればよいですか?
私は次の方法を試しています:
dmidecode -t processor | grep HTT
順調に進んでいるかどうか教えてください。
2014年7月8日に追加されたメモ:Riccardo Murri が指摘したように、以下の私の回答は、プロセッサがサポートすることを報告するかどうかのみを示していますハイパースレッディング。通常、* nix O/Sは、サポートされている場合、ハイパースレッディングを有効にするように構成されています。ただし、実際にこれをプログラムで確認するには、たとえば、 Nilsの答え を参照してください。
---- 2012年3月25日からの元の回答:
あなたは確かに正しい軌道に乗っています:)
dmidecode -t processor | grep HTT
Linuxでは、通常、/proc/cpuinfo
の「flags」行で「ht」を探します。たとえばを参照してください
grep '^flags\b' /proc/cpuinfo | tail -1
または、パターンに「ht」を含めたい場合
grep -o '^flags\b.*: .*\bht\b' /proc/cpuinfo | tail -1
(\b
はWordの境界に一致し、「ht」が別のフラグの一部である場合に誤検知を回避するのに役立ちます。)
私は常に以下を使用し、「コアあたりのスレッド:」を調べました。
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
論理プロセッサーの数が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"
上記の例は、CPUがHTに対応しているかどうかを示していますが、使用されている場合は示していません。最後の方法は機能しますが、Xenserver
でテストされたデュアルソケットサーバーとVMでは、物理CPUがないため、物理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)でテストしました
この1つのライナーは私にとってはトリックを行うようです(root権限が必要です)。
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`);'
このコマンドで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
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)ソリューションはかなり簡単な1行であると思います。
SMT(HTの総称であり、Intelのブランディング)がアクティブかどうかを確認する最も簡単な方法は、次のとおりです。
cat /sys/devices/system/cpu/smt/active
非アクティブの場合は0、アクティブの場合は1
あなたは実際に実行時にそれをオンまたはオフにすることができます:
echo [on|off] > /sys/devices/system/cpu/smt/control
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))
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
...
Stephaniea はすでに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
多くの注意事項とここでの答えにあるものは...答えはそれほど明白ではないようです。 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しています。
考え?批判?
リクエスタが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
lscpuはどうですか。次に、コアあたりのスレッド数など、CPUに関する多くの情報を取得します。それが1の場合、マルチスレッドはオフです。
lscpu | grep Thread
戻り値->コアあたりのスレッド数:1
1つのハイパースレッディングが有効になっていない場合。
「コアあたりのスレッド数: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