web-dev-qa-db-fra.com

Pourquoi la désactivation de l'hyperthreading a-t-elle ralentissé mon serveur?

J'ai un serveur qui exécute principalement un Ruby==. Parce Ruby (2.7) a un gil, il est uniforme.

Mon ordinateur (serveur) possède un processeur Intel I3 Dual Core, mais en raison de l'hyperthreading, je vois 4 cœurs. Ruby== Utilise uniquement 25% de processeur sous charge lourde. Je voulais voir si la désactivation de l'hyperthreading bénéficie d'un langage de programmation qui fonctionne sur un seul thread.

En outre, mon serveur exécute un environnement de bureau très minimal et n'utilise pas plus de 2% de processeur. Je voulais donc faire la plupart des ressources disponibles pour Ruby. J'ai fait une référence pour voir si je reçois vraiment une amélioration de la performance en désactivant l'hyperthreading.


Référence:

J'ai écrit un simple Ruby script qui exécute une boucle de temps et ajoute une valeur du compteur de boucle avec une autre variable. Ce programme doit utiliser 100% d'un noyau CPU:

#!/usr/bin/env Ruby
$-v = true

LOOPS = ENV['N'].to_i.then { |x| x < 1 ? 100_000_000 : x } + 1
i, j, t = 0, 0, Time.now

puts "Counting till #{LOOPS - 1} and adding values to V..."
while (i += 1) < LOOPS
    if i % 10000 == 0
        e = Time.now - t
        r = LOOPS.*(e)./(i).-(e).round(2)
        print "\e[2KN: #{i} | Done: #{i.*(100) / LOOPS}% | Elapsed: #{e.round(2)}s | Estimated Rem: #{r}s\r"
    end

    j += i
end

puts "\nV = #{j}\nTime: #{(Time.now).-(t).round(2)}s"
  • Avec hyperthreading:
⮚ Ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.55s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.55s

⮚ Ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.54s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.54s

⮚ Ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.67s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.67s

GNOME-SYSTEM-Monitor signalé 25% d'utilisation de la CPU par Ruby tandis que le test était en cours d'exécution.

  • Sans hyperthreading:

[# echo 0 | tee /sys/devices/system/cpu/cpu{2,3}/online utilisé pour désactiver les hyperthreads]

⮚ Ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.72s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.72s

⮚ Ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.54s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.54s

⮚ Ruby p.rb
Counting till 100000000 and adding values to V...
N: 100000000 | Done: 99% | Elapsed: 4.56s | Estimated Rem: 0.0s
V = 5000000050000000
Time: 4.56s

GNOME-SYSTEM-Monitor signalé 50% d'utilisation de la CPU par Ruby tandis que le test était en cours d'exécution.


J'ai même couru le test sur mon ordinateur portable, qui prend environ deux fois le temps qu'il a fallu sur mon ordinateur. Mais le résultat est identique: la désactivation de l'hyperthreading n'aide pas le processus à faire mieux. Et encore pire, mon ordinateur portable devient un peu plus lent lorsqu'il est multitâche.

Donc, dans le mode non hyperthreading, Ruby a utilisé 2x la puissance de la CPU par rapport au mode hyperthreed. Mais pourquoi a-t-il toujours pris la même quantité de temps pour compléter la même tâche?

14
S.Goswami

Votre Ruby Le programme a fait non Utilisez 2x le temps de la CPU lorsqu'il est en cours d'exécution avec HT désactivé. Plutôt, car il maximise un noyau sur deux cœurs totaux, gnome-system-monitor signalera l'utilisation de 50%. Si, grâce à HT, le système rapporte quatre cœurs totaux, un noyau sur quatre serait de 25%.

La désactivation de HT a fait plus de variation de vos résultats car moins de ressources étaient disponibles: les cœurs Intel (ou AMD) récents sont assez larges, de sorte que des threads supplémentaires sont souvent utiles pour extraire 10 à 20% de performances globales. Si un processus d'arrière-plan a été automatiquement exécuté pendant les essais, le système sans HT est enclin à plus de variance et de débit total inférieur.

46
shodanshok

Je voulais voir si la désactivation hyperthreading bénéficie d'un langage de programmation qui fonctionne sur un seul fil.

Je ne sais pas comment couper le nombre de cœurs améliorerait les performances, même pour une seule application filetée. Lorsque HyperThreading est activé, votre CPU fonctionne avec 4 noyaux virtuels. Une seule application filetée utilisant toute la CPU, elle peut utiliser 25% de la CPU disponible. Lorsque vous avez désactivé HyperThreading, vous avez pris le nombre de noyaux jusqu'à 2. Maintenant que cette application filetée unique peut utiliser 50% de la CPU disponible.

Ruby n'utilise pas la CPU 2x, c'est que vous avez 1/2 la CPU disponible lorsque vous désactivez HyperThreading. Si vous avez une grande tasse 1/4 plein d'eau et versez-la dans une coupe plus petite qui devient 1/2 pleine d'eau, vous avez toujours la même quantité d'eau.

J'ai même couru le test sur mon ordinateur portable, qui prend environ deux fois le temps qu'il a fallu sur mon ordinateur. Mais le résultat est identique: la désactivation de l'hyperthreading n'aide pas le processus à faire mieux. Et encore pire, mon ordinateur portable devient un peu plus lent lorsqu'il est multitâche.

Oui, vous emportez environ 1/2 le pouvoir de votre CPU. Qui peut faire le Ruby exécuté plus lentement. Disons que vous disposiez de 3 threads qui veulent être exécutés en même temps en plus de votre Ruby Thread. Si Vous avez coupé les noyaux virtuels jusqu'à 2, il est plus probable que votre Ruby thread sera en pause au moins un peu pour laisser un autre thread a une heure de diffusion.

3
Jason Goemaat