Linux: Pourquoi la fréquence du processeur fluctue-t-elle lors de l'utilisation du gouverneur de performances?

8

J'utilise une machine Debian 8 amd64 pour l'analyse comparative. Pendant l'expérimentation, j'aimerais que le CPU fonctionne à une fréquence fixe (de préférence le maximum possible). Cela exclut la vitesse d'horloge du processeur comme source de variation dans les résultats.

Après quelques lectures, il semble que la bonne chose à faire est de changer le gouverneur CPU performance, qui est décrit ici dans la documentation du noyau Linux :

La "performance" du gouverneur CPUfreq définit le CPU statiquement à la fréquence la plus élevée dans les limites de scaling_min_freq et scaling_max_freq.

Malheureusement, d'autres détails sur scaling_min_freqet scaling_max_freqne sont pas fournis. J'espère que cela ne devrait pas avoir d'importance, car la fréquence CPU utilisée est la valeur maximale de l'intervalle.

J'ai donc activé ce gouverneur en utilisant cpufreq-set:

$ cat / sys / devices / system / cpu / cpu * / cpufreq / scaling_governor
performance
performance
performance
performance

Et pour faire bonne mesure, j'ai également désactivé le mode turbo boost dans le bios:

$ cat / sys / devices / system / cpu / intel_pstate / no_turbo
1

Sur la base de la description ci-dessus du gouverneur de performances, je ne m'attendrais à aucune fluctuation de la vitesse d'horloge du processeur. Pourtant, si je cours à plusieurs reprises cpufreq-info, je vois la vitesse d'horloge fluctuer:

$ cpufreq-info | grep 'current CPU fr'
  la fréquence actuelle du processeur est de 4,00 GHz.
  la fréquence actuelle du processeur est de 3,99 GHz.
  la fréquence actuelle du processeur est de 4,00 GHz.
  la fréquence actuelle du processeur est de 4,00 GHz.
$ cpufreq-info | grep 'current CPU fr'
  la fréquence actuelle du processeur est de 4,00 GHz.
  la fréquence actuelle du processeur est de 4,00 GHz.
  la fréquence actuelle du processeur est de 4,00 GHz.
  la fréquence actuelle du processeur est de 3,96 GHz.
$ cpufreq-info | grep 'current CPU fr'
  la fréquence actuelle du processeur est de 4,00 GHz.
  la fréquence actuelle du processeur est de 4,00 GHz.
  la fréquence actuelle du processeur est de 4,00 GHz.
  la fréquence actuelle du processeur est de 3,94 GHz.
$ cpufreq-info | grep 'current CPU fr'
  la fréquence actuelle du processeur est de 4,01 GHz.
  la fréquence actuelle du processeur est de 4,00 GHz.
  la fréquence actuelle du processeur est de 4,00 GHz.
  la fréquence actuelle du processeur est de 3,98 GHz.

Cette fluctuation est-elle due au matériel, au BIOS, au noyau ou à un autre facteur? Existe-t-il un moyen de régler la fréquence du processeur de sorte qu'elle ne fluctue pas du tout?

Edd Barrett
la source
Quel type de matériel serveur utilisez-vous? Quels sont les paramètres d'alimentation du BIOS et de performances du processeur de ce matériel?
ewwhite
Il s'agit en fait d'une machine de bureau avec un processeur i7. J'ai téléchargé dmesg et cpuinfo ici: gist.github.com/vext01/73eea539eb041acf784b . Re: paramètres bios, je devrais aller à la machine et regarder. Y a-t-il un paramètre spécifique que vous avez en tête?
Edd Barrett du
Ce n'est pas "beaucoup" de fluctuation par rapport à une variation normale de l'état ... :)
rogerdpack

Réponses:

9

Après quelques expérimentations, je pense pouvoir répondre à ma propre question.

Comme mentionné dans ce fil , sur certains matériels Intel, il existe deux façons de gérer la fréquence du processeur:

  • Utilisation de pstate.
  • Utilisation de l'ACPI ordinaire.

Lorsque pstate est utilisé, le BIOS a son mot à dire sur la vitesse d'horloge, et il semble que ce soit la source des fluctuations.

Vous pouvez forcer la désactivation de pstate en ajoutant intel_pstate=disableaux arguments du noyau (éditez /etc/default/grubet ajoutez l'argument à GRUB_CMDLINE_LINUX_DEFAULT. Enfin exécutez sudo update-grub).

Après avoir fait cela, la sortie de cpufreq-infosemble très différente, et je remarque également qu'un ensemble différent de gouverneurs CPU devient disponible (par exemple ondemandest maintenant disponible).

Plus important encore, après avoir réglé le gouverneur sur performance, la vitesse d'horloge est maintenant fixée (dans mon cas, à 4,00 GHz).

Vous pouvez regarder /sys/devices/system/cpu/cpu*/cpufreq/scaling_driverpour déterminer si pstate ou ACPI est utilisé pour mettre à l'échelle le processeur. Ces fichiers peuvent prendre les valeurs acpi-cpufreqou intel_pstate.

Edd Barrett
la source
Autre astuce: utilisez ´lsmod´ pour lister les modules chargés par le noyau, mettez sur liste noire tous les modules liés à la mise à l'échelle de la vitesse CPU / p-état / c-états / quoi que ce soit et redémarrez la machine. Recherchez "blacklist kernel modules".
Rufo El Magufo
4

Pour les processeurs Intel contemporains, la fréquence est contrôlée par le processeur lui-même et les états P exposés aux logiciels sont liés aux niveaux de performance. L'idée que la fréquence peut être définie sur une seule fréquence est une fiction pour les processeurs Intel Core . Même si le pilote de mise à l'échelle sélectionne un seul état P, la fréquence réelle à laquelle le processeur fonctionnera est sélectionnée par le processeur lui-même. [1]

[1] https://www.kernel.org/doc/Documentation/cpu-freq/intel-pstate.txt

SaveTheRbtz
la source
Intéressant. Alors, cela s'applique-t-il quand je passe intel_pstate=disableau noyau? Suis-je invoquer le "mode hérité" quand je fais cela?
Edd Barrett
1) pas sûr. besoin de consulter Intel Architectures Software Developer's Manual.2) oui. PS. Vous pouvez également jouer avecx86_energy_perf_policy
SaveTheRbtz
Merci pour vos commentaires. Comme je ne suis toujours pas sûr, je laisse la question ouverte pour l'instant. Peut-être que quelqu'un fera la lumière sur la situation plus tard.
Edd Barrett du
-1

J'ai lu ce fil parce que je cherchais trop à définir une fréquence fixe pour mon processeur car le ventilateur ne fonctionne plus (bien sûr, ces choses se produisent lorsque vous êtes à l'étranger dans une île perdue pour les loisirs de plongée!), donc mon point était plus à régler la fréquence la plus basse (800Mhz) ..j'ai finalement réussi à changer le scaling_max_freq dans / sys / devices / system / cpu / cpu * / cpufreq / pour chaque cpu de la configuration et maintenant c'est bien la fréquence est supposée passer de 800Mhz à .... 800Mhz. Cela fonctionne et a résolu le problème de surchauffe que j'ai connu .. (la fréquence est maintenant de 799Mhz et ne bouge pas, ce qui a permis au processeur de rester autour de 50 ° C!)

PS: je désactive également le mode turbo (3,1Ghz)

steve.29
la source