beaucoup de time passé dans intel_idle

Au moment de l'écriture, htop montre deux kernelx à environ 50% chacun dans les threads du kernel (barres rouges). De bottes précédentes, je sais, que cela va augmenter à 3 et même 4 cœurs à 50% chacun au fil du time. Aucun fil que htop montre a une utilisation de cpu au-dessus de 1%. C'est un peu étrange n'est-ce pas?

J'ai essayé de l'étudier plus loin et en utilisant perf record -a tant que root j'ai trouvé que 11,3% de tous les échantillons étaient dans un thread kernel de la command swapper dans la fonction intel_idle .

Je suppose que cette command de swapper correspond à l'étrange occupation de processeur que je vois dans htop, mais quelqu'un peut-il m'expliquer certaines des questions suivantes:

  • qu'est-ce qui a causé cela? Est-ce un bug ou quelque chose avec mes parameters?
  • cela a-t-il un impact sur la performance globale de mon système?
  • Comment puis-je le débarrasser de ça?

quelques détails supplémentaires sur mon système:

 $ uname -a Linux [...] 4.8.0-0.rc2.git2.2.fc26.x86_64 #1 SMP Wed Aug 17 22:16:04 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux $ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 8 On-line CPU(s) list: 0-7 Thread(s) per core: 2 Core(s) per socket: 4 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 94 Model name: Intel(R) Core(TM) i7-6700K CPU @ 4.00GHz Stepping: 3 CPU MHz: 799.804 CPU max MHz: 4200.0000 CPU min MHz: 800.0000 BogoMIPS: 8016.00 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 8192K NUMA node0 CPU(s): 0-7 Flags: [...] 

mise à jour: sous le chargement, le comportement est un peu différent. (notez d'abord que je suis maintenant à trois cœurs à 50% chacun et perf rapportera 27% à l'intérieur de intel_idle ) Je mets mon cpu sous contrainte avec sysbench --test=cpu --num-threads=8 --max-requests=1000000 run et vérifié à nouveau htop et perf . Htop a rapporté 3 cœurs à 100% dans le kernel (les mêmes cœurs qui montrent à 50% au ralenti) et 5 à 100% de l'user. Perf a rapporté que sysbench occupait 85% de mon cpu et n'explique pas les 15% restants … Je ne suis pas sûr de ce que cela signifie. Mon processeur est-il réduit à 85%?

Cette réponse est surtout spéculative, car je ne connais rien à la gestion de l'alimentation des processeurs Intel et je n'ai pas regardé le code Linux, mais je pense que c'est plausible.

Je pense que l'explication de derobert sur la gestion de l'énergie est ce qui se passe. La gestion de l'alimentation est un compromis entre la consommation d'énergie et la performance. Lorsque le processeur n'est pas utilisé à 100% de ses performances maximales, il est avantageux de réduire sa fréquence, ce qui le rend plus lent mais plus frais.

Linux fait varier la fréquence du processeur au fil du time. Comment cela est contrôlé par des politiques appelées gouverneurs . L'idée générale est que lorsque le système n'a pas utilisé le processeur à sa pleine performance pendant un certain time, il réduit la fréquence du processeur. Inversement, si le CPU est occupé en permanence pendant un certain time, le kernel augmente la fréquence.

Voir intel_idle programmé signifie que le kernel n'effectue pas de code, mais en fait dans un mode "suspendu" où il consum peu de puissance. Cela permet de réaliser des économies d'énergie plus importantes que la simple réduction de la fréquence, mais à un coût plus élevé: bien que le processeur se réveille en cas d' interruption , cela prend du time (des dizaines de microsecondes?).

Il est tout à fait normal de voir intel_idle lorsque vous intel_idle pas entièrement tous vos cœurs. Cela économise beaucoup de puissance (à la fois pour le processeur lui-même et pour les appareils de refroidissement) par rapport à avoir le processeur à pleine vitesse tout le time. La seule raison pour laquelle vous pourriez avoir à désactiver ce mécanisme est si vous avez besoin d'une très faible latence . Si vous exécutez une application gourmande en intel_idle processeur, vous verrez de less en less intel_idle . L'utilisation du mode CPU inactif ne coûte pas de performance, sauf pendant la période de transition où le kernel n'a pas encore entièrement décidé que le système a besoin de beaucoup de puissance CPU.

Si vous intel_idle complètement vos cœurs, vous atteindrez 0% intel_idle . Notez qu'il peut être difficile de saturer tous les cœurs (même si un benchmark spécialement conçu peut le faire) puisque tout le code et datatables en cours d'exécution ne rentrent pas dans le cache du CPU, le facteur limitant sera la vitesse d'access RAM . "Tout le code et datatables" comprend tout ce qui fonctionne sur la machine, y compris votre interface user; en pratique, saturer tous les cœurs est rare.