Desativar hyper threading no Ubuntu

4

Estou executando o servidor do Ubuntu 16.04. Eu posso ver que a segmentação por hype está habilitada quando eu uso o comando lscpu.

Eu quero desativá-lo. Eu passei por fóruns do ubuntu e aqui e aqui .

Estas são boas discussões porque o hyper-threading pode não ser bom. Mas nenhuma solução definitiva sobre como desativá-lo.

Alguém pode dar os passos para desativar o hyperthreading? Obrigado.

    
por john 03.08.2017 / 19:11

4 respostas

4

Introdução

Esta é uma questão interessante. Provavelmente um dos mais interessantes em meses para mim pessoalmente. Como o OP, não há opção para desabilitar o Hyper Threading no meu BIOS antigo (inventado em 2012, atualizado em 2016).

Erros Hyper-Threading no Intel Skylake e no Kaby Lake:

  

Qualquer pessoa que utilize processadores Intel Skylake ou Kaby Lake deve ler   os relatórios de bugs sobre Hyper Threading que surgiram alguns meses   atrás. Esta história UK Register explica como os desenvolvedores Debian   avistou como o Hyper Threading pode travar e corromper a máquina.

Existem inúmeros problemas com o Skylake relatados no Ask Ubuntu no ano passado e perguntamo-nos como discernir quais problemas podem ter sido causados por erros do Hyper Threading.

Esta resposta está dividida em três partes:

  • Exibição de CPUs quando o Hyper-Threading está desativado / ativado
  • Script Bash para automatizar a ativação / desativação do hyper-threading
  • Conky falha se o Hyper Threading estiver desativado antes de iniciar

Exibição de CPUs quando o Hyper-Threading está desativado / ativado

Abaixo você pode ver a utilização da CPU quando o hyper-threading está desativado e um teste de estresse da CPU é realizado. Cerca de 10 segundos depois, o mesmo script é repetido com o hyper-threading ativado. Finalmente, 10 segundos depois, o script é executado com hyper-threading desativado novamente:

A exibição é dividida em duas seções:

  • Na metade esquerda, a janela do terminal invocando o script set-hyper-threading com o parâmetro 0 (desativado) e, em seguida, 1 (ativado).
  • Na metade direita conky exibe a porcentagem de utilização da CPU do CPUS 1 a 8.

O primeiro script executa o Hyper Threading off

A primeira vez que o script é executado, os números da CPU 2, 4, 6 & amp; 8 (de acordo com Conky) são congelados a 3%, 2%, 2% e 2%. Os números da CPU 1, 3, 5 e 7 aumentam para 100% enquanto o teste de estresse é executado.

A topologia da CPU é exibida com o hyper-threading desativado e somente os quatro núcleos relatados:

/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3

Segundo script, execute o Hyper Threading em

Na segunda vez em que o script é executado, o Hyper-Threading é ativado e todos os números de CPU 1-8 chegam a 100% enquanto o teste de estresse é executado.

A topologia da CPU é exibida com o hyper-threading ativado e apenas os quatro núcleos mais e quatro núcleos virtuais são relatados:

/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu1/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu3/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu5/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3
/sys/devices/system/cpu/cpu7/topology/core_id:3

Terceiro script executa Hyper Threading desativado

Observe como, após o término do segundo script, as CPUs 2, 4, 6 e 8 estão inativas em 4%, 2%, 3% e 4%. Isso é importante porque, no terceiro teste, a inversão do Hyper-Threading mostra as porcentagens de CPU congeladas em 4%, 2%, 3%, 4% em vez de 3%, 2%, 2% e 2% do primeiro teste. p>

Portanto, desligar o hyper-threading parece congelar as CPUs virtuais no estado atual.

Observe também que, independentemente de você ativar ou desativar o Hyper-Threading, o script ainda exibe "Hyper Threading Suportado".

Script bash para automatizar a ativação / desativação do hyper-threading

Ao visualizar o script abaixo, lembre-se de que Conky numera as CPUs de 1 a 8, mas o Linux computa as CPUs de 0 a 7.

#!/bin/bash

# NAME: set-hyper-threading
# PATH: /usr/local/bin
# DESC: Turn Hyper threading off or on.

# DATE: Aug. 5, 2017.

# NOTE: Written Part of testing for Ubuntu answer:
#       https://sobrelinux.info/questions/48269/disable-hyper-threading-in-ubuntu"0" turn off hyper threading, "1" turn it on.

if [[ $# -ne 1 ]]; then
    echo 'One argument required. 0 to turn off hyper-threading or'
    echo '1 to turn hyper-threading back on'
    exit 1
fi

echo  > /sys/devices/system/cpu/cpu1/online
echo  > /sys/devices/system/cpu/cpu3/online
echo  > /sys/devices/system/cpu/cpu5/online
echo  > /sys/devices/system/cpu/cpu7/online

grep "" /sys/devices/system/cpu/cpu*/topology/core_id

grep -q '^flags.*[[:space:]]ht[[:space:]]' /proc/cpuinfo && \
    echo "Hyper-threading is supported"

grep -E 'model|stepping' /proc/cpuinfo | sort -u

stress --cpu 8 --io 1 --vm 1 --vm-bytes 128M --timeout 10s

NOTA: O programa stress está embutido em todos os sistemas Debian dos quais o Ubuntu é derivado. Portanto, você não precisa baixar e instalar nenhum pacote para executar este script no Ubuntu.

Se você tem uma CPU dual core, é necessário remover (ou comentar com # ) as linhas que controlam os números de CPU 5 e 7.

Crédito para Hi-Angel para a linha bash grep "" /sys/devices/system/cpu/cpu*/topology/core_id que exibe a topologia da CPU.

Conky falha se o Hyper Threading estiver desativado antes de iniciar

Para obter CPUs 2, 4, 6, 8 para a menor porcentagem de utilização possível, tentei desligar o Hyper-Threading durante a inicialização. Eu usei esse script para fazer isso:

# NAME: /etc/cron.d/turn-off-hyper-threading
# DATE: Auguust 5, 1017
# DESC: This turns off CPU 1, 3, 5 & 7
# NOTE: Part of testing for Ubuntu answer:
#       https://sobrelinux.info/questions/48269/disable-hyper-threading-in-ubuntu"%s/", }' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", }' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", }' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4}
${color1}NVIDIA  ${color}-GPU ${color green}${nvidia gpufreq} Mhz  ${color}-Memory ${color green}${nvidia memfreq} Mhz
${color1}GT650M ${color}-Temp ${color green}${nvidia temp}°C  ${color}-Threshold ${color green}${nvidia threshold}°C
${color orange}${voffset 2}${hr 1}

NOTA: O código Nvidia acima nunca foi testado porque ainda não tenho a GPU da Nvidia funcionando no Ubuntu. Qualquer ano em breve agora:)

    
por WinEunuuchs2Unix 04.08.2017 / 05:30
0

Se você já leu discussões, provavelmente sabe que normalmente não é recomendável desativá-las, portanto, suponho que você as queira para fins de aprendizado.

A ideia do HT é ter múltiplos conjuntos de registradores da CPU para cada núcleo físico (os chamados núcleos virtuais) . Não existe um núcleo virtual "melhor", eles são idênticos. Armado com esse conhecimento, você pode desativar núcleos virtuais, exceto um para cada físico.

Primeiro, você quer saber qual par de núcleos virtuais pertence a qual núcleo físico no sistema de arquivos /sys/ . Você pode usar o arquivo core_id para isso:

λ grep "" /sys/devices/system/cpu/cpu*/topology/core_id
/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu1/topology/core_id:2
/sys/devices/system/cpu/cpu2/topology/core_id:0
/sys/devices/system/cpu/cpu3/topology/core_id:2

Da saída, você pode inferir que cpu0 + cpu2 estão contidos em um núcleo físico e cpu1 + cpu3 no outro. Agora, eleve os privilégios e use o comando echo para desativar um em cada par:

λ sudo -s
# echo 0 > /sys/devices/system/cpu/cpu1/online
# echo 0 > /sys/devices/system/cpu/cpu2/online

Note que cpu0 não tem arquivo "online" e não pode ser desativado, então eu desabilitei a cpu2.

    
por Hi-Angel 03.08.2017 / 23:47
0

Uma maneira um pouco mais robusta de procurar no kernel por pares de hyperthreads é necessária para sistemas em que a placa-mãe hospeda múltiplos soquetes de CPU porque o core_id é duplicado. Aqui está a minha versão em um sistema com dois chips Xeon de 8 núcleos (exemplo do Ubuntu 16.04):

$ cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list \
> | sort --unique --numeric-sort
0,16
1,17
2,18
3,19
4,20
5,21
6,22
7,23
8,24
9,25
10,26
11,27
12,28
13,29
14,30
15,31

Para vários propósitos, você também pode querer procurar nos arquivos

/sys/devices/system/cpu/present
/sys/devices/system/cpu/online
/sys/devices/system/cpu/offline
    
por 4dummies 12.11.2017 / 15:14
0

Aqui está um script para identificar os núcleos ht e alterná-los on-line / off-line.

#!/bin/bash
typeset -i core_id
typeset -i sibling_id
typeset -i state

for i in /sys/devices/system/cpu/cpu[0-9]*; do
  core_id="${i##*cpu}"
  sibling_id="-1"

  if [ -f ${i}/topology/thread_siblings_list ]; then
    sibling_id="$(cut -d',' -f1 ${i}/topology/thread_siblings_list)"
  fi

  if [ $core_id -ne $sibling_id ]; then
    state="$(<${i}/online)"
    echo -n "$((1-state))" > "${i}/online"
    echo "switched ${i}/online to $((1-state))"
  fi
done

@ WinEunuuchs2Unix , talvez você possa adicionar isso à sua excelente resposta.

    
por visit1985 14.02.2018 / 11:17