Je cherche un moyen d'obtenir une mesure de temps cohérente (<1% de différence entre les différentes exécutions) pour mon programme sous Ubuntu 14.04. perf stat
montre que je reçois encore pas mal de changements de contexte bien que mon programme ne donne jamais le contrôle au système d'exploitation (pas d'E/S, pas d'allocation de mémoire, etc.). Je lance le programme en utilisant Sudo Nice -n -20
sur un processeur blindé (mon Intel i7 CPU
a quatre cœurs physiques, l'hyper-threading est désactivé dans le BIOS) avec -k on
basculer vers cset shield
.
Je comprends que les processus du noyau inamovibles sont la source des changements de contexte. Donc, ma question est: existe-t-il un moyen de configurer le blindage au démarrage, afin que ces processus inamovibles s'exécutent sur les CPU non blindés pour commencer? Dans le cas où la réponse est "non", existe-t-il une autre façon d'obtenir un environnement pur pour mon processus critique sous Ubuntu?
Jetez un œil au package schedtool. Il offre des fonctionnalités de verrouillage du processeur et un choix de planificateurs de processeur à l'utilisateur.
Inquiet de l'interface graphique affectant les choses? Depuis un terminal virtuel, tuez X et voyez. Probablement avec un processeur i7, il y a suffisamment de cœurs pour que cela ne soit pas pertinent. Tout est une question de contrôle des ressources partagées, le CPU n'étant qu'une de ces ressources. Certaines ressources sont si nombreuses qu'il est difficile de se rappeler qu'elles sont partagées, comme la mémoire. Plus vous vous assurez que votre "processus critique" n'est pas retardé par quoi que ce soit d'autre, pire votre système d'exploitation Linux à usage général se comportera du point de vue de l'interaction avec l'utilisateur.
Je vais coller mon cou ici et dire que ce n'est pas possible sur Linux en général.
Dans les systèmes SMP, un planificateur s'exécute sur chaque cœur, c'est pourquoi vous obtenez toujours des changements de contexte. Si votre application est vraiment critique, vous devriez peut-être utiliser une sorte de RTOS, plutôt que Linux.
Lorsque je veux exécuter pour exécuter des expériences comparables, je: verrouille les fréquences d'horloge du processeur ou le gouverneur, afin d'éviter d'éventuelles différences de réponse; Forcer l'exécution de la tâche sur un processeur spécifique (s'il n'est pas multithread); Si des E/S de disque sont impliquées ou toute autre source de mise en cache, videz le cache mémoire entre les exécutions pour une comparaison équitable.
Pour mes expériences qui ont toujours été assez bonnes, mais peut-être pas pour les vôtres. Je modifierai cela avec plus de détails si vous le souhaitez.
Edit: j'ai oublié de mentionner, et très important. J'utilise uniquement l'édition serveur Ubuntu pour ce type de travail. Les ordinateurs de bureau ont beaucoup d'autres choses en cours d'exécution. et donc un ordinateur par ailleurs "inactif" est vraiment loin d'être inactif. Sur un serveur inactif, il n'y a que la tâche cron occasionnelle, qui peut gâcher et gâche cette exécution de l'expérience.
Par exemple, j'ai exécuté 262 exécutions d'un programme qui prend en moyenne 5,6217 secondes pour s'exécuter. L'écart type de durée d'exécution était de 0,0119 seconde et les cas les plus graves dans l'ensemble étaient de + 0,68% et -0,56%. J'ai forcé le CPU 7 et le mode de performance forcé (mais notez que même en mode performance, les processeurs Intel i7 peuvent réduire la fréquence d'horloge par eux-mêmes.)
De plus, si je désactive le gouverneur de fréquence intel_pstate et utilise celui acpi_cpufreq en mode "powersave", verrouillant fondamentalement les CPU à l'état pst minimum (fréquence la plus basse), alors j'obtiens environ +/- 0,01% de variations de temps d'exécution sur un temps d'exécution moyen de 13,22 secondes.
Je ne sais pas ce que vous entendez par processeurs non blindés, mais la façon d'affecter n'importe quel processus à un processeur consiste à utiliser ensemble de tâches. Vous pouvez même l'utiliser sur des modules du noyau pour forcer une politique NUMA brute.