Como posso verificar se o hyperthreading está ativado em uma máquina Linux, usando um script perl para verificar isso?
Estou tentando da seguinte maneira:
dmidecode -t processor | grep HTT
Deixe-me saber se estou no caminho certo.
linux
cpu
hyperthreading
doubledecker
fonte
fonte
dmidecode
você ter que ser raiz.Respostas:
Notas adicionadas em 8 de julho de 2014: Como apontou Riccardo Murri , minha resposta abaixo mostra apenas se o processador reporta suporte ao hyperthreading. Geralmente, * nix O / S é configurado para ativar o hyperthreading, se suportado. No entanto, para verificar isso de forma programática, veja, por exemplo, a resposta de Nils !
Resposta original de 25 de março de 2012:
Você está realmente no caminho certo :) com
No Linux, geralmente procuro "ht" na linha "flags" do
/proc/cpuinfo
. Veja por exemploou se você deseja incluir o "ht" no padrão
(
\b
corresponde aos limites da palavra e ajuda a evitar falsos positivos nos casos em que "ht" faz parte de outro sinalizador.)fonte
lscpu
é a maneira de verificar.Eu sempre usei o seguinte e observei 'Thread (s) por núcleo:'.
Observe, no entanto, que esta técnica falhará se algum processador lógico for desligado com um simples
fonte
echo 0 > /sys/devices/system/cpu/cpu31/online
, agora relatórios lscpuThread(s) per core: 1
. Maulscpu
! Acho que não vou mais usar isso.Se o número de processadores lógicos for o dobro do número de núcleos que você possui HT. Use o seguinte script para decodificar / proc / cpuinfo :
fonte
$NUMCORE > $NUMLOG
podemos dizer que o hyperthreading está ativado, certo? Na verdade2 * $NUMCORE = $NUMLOG
, isso é sempre verdade ou algumas CPUs podem ter 4x mais núcleos?lscpu
disponível,lscpu
fornecerá as mesmas informações, juntamente com muitos metadados extras, e a saídalscpu
será mais facilmente analisável. mas esta solução funciona e usa apenas/proc/cpuinfo
.Os exemplos acima mostram se a CPU é capaz de HT, mas não se estiver sendo usada. O último método funciona, mas não os servidores de soquete duplo e as VMs testadas
Xenserver
onde não exibe a CPU física, pois não há nenhuma.Eu achei que essa era a maneira mais fácil e com menos códigos, que também funcionava em todos os meus ambientes de teste. mas requer
bc
.Acredito que isso funcionará em todas as plataformas e informará se sua CPU é capaz e se está ativada. Pode ser um pouco confuso, mas sou iniciante em scripts. Testei com centos XENSERVER vm, Ubuntu e Openfiler (rpath)
fonte
/sys/devices/system/cpu/smt/control
. Veja também a resposta do OscarVocê pode verificar a capacidade HT da CPU com este comando
Você pode listar a CPU física e lógica vista pelo Kernel com o seguinte comando:
Ele fornece esta saída em uma CPU habilitada para HT de núcleo único:
Você pode ler o resultado assim:
fonte
ht
nos sinalizadores da CPU.physical id
parece representar o soquete / chip. Ocore id
parece apontar para o mesmo núcleo físicoEste liner parece fazer o truque para mim (requer privilégios de root):
A saída é:
A contagem de threads é o dobro da contagem de núcleos, portanto, tenho o hyperthreading ativado.
Ou se você realmente deseja o seu script perl, conforme solicitado ...
fonte
dmidecode
confiável.lscpu
nem sempre será confiável. Eu gosto da resposta do scottbb.Este resultado indica que o HT está ativado, pois o
siblings
número (12) é maior quecpu cores
(6)fonte
Se você ler
/sys/devices/system/cpu/cpu0/topology/thread_siblings_list
, ele retornará uma lista separada por vírgula dos irmãos do thread (ou seja, "núcleos" do Hyperthread)) da CPU 0.Por exemplo, no meu Xeon de 2 soquetes e 6 núcleos, com o hyperthreading ativado, recebo:
Mas depois de desligar o hyperthreading no BIOS, recebo:
Supondo que a CPU 0 esteja sempre disponível, verifique o
thread_sibling_list
arquivo procfs da CPU 0 para mais de um nó, ou procure uma vírgula, ou mesmo algo além disso0
, indicará se o hyperthreading está ativado.Eu responderia em Perl, mas 1) não conheço Perl e 2) presumo que a solução seja uma linha bastante trivial.
fonte
No Linux, isso funciona bem:
No exemplo acima, temos 2 soquetes NUMA (SOCKET = 1 ou 2). Temos 16 núcleos físicos (CORE = 0 a 15). Cada CORE possui um hyperthread irmão (por exemplo, CORE = 0 contém CPU 0,16.
Podemos verificar o hyperthread da seguinte maneira:
A hierarquia de memória cache é:
O lscpu -p fornece uma saída no formato csv para facilitar a análise do programa.
fonte
Aqui está uma abordagem baseada em python - ela também sugere maneiras de desativá-la, se necessário.
fonte
echo off > /sys/devices/system/cpu/smt/control
(além de desativá -lo no BIOS). Veja também a resposta do Oscar para uma verificação direta.Muitas advertências e what-if estão nas respostas aqui ... parece que a resposta não é tão óbvia.
lscpu
tem suas pegadinhas, que se aplicam a qualquer resposta de "núcleos de contagem e processadores lógicos e depois comparar". Como você pode desligar processadores lógicos com um simples comando de eco (... isso pode ser crítico em um ambiente corporativo grande, em que você depende do modo turbo, por exemplo).Aqui está a minha tentativa; obrigado a @scottbb pela inspiração:
Nas minhas máquinas baseadas no Dell Xeon, a lista de irmãos inclui uma vírgula quando o HT está ativado. No meu laptop, ele inclui um hífen (processador i5-3210m). Então, eu estou esperando por pontuação.
Pensamentos? Críticas?
O solicitante pediu perl, então aqui está:
fonte
grep -q [-.]
porque isso é menos para digitar. FWIW, verifiquei vários Xeons / i5 / i7 (incluindo variantes para celular) e nenhum deles tem um hífen nothread_siblings_list
. Não é suficiente para cpu0 verificação apenas - assim, algo como isso seria mais robusto:grep -q , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
. No entanto, apenas agrep 1 /sys/devices/system/cpu/smt/active -q
é ainda mais direto ao ponto - cf. Resposta de OscarA maneira mais fácil de verificar se o SMT (genérico para HT, que é apenas a marca Intel) está ativo, basta:
fornece 0 para inativo ou 1 para ativo
Você pode ativá-lo ou desativá-lo em tempo de execução com:
fonte
/sys/devices/system/cpu/smt/control
é possível e produzon|off|forceoff|notsupported|notimplemented
.Melhor verificar lscpu, onde você pode ver "Thread (s) por núcleo: 1", significa apenas um segmento por 1 núcleo.
fonte
Stephaniea já mencionou
lscpu
. Eu queria acrescentar um pouco mais a isso.No meu processador AMD Epyc, sempre que houver um núcleo lógico offline,
lscpu
exibe uma nova linha adicional chamadaOff-line CPU(s) list:
fonte