Le processeur hôte ne met pas à l'échelle la fréquence lorsque l'invité KVM en a besoin

8

Observation:
J'ai un serveur HP avec un processeur dual core AMD (Turion II Neo N40L) qui peut mettre à l'échelle des fréquences de 800 à 1500 MHz. La mise à l'échelle des fréquences fonctionne sous FreeBSD 9 et sous Ubuntu 12.04 avec le noyau Linux 3.5. Cependant, lorsque je place FreeBSD 9 dans un environnement KVM au-dessus d'Ubuntu, la mise à l'échelle des fréquences ne fonctionne pas. L'invité (donc FreeBSD) ne détecte pas les fréquences minimales et maximales et ne modifie donc rien lorsque l'occupation du processeur augmente. Sur l'hôte (donc Ubuntu), le processus KVM utilise entre 80 et 140% des ressources CPU mais aucune mise à l'échelle de fréquence ne se produit, la fréquence reste à 800 MHz, bien que lorsque j'exécute tout autre processus sur la même boîte Ubuntu, le gouverneur à la demande rapidement adapte la fréquence à 1500 MHz!

Préoccupation et question:
je ne comprends pas comment le CPU est peut-être virtualisé, et s'il appartient à l'invité d'effectuer la mise à l'échelle appropriée. Faut-il que certaines fonctionnalités du processeur soient exposées à l'invité pour que cela fonctionne?

Annexe:
La note de publication suivante de Red Hat tend à suggérer que la mise à l'échelle de la fréquence fonctionne même dans un environnement virtualisé (voir les chapitres 6.2.2 et 6.2.3), pensant que la note ne traite pas de la technologie de virtualisation avec laquelle cela fonctionne (kvm, xen , etc.?)

Pour information, la cpufreq-infosortie sur Ubuntu est:

$ cpufreq-info
cpufrequtils 007: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to [email protected], please.
analyzing CPU 0:
  driver: powernow-k8
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 8.0 us.
  hardware limits: 800 MHz - 1.50 GHz
  available frequency steps: 1.50 GHz, 1.30 GHz, 1000 MHz, 800 MHz
  available cpufreq governors: conservative, ondemand, userspace, powersave, performance
  current policy: frequency should be within 800 MHz and 1.50 GHz.
                  The governor "ondemand" may decide which speed to use
                  within this range.
  current CPU frequency is 800 MHz.
  cpufreq stats: 1.50 GHz:14.79%, 1.30 GHz:1.07%, 1000 MHz:0.71%, 800 MHz:83.43%  (277433)
analyzing CPU 1:
  driver: powernow-k8
  CPUs which run at the same hardware frequency: 1
  CPUs which need to have their frequency coordinated by software: 1
  maximum transition latency: 8.0 us.
  hardware limits: 800 MHz - 1.50 GHz
  available frequency steps: 1.50 GHz, 1.30 GHz, 1000 MHz, 800 MHz
  available cpufreq governors: conservative, ondemand, userspace, powersave, performance
  current policy: frequency should be within 800 MHz and 1.50 GHz.
                  The governor "ondemand" may decide which speed to use
                  within this range.
  current CPU frequency is 800 MHz.
  cpufreq stats: 1.50 GHz:14.56%, 1.30 GHz:1.06%, 1000 MHz:0.79%, 800 MHz:83.59%  (384089)

La raison pour laquelle je veux que cette fonctionnalité fonctionne est: économiser de l'énergie, courir plus silencieusement (moins chaud) et aussi une simple curiosité pour mieux comprendre pourquoi cela ne fonctionne pas et comment le faire fonctionner.

Huygens
la source
1
Ce Microserver ne prend en charge que Windows et RHEL, voir les quickspecs.
exécuté cpufreq-infosur le système d'exploitation hôte, il se plaindra probablement qu'aucun pilote n'est disponible.
Chris S
Il prend officiellement en charge Windows et RHEL. Je ne veux pas dire que d'autres OS ne fonctionneront pas dessus. Notez que la mise à l'échelle du processeur fonctionne parfaitement sur Ubuntu et FreeBSD lorsqu'ils sont installés sur le métal nu (donc pas via la virtualisation). De plus, lorsqu'ils sont installés sur du métal nu, les deux systèmes d'exploitation fonctionnent parfaitement, aucun pilote manquant ou comportement étrange. Enfin, cpufreq-infone se plaint pas et génère des informations appropriées, de sorte que le processeur est entièrement pris en charge (bien sûr d'une certaine manière!). Le pilote utilisé est powernow-k8 qui est également logique.
Huygens
@ChrisS J'ai ajouté les informations cpufreq-info à la question d'origine.
Huygens
Si vous n'avez pas vraiment besoin de mise à l'échelle de fréquence, vous pouvez toujours la désactiver.
Michael Hampton

Réponses:

10

J'ai trouvé la solution grâce à l'astuce donnée par Nils et à un bel article .

Réglage du gouverneur DVFS CPU à la demande

Le régulateur à la demande dispose d'un ensemble de paramètres pour contrôler quand il déclenche la mise à l'échelle dynamique de la fréquence (ou DVFS pour la mise à l'échelle dynamique de la tension et de la fréquence). Ces paramètres sont situés sous l'arborescence sysfs:/sys/devices/system/cpu/cpufreq/ondemand/

L'un de ces paramètres est, up_thresholdcomme son nom l'indique, un seuil (l'unité est% du CPU, je n'ai pas trouvé si c'est par cœur ou cœurs fusionnés) au-dessus duquel le gouverneur à la demande entre en jeu et commence à changer dynamiquement la fréquence.

La changer à 50% (par exemple) en utilisant sudo est simple:
sudo bash -c "echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold"

Si vous êtes root, une commande encore plus simple est possible:
echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold

Remarque: ces modifications seront perdues après le prochain redémarrage de l'hôte. Vous devez les ajouter à un fichier de configuration qui est lu au démarrage, comme /etc/init.d/rc.localsur Ubuntu.

J'ai découvert que ma machine virtuelle invitée, bien que consommant beaucoup de CPU (80-140%) sur l'hôte, distribuait la charge sur les deux cœurs, donc aucun cœur ne dépassait 95%, donc le CPU, à mon exaspération, était restant à 800 MHz. Maintenant, avec le patch ci-dessus, le CPU change dynamiquement sa fréquence par cœur beaucoup plus rapidement, ce qui convient mieux à mes besoins, 50% semble un meilleur seuil pour mon utilisation en tant qu'invité, votre kilométrage peut varier.

Facultativement, vérifiez si vous utilisez HPET

Il est possible que certaines applications qui implémentent incorrectement des minuteries soient affectées par DVFS. Cela peut être un problème sur l'environnement hôte et / ou invité, bien que l'hôte puisse avoir un algorithme alambiqué pour essayer de minimiser cela. Cependant, les CPU modernes ont des TSC (Time Stamp Counter) plus récents qui sont indépendants de la fréquence CPU / core actuelle, ce sont: constant (constant_tsc), invariant (invariant_tsc) ou non-stop (nonstop_tsc), voir cet article Chromium sur la resynchronisation TSC pour plus d'informations sur chacun. Donc, si votre CPU est équipé d'un de ces TSC, vous n'avez pas besoin de forcer HPET. Pour vérifier si votre CPU hôte les prend en charge, utilisez une commande similaire (changez le paramètre grep en fonction CPU correspondante, ici nous testons la constante TSC):

$ grep constant_tsc /proc/cpuinfo

Si vous ne possédez pas l'un de ces TSC modernes, vous devez soit:

  1. HPET actif, cela est décrit ci-dessous;
  2. N'utilisez pas le CPU DVFS si vous avez des applications dans la machine virtuelle qui reposent sur un timing précis, qui est celui recommandé par Red Hat .

Une solution sûre consiste à activer les minuteurs HPET (voir ci-dessous pour plus de détails), ils sont plus lents à interroger que ceux TSC (TSC sont dans le CPU, contre HPET sont dans la carte mère) et peut-être pas précis (HPET> 10MHz; TSC souvent l’horloge maximale du processeur) mais ils sont beaucoup plus fiables, en particulier dans une configuration DVFS où chaque cœur peut avoir une fréquence différente. Linux est assez intelligent pour utiliser le meilleur temporisateur disponible, il s'appuiera d'abord sur le TSC, mais s'il est jugé trop peu fiable, il utilisera le HPET. Cela fonctionne bien sur les systèmes hôtes (bare metal), mais en raison du fait que toutes les informations ne sont pas correctement exportées par l'hyperviseur, il s'agit plus d'un défi pour la machine virtuelle invitée de détecter un TSC se comportant mal. L'astuce consiste alors à forcer l'utilisation de HPET dans l'invité, bien que vous ayez besoin de l'hyperviseur pour mettre cette source d'horloge à la disposition des invités!

Vous trouverez ci-dessous comment configurer et / ou activer HPET sous Linux et FreeBSD.

Configuration Linux HPET

HPET, ou minuterie d'événement de haute précision, est une minuterie matérielle que vous pouvez trouver dans la plupart des PC courants depuis 2005. Cette minuterie peut être utilisée efficacement par les systèmes d'exploitation modernes (le noyau Linux la prend en charge depuis 2.6, la prise en charge stable de FreeBSD depuis la dernière 9.x mais a été introduit en 6.3 ) pour fournir un timing cohérent invariablement à la gestion de l'alimentation du processeur. Il permet également de construire des implémentations de planificateur sans tick plus faciles .

Fondamentalement, HPET est comme une barrière de sécurité qui, même si l'hôte a DVFS actif, les événements de synchronisation hôte et invité seront moins affectés.

Il y a un bon article d'IBM concernant l'activation de HPET , il explique comment vérifier quel minuteur matériel votre noyau utilise et lesquels sont disponibles. Je fournis ici un bref résumé:

Vérification du ou des minuteurs matériels disponibles:
cat /sys/devices/system/clocksource/clocksource0/available_clocksource

Vérification de la minuterie active actuelle:
cat /sys/devices/system/clocksource/clocksource0/current_clocksource

Un moyen plus simple de forcer l'utilisation de HPET si vous l'avez disponible est de modifier votre chargeur de démarrage pour demander de l'activer (depuis le noyau 2.6.16). Cette configuration dépend de la distribution, veuillez donc vous référer à votre propre documentation de distribution pour la configurer correctement. Vous devez activer hpet=enableou clocksource=hpetsur la ligne de démarrage du noyau (cela dépend à nouveau de la version ou de la distribution du noyau, je n'ai trouvé aucune information cohérente).
Cela garantit que l'invité utilise la minuterie HPET.

Remarque: sur mon noyau 3.5, Linux semble prendre automatiquement le minuteur hpet.

Configuration HPET invité FreeBSD

Sur FreeBSD, on peut vérifier quels minuteurs sont disponibles en exécutant:
sysctl kern.timecounter.choice

La minuterie actuellement choisie peut être vérifiée avec:
sysctl kern.timecounter.hardware

FreeBSD 9.1 semble préférer automatiquement HPET à un autre fournisseur de minuterie.

Todo: comment forcer HPET sur FreeBSD.

Exportation HPET d'hyperviseur

KVM semble exporter HPET automatiquement lorsque l'hôte le prend en charge. Cependant, pour les invités Linux, ils préféreront l'autre horloge exportée automatiquement qui est kvm-clock (une version paravirtualisée de l'hôte TSC). Certaines personnes signalent des problèmes avec l'horloge préférée, votre kilométrage peut varier. Si vous souhaitez forcer HPET dans l'invité, reportez-vous à la section ci-dessus.

VirtualBox n'exporte pas l'horloge HPET vers l'invité par défaut, et il n'y a aucune option pour le faire dans l'interface graphique. Vous devez utiliser la ligne de commande et vous assurer que la machine virtuelle est hors tension. la commande est:

./VBoxManage modifyvm "VM NAME" --hpet on

Si l'invité continue de sélectionner une autre source que HPET après la modification ci-dessus, veuillez vous référer à la section ci-dessus pour forcer le noyau à utiliser l'horloge HPET comme source.

Huygens
la source
existe-t-il une véritable application pour cela, ou est-ce juste une astuce unique?
ewwhite
@ewwhite qu'entendez-vous par une astuce unique? La conclusion est que DVFS (mise à l'échelle dynamique de la tension et de la fréquence) fonctionne réellement avec KVM et un hôte Linux. L'utilisation du processeur de 80 à 140% était probablement répartie uniformément sur les deux cœurs, de sorte qu'aucun cœur n'atteignait le seuil par défaut de 95%, ce qui entraînerait une mise à l'échelle des fréquences. Sans rien changer, si je crée vraiment un processus à un seul thread qui utilise 100% d'un cœur dans la machine virtuelle, la mise à l'échelle de la fréquence est lancée, donc je ne le voyais tout simplement pas. Quant à l'application réelle de DVFS, il s'agit d'économiser de l'énergie et de diminuer la température.
Huygens
@ewwhite Voulez-vous dire "existe-t-il une application qui ajuste cette valeur pour moi?" Je pense que la réponse est non. Sinon, quelqu'un aurait déjà mis un défaut sensible . 95 n'est certainement pas raisonnable ici.
Michael Hampton
Non, existe-t-il une application (raison) pour vouloir l'utiliser dans une configuration virtualisée?
ewwhite
Raison: je ne veux pas que le CPU fonctionne à pleine vitesse pour plusieurs raisons: la consommation d'énergie est plus élevée, la température est plus élevée, s'use plus vite, les VENTILATEURS tournent plus vite (plus de puissance et d'usure plus rapide), nécessitent une batterie UPS plus grande.
Huygens
4

Ce n'est pas l'invité qui déclenche la montée en gamme - l'hôte doit le faire. Vous devez donc baisser le niveau de déclenchement correspondant sur l'hôte.

Nils
la source
Intéressant, sauriez-vous comment faire cela?
Huygens
@Huygens Normalement, cela se fait via une sorte de démon cpufrequency. Il y a un fichier de configuration pour ce démon où vous pouvez changer son comportement et ses valeurs de montée / descente. Je ne sais pas exactement où cela se trouve sur Ubuntu.
Nils
Vous l'avez résolu, par défaut (sur Ubuntu au moins) le seuil est de 95%, je ne sais pas si c'est par CPU. En l'abaissant à 50%, j'ai le comportement attendu! Sur Ubuntu, vous feriez cela comme ceci: sudo bash -c "echo 50 > /sys/devices/system/cpu/cpufreq/ondemand/up_threshold"Source: ivanlam.info/blog/2012/04/26/…
Huygens
1
@Huygens J'ai eu ce problème sur CentOS - le fichier de configuration pour cpuspeedse trouve dans / etc / sysconfig / cpuspeed pour rendre ce changement permanent. Dans mon cas, j'avais une VBox-VM avec un seul processeur (physiquement dual-core). J'ai dû abaisser le niveau à 45% pour obtenir l'effet haut de gamme dans la machine virtuelle.
Nils
2

sur l'hôte, un processeur kvm ressemble à un processus. Le mécanisme de mise à l'échelle ne surveille pas les processus, seulement la consommation globale de CPU.

et il est généralement recommandé de désactiver la mise à l'échelle / limitation / cpu lors de l'exécution de machines virtuelles

Dyasny
la source
Bizarrement, quand je fais le top sur l'hôte, je peux voir que la consommation globale du CPU est d'environ 80-130% (en gros, tous consommés par les processus kvm et ksm) mais pas la mise à l'échelle de fréquence. Lorsque j'exécute d'autres processus qui consomment des processeurs, le gouverneur à la demande intervient rapidement! La seule différence que je suppose est que le processus kvm utilise une technologie de virtualisation (AMD svm dans mon cas) qui pourrait empêcher le gouverneur de l'hôte de réagir. Et l'invité ne parvient pas à demander le matériel sous-jacent à l'échelle, je suppose, bien que sur du métal nu, cela ait fonctionné.
Huygens
Pourriez-vous vous référer à un article détaillant pourquoi la mise à l'échelle des fréquences n'est pas une meilleure pratique lors de l'exécution de machines virtuelles? Je suis curieux de comprendre pourquoi. Red Hat semble prendre en charge cela, voir le chapitre 6.2.4 (il y avait un problème dans une version antérieure à RHEL 5.3) access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/…
Huygens
Je n'ai pas d'articles à portée de main, mais réfléchissez à la finalité de la virtualisation et à son fonctionnement. Vous prévoyez d'utiliser une machine sous-utilisée en la chargeant avec des machines virtuelles. Les machines virtuelles doivent être stables et prévisibles. Pensez-vous qu'un ajustement de la fréquence du processeur sous les machines virtuelles vous y aidera? Et en parlant des meilleures pratiques, Ubuntu en tant qu'hôte virt n'est pas une bonne idée dans mon expérience
dyasny
Vous pouvez migrer des machines virtuelles entre différents hôtes, dont la fréquence varie parfois. Ce qui devrait être stable dans ce cas, ce sont les fonctionnalités exposées par le CPU de l'hôte, de sorte que si SSE4 est exposé et que votre application l'utilise, une fois que vous migrez vers un CPU qui ne le prend pas en charge, votre VM ne le fait pas crash. La mise à l'échelle des fréquences, qui est un facteur important pour atténuer la consommation d'énergie, ne devrait donc pas être un problème. Je l'ai googlé et je n'ai trouvé aucun article le mentionnant.
Huygens
1
Quant à la distribution, j'ai mentionné Ubuntu comme problématique car il l'est. Sur SF et sur d'autres sites, je continue de voir des gens signaler des problèmes liés à KVM que je n'arrive jamais à reproduire sur Fedora ou RHEL. N'hésitez pas à ne pas être d'accord, je ne continue pas ici une guerre de flammes.
dyasny