web-dev-qa-db-fra.com

Comment désactiver le sous-système perf dans le noyau Linux?

J'exécute quelques repères. Mon coureur de référence surveille le tampon dmesg entre les expériences, à la recherche de tout ce qui pourrait avoir un impact sur les performances. Aujourd'hui, il a jeté ceci:

 [2015-08-17 10:20:14 AVERTISSEMENT] dmesg semble avoir changé! La différence suit: 
 --- 2015-08-17 09:55:00 
 +++ 2015-08-17 10:20:14 
 @@ -825,3 +825,4 @@ 
 [3.802206] [drm] Activation des états RC6: RC6 activé, RC6p désactivé, RC6pp désactivé 
 [7.900533] r8169 0000: 06: 00.0 eth0: connexion 
 [7.900541] IPv6: ADDRCONF (NETDEV_CHANGE): eth0: le lien devient prêt 
 + [236832.221937] l'interruption perf a pris trop de temps (2504> 2500), abaissant kernel.perf_event_max_sample_rate à 50000 

Après quelques recherches, je sais maintenant que cela concerne un sous-système de profilage dans le noyau Linux appelé "perf". Je ne pense pas que nous en ayons besoin, donc je voudrais le désactiver complètement.

En cherchant à nouveau, je trouve que le sysctl perf_cpu_time_max_percent pourrait aider. Ici quelqu'un suggère de désactiver en le mettant à 0. Lire encore plus ici :

perf_cpu_time_max_percent:

Indique au noyau combien de temps CPU il doit être autorisé à utiliser pour gérer les événements d'échantillonnage de performances. Si le sous-système perf est informé que ses échantillons dépassent cette limite, il baissera sa fréquence d'échantillonnage pour tenter de réduire son utilisation du processeur.

Un échantillonnage de perf se produit dans les laboratoires nationaux de métrologie. Si ces échantillons prennent trop de temps à s'exécuter de manière inattendue, les NMI peuvent être empilés les uns à côté des autres à tel point que rien d'autre n'est autorisé à s'exécuter.

0: désactiver le mécanisme. Ne surveillez pas ou ne corrigez pas le taux d'échantillonnage des performances, quel que soit le temps CPU nécessaire.

1-100: tentative de limitation du taux d'échantillonnage de perf à ce pourcentage de CPU. Remarque: le noyau calcule une longueur "attendue" de chaque événement échantillon. 100 signifie ici 100% de cette longueur attendue. Même si ce paramètre est défini sur 100, vous pouvez toujours voir la limitation de l'échantillon si cette longueur est dépassée. Réglez sur 0 si vous ne vous souciez vraiment pas de la quantité de CPU consommée.

Cela me semble comme 0 signifie que la fréquence d'échantillonnage de profilage n'est plus vérifiée, mais le sous-système freq continue de fonctionner (?).

Quelqu'un peut-il nous expliquer comment désactiver complètement le profilage du noyau avec freq?

EDIT: Quelqu'un m'a suggéré d'essayer de construire un noyau sans perf, mais je ne pense pas que ce soit même possible. L'option ne semble pas commutable:

menuconfig

EDIT2: Après plus de lecture, j'ai décidé que je pourrais être en mesure de définir kernel.perf_event_max_sample_rate à zéro. C'est à dire. aucun échantillon par seconde. Cependant, vous ne pouvez pas faire cela non plus ( source ):

 commit 02f98e3e36da106338b7c732fed516420fb20e2a 
 Auteur: Knut Petersen 
 Date: mer. 25 sept. 14:29:37 2013 +0200 
 
 perf: appliquer 1 comme inférieur limite pour perf_event_max_sample_rate 

EDIT 3: FWIW, perf_cpu_time_max_percent est réglé sur 25, ce qui signifie que le noyau passait plus de 25% de son temps à échantillonner les registres matériels. Ceci est inacceptable pour une machine d'analyse comparative.

Je suis maintenant certain que le paramètre perf_cpu_time_max_percent à zéro ne ferait qu'aggraver la situation, puisque le noyau continuerait à utiliser plus de 25% de son temps à lire les registres matériels. L'erreur se déclenche pour ajuster la fréquence d'échantillonnage, essayant ainsi de s'assurer que le noyau respecte son quota d'utilisation <25% de son temps en perf. 25% est encore trop élevé à mon humble avis.

Si je ne peux vraiment pas désactiver la perf, le meilleur compromis serait probablement de définir perf_event_max_sample_rate à 1.

EDIT4: Un ami a suggéré que j'avais peut-être mal interprété le sens de perf_cpu_time_max_percent, les instructions ci-dessus peuvent donc être incorrectes. Une valeur de 25 indique que le noyau a utilisé plus de 25% d'une longueur arbitraire qu'il avait réservée pour l'entretien des interruptions de perf.

EDIT5:

Comme indiqué dans les commentaires, le -*- contre l'option perf suggère que la fonctionnalité est forcée par une autre fonctionnalité activée. Si je regarde dans help, il indique quelles sont les fonctionnalités suivantes:

help

Je ne pense pas pouvoir gagner ici. La formule booléenne selected by dit

Si vous ciblez X86, ou ...

Je viens de vérifier que le ciblage de X86_64 permet effectivement CONFIG_X86. Il semble donc que dès que vous ciblez X86 ou X86_64, vous obtenez la perf.

Je voudrais donc modifier légèrement ma question en:

Quels paramètres de perf puis-je utiliser pour minimiser le temps passé par le noyau dans les routines de perf?

Gardez à l'esprit que l'objectif global est de contrôler les sources de variation aléatoire pour l'analyse comparative. Si je ne peux pas désactiver la perf, comment puis-je minimiser son impact sur les benchmarks?

15
Edd Barrett

Désactivez l'option de noyau [HAVE_PERF_EVENTS] et recompilez le noyau Linux.

2
John Greene