2011-05-29 12:02:39
Prozessoren, Cores und Hyperthreading
Wie erkennt man auf einem System, wie viele Prozessoren und Cores man hat, und ob Hyperthreading zur Verfügung steht? Fangen wir direkt mit einem Beispiel an:
s1# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Xeon(R) CPU 5110 @ 1.60GHz stepping : 6 cpu MHz : 1595.984 cache size : 4096 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 10 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts pni monitor ds_cpl vmx tm2 ssse3 cx16 xtpr dca lahf_lm bogomips : 3194.84 clflush size : 64 power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 15 model name : Intel(R) Xeon(R) CPU 5110 @ 1.60GHz stepping : 6 cpu MHz : 1595.984 cache size : 4096 KB physical id : 0 siblings : 2 core id : 1 cpu cores : 2 apicid : 1 initial apicid : 1 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 10 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts pni monitor ds_cpl vmx tm2 ssse3 cx16 xtpr dca lahf_lm bogomips : 3192.06 clflush size : 64 power management:
Hier sieht man das "ht"-Flag, aber der Xeon 5110 hat kein Hyperthreading. Zum Vergleich mal ein anderes System:
s2# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 15 model : 4 model name : Intel(R) Pentium(R) 4 CPU 3.00GHz stepping : 1 cpu MHz : 2995.049 cache size : 1024 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 1 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 5 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe constant_tsc pebs bts sync_rdtsc pni monitor ds_cpl cid xtpr bogomips : 5994.31 clflush size : 64 processor : 1 vendor_id : GenuineIntel cpu family : 15 model : 4 model name : Intel(R) Pentium(R) 4 CPU 3.00GHz stepping : 1 cpu MHz : 2995.049 cache size : 1024 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 1 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 5 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe constant_tsc pebs bts sync_rdtsc pni monitor ds_cpl cid xtpr bogomips : 5990.26 clflush size : 64
Hier steht auch "ht", diesmal hat die CPU aber Hyperthreading. Das Flag wurde wegen einer gewissen Abwärtskompatibilität gesetzt. Grund waren unter anderem Betriebssysteme, die pro Sockel lizenziert wurden. Hätte man das mit dem Pentium4 eingeführte ht-Flag weggelassen, hätten diese "OS" den virtuellen zweiten Kern nicht genutzt / nutzen können.
Wichtig sind hierbei die Angaben zu den Siblings (so etwas wie gleichartige Kinder einer "Vater-CPU"), der Physical ID, der Anzahl der Cores und die Nummerierung der Core IDs. Mit grep wird das dann deutlicher:
s1# egrep \ 'processor|physical id|siblings|core id|cpu cores|^$' \ /proc/cpuinfo processor : 0 physical id : 0 siblings : 2 core id : 0 cpu cores : 2 processor : 1 physical id : 0 siblings : 2 core id : 1 cpu cores : 2
Wir haben 2 CPU cores mit ID 0 und 1 auf 1 physischen Prozessor bei 2 Siblings. die 2 Siblings beziehen sich hier auf die 2 Cores pro physischer CPU.
s2# egrep \ 'processor|physical id|siblings|core id|cpu cores|^$' \ /proc/cpuinfo processor : 0 physical id : 0 siblings : 2 core id : 0 cpu cores : 1 processor : 1 physical id : 0 siblings : 2 core id : 0 cpu cores : 1
Hier haben wir 2 (virtuelle) Prozessoren mit 1 physical ID, 1 Core ID und 1 CPU core, aber mit 2 Siblings. Es handelt sich somit um eine einzelne Singlecore-CPU. Die zwei virtuellen Prozessoren kommen durch die 2 Siblings zustande: Diese CPU hat also Hyperthreading. Pro Core hat man hier also "cpu cores" geteilt durch "siblings" = 2 / 1 = 2 virtuelle HT-Prozessoren.
Schauen wir uns einen dritten Server an:
s3# egrep processor /proc/cpuinfo processor : 0 processor : 1 processor : 2 processor : 3 processor : 4 processor : 5 processor : 6 processor : 7 processor : 8 processor : 9 processor : 10 processor : 11 processor : 12 processor : 13 processor : 14 processor : 15 root@coabmaster:~ > egrep 'core id' /proc/cpuinfo|sort -u core id : 0 core id : 1 core id : 2 core id : 3
Wir haben 16 virtuelle/nicht-virtuelle Prozessoren und 4 Kerne pro physischem Prozessor.
s3# egrep \ 'siblings|cpu cores|physical id' /proc/cpuinfo \ |sort -u cpu cores : 4 physical id : 0 physical id : 1 siblings : 8
Hier sieht man noch mal die Anzahl der Kerne, die IDs der physischen Prozessoren und 8 Siblings (8 Siblings durch 4 Cores = 2 virtuelle HTT-CPUs). Das macht also 2 Quadcore-CPUs mit Hyperthreading = 16 virtuelle Prozessoren.
Mit einem kleinen Script lässt sich das bequem auswerten:
s4# cat cpucores.sh #!/bin/bash for f in \ 'model name' processor 'physical id' 'cpu cores' siblings do grep "$f" /proc/cpuinfo|tail -n 1 done \ |sed 's,.*: ,,' \ |{ read M read P;let P=P+1 read I;[ -z "$I" ] && I=0;let I=I+1 read C;[ -z "$C" ] && C=1 read S;[ -z "$S" ] && S=1 echo $M: $I CPUs with $C cores and $S siblings\ $([ $S -gt $C ] && echo " (hyperthreading)") \ '("'$P virtual processors'")' } s4# ./cpucores.sh Intel(R) Xeon(R) CPU E5520 @ 2.27GHz: 2 CPUs with 4 cores and 8 siblings (hyperthreading) ("16 virtual processors")
Da das Script so kurz ist, kann man es auch als Einzeiler verwenden. Zum Schluss noch ein paar Beispielausgaben des Scripts:
Intel(R) Xeon(R) CPU E5520 @ 2.27GHz: 2 CPUs with 4 cores and 8 siblings (hyperthreading) ("16 virtual processors") Intel(R) Xeon(R) CPU X5650 @ 2.67GHz: 2 CPUs with 6 cores and 12 siblings (hyperthreading) ("24 virtual processors") Intel(R) Pentium(R) 4 CPU 3.00GHz: 1 CPUs with 1 cores and 2 siblings (hyperthreading) ("2 virtual processors") Intel(R) Core(TM)2 CPU 4400 @ 2.00GHz: 1 CPUs with 2 cores and 2 siblings ("2 virtual processors") Intel(R) Xeon(R) CPU 3060 @ 2.40GHz: 1 CPUs with 2 cores and 2 siblings ("2 virtual processors") Intel(R) Xeon(R) CPU 5110 @ 1.60GHz: 4 CPUs with 2 cores and 2 siblings ("4 virtual processors") Intel(R) Xeon(R) CPU E5310 @ 1.60GHz: 1 CPUs with 4 cores and 4 siblings ("4 virtual processors") Intel(R) Xeon(R) CPU E5520 @ 2.27GHz: 2 CPUs with 4 cores and 8 siblings (hyperthreading) ("8 virtual processors") Intel(R) Xeon(R) CPU E5620 @ 2.40GHz: 2 CPUs with 4 cores and 8 siblings (hyperthreading) ("8 virtual processors")