¿Cómo puedo verificar si hyperthreading está habilitado en una máquina Linux, usando un script perl para verificarlo?
Estoy intentando de la siguiente manera:
dmidecode -t processor | grep HTT
Avísame si estoy en el camino correcto.
linux
cpu
hyperthreading
De dos pisos
fuente
fuente
dmidecode
tienes que ser root.Respuestas:
Notas agregadas el 8 de julio de 2014: como señaló Riccardo Murri , mi respuesta a continuación solo muestra si el procesador informa que admite hyperthreading. Generalmente, * nix O / S están configurados para habilitar hyperthreading si es compatible. Sin embargo, para verificar esto mediante programación, vea, por ejemplo , la respuesta de Nils .
---- Respuesta original del 25 de marzo de 2012:
De hecho, estás en el camino correcto :) con
En Linux, generalmente busco "ht" en la línea "flags" de
/proc/cpuinfo
. Ver por ejemploo si quieres incluir el "ht" en el patrón
(
\b
coincide con los límites de las palabras y ayuda a evitar falsos positivos en los casos en que "ht" es parte de otro indicador).fuente
lscpu
Es la forma de comprobarlo.Siempre usé lo siguiente y miré 'Hilo (s) por núcleo:'.
Sin embargo, tenga en cuenta que esta técnica fallará si algún procesador lógico se ha apagado con un simple
fuente
echo 0 > /sys/devices/system/cpu/cpu31/online
, ahora informa lscpuThread(s) per core: 1
. Mallscpu
! Supongo que ya no usaré esto.Si la cantidad de procesadores lógicos es el doble de la cantidad de núcleos que tiene HT. Use el siguiente script para decodificar / proc / cpuinfo :
fuente
$NUMCORE > $NUMLOG
podemos decir que hyperthreading está habilitado, ¿verdad? De hecho2 * $NUMCORE = $NUMLOG
, ¿esto es siempre cierto o algunas CPU pueden tener 4 veces más núcleos?lscpu
disponible,lscpu
proporcionará la misma información junto con muchos metadatos adicionales y la salida delscpu
es más fácil de analizar. pero esta solución funciona y solo usa/proc/cpuinfo
.Los ejemplos anteriores muestran si la CPU es capaz de HT, pero no si se está utilizando. El último método funciona, pero no los servidores de doble socket y las máquinas virtuales se probaron
Xenserver
donde no muestra CPU física, ya que no hay ninguno.Encontré que esta es la forma más fácil y menos codificada, que también funcionó en todos mis entornos de prueba. pero requiere
bc
.Creo que esto funcionará en todas las plataformas y le dirá si su CPU es capaz y si está habilitada. Puede ser un poco desordenado, aunque soy un principiante en los scripts. Probé con centos XENSERVER vm, Ubuntu y Openfiler (rpath)
fuente
/sys/devices/system/cpu/smt/control
. Ver también la respuesta de OscarPuede verificar la capacidad HT de la CPU con este comando
Puede enumerar la CPU física y lógica vista por Kernel con el siguiente comando:
Ofrece esta salida en una CPU habilitada para HT de un solo núcleo:
Puedes leer el resultado así:
fuente
ht
en los indicadores de CPU.physical id
parece representar el zócalo / chip. Elcore id
parece apuntar a un mismo núcleo físicoEste liner parece hacer el truco para mí (requiere privilegios de root):
El resultado es:
El recuento de subprocesos es el doble del recuento principal, por lo tanto, tengo hyperthreading habilitado.
O si realmente quieres tu script perl, como se solicitó ...
fuente
dmidecode
sea confiable.lscpu
no siempre será confiable. Me gusta la respuesta de scottbb.Este resultado indica que HT está habilitado ya que el
siblings
número (12) es mayor quecpu cores
(6)fuente
Si lee
/sys/devices/system/cpu/cpu0/topology/thread_siblings_list
, devolverá una lista separada por comas de los hermanos de subproceso (es decir, "núcleos" de Hyperthread) de la CPU 0.Por ejemplo, en mi Xeon de 2 sockets y 6 núcleos, con hyperthreading habilitado obtengo:
Pero después de desactivar hyperthreading en BIOS, obtengo:
Suponiendo que la CPU 0 siempre estará disponible, luego verificar el
thread_sibling_list
archivo procfs de la CPU 0 para más de un nodo, o buscar una coma, o incluso cualquier otra cosa0
, indicará si hyperthreading está habilitado.Yo respondería en Perl, pero 1) No lo sé, y 2) Supongo que la solución es bastante trivial.
fuente
En Linux esto funciona bien:
En el ejemplo anterior, tenemos 2 sockets NUMA (SOCKET = 1 o 2). Tenemos 16 núcleos físicos (CORE = 0 a 15). Cada CORE tiene un hyperthread hermano (por ejemplo CORE = 0 contiene CPU 0,16.
Podemos verificar el hyperthread así:
La jerarquía de la memoria caché es:
lscpu -p proporciona una salida en formato csv para analizar fácilmente el programa.
fuente
Aquí hay un enfoque basado en Python: también sugiere formas de deshabilitarlo si es necesario.
fuente
echo off > /sys/devices/system/cpu/smt/control
(además de desactivarlo en la BIOS). Ver también la respuesta de Oscar para una verificación directa.Hay muchas advertencias y qué pasa si está en las respuestas aquí ... parece que la respuesta no es tan obvia.
lscpu
tiene su gotcha, que se aplica a cualquier "núcleo de conteo y procesadores lógicos, luego compara" la respuesta. Debido a que puede apagar los procesadores lógicos con un simple comando de eco (... esto podría ser crítico en un entorno empresarial grande donde depende del modo turbo, por ejemplo).Aquí está mi intento; Gracias a @scottbb por la inspiración:
En mis máquinas basadas en Dell Xeon, la lista de hermanos incluye una coma cuando HT está activado. En mi computadora portátil, incluye un guión (procesador i5-3210m). Así que estoy preparando para la puntuación.
Pensamientos? ¿Críticas?
El solicitante pidió perl, así que aquí tienes:
fuente
grep -q [-.]
ya que esto es menos para escribir. FWIW, he comprobado varios Xeons / i5 / i7 (incluidas las variantes móviles) y ninguno de ellos tiene un guión en elthread_siblings_list
. No es suficiente para simplemente cpu0 cheque - por lo tanto, algo como esto sería más robusto:grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
. Sin embargo, solo agrep 1 /sys/devices/system/cpu/smt/active -q
es aún más importante: cf. La respuesta de OscarLa forma más fácil de verificar si SMT (genérico para HT, que es solo la marca Intel) está activo, simplemente haga:
le da 0 para inactivo o 1 para activo
En realidad, puede activarlo o desactivarlo en tiempo de ejecución con:
fuente
/sys/devices/system/cpu/smt/control
es posible y rindeon|off|forceoff|notsupported|notimplemented
.Mejor verifique lscpu, donde puede ver "Thread (s) por core: 1", significa solo un thread por 1 core.
fuente
Stephaniea ya lo ha mencionado
lscpu
. Quería agregar un poco más a eso.En mi procesador AMD Epyc, cada vez que hay un núcleo lógico fuera de línea,
lscpu
muestra una nueva línea adicional llamadaOff-line CPU(s) list:
fuente