Existe-t-il un moyen d'exécuter un programme C++ plus lentement en modifiant les paramètres du système d'exploitation sous Linux? De cette façon, je voudrais simuler ce qui se passera si ce programme particulier s'exécute sur une machine vraiment plus lente.
En d'autres termes, une machine plus rapide devrait se comporter comme une machine plus lente pour ce programme particulier.
Nice
(et/ou renice
). Vous pouvez également le faire par programme en utilisant Nice()
appel système. Cela ne ralentira pas la vitesse d'exécution en soi, mais obligera le planificateur Linux à allouer des délais d'exécution moins (et éventuellement plus courts), à préempter plus souvent, etc. Voir Planification des processus (Chapitre 10) de Comprendre le noyau Linux pour plus de détails sur la planification.cpufreq-set
commande.sched_yield()
, qui donnera du quantum à d'autres processus, dans les parties critiques de performance de votre programme (nécessite un changement de code).malloc()
, free()
, clock_gettime()
etc. en utilisant LD_PRELOAD , et faire des trucs idiotes comme en graver quelques-uns millions de cycles CPU avec rep; hop;
, insérez des barrières de mémoire, etc. Cela ralentira certainement le programme. (Voir cette réponse pour un exemple de la façon de faire certaines de ces choses).-O0
Et en activant les assertions (c'est-à-dire -DDEBUG
).J'espère que cela aide.
[~ # ~] qemu [~ # ~] est un émulateur de processeur pour Linux. Debian a des paquets pour cela (j'imagine que la plupart distros le feront). Vous pouvez exécuter un programme dans un émulateur et la plupart d'entre eux devraient prendre en charge le ralentissement des choses. Par exemple, Miroslav Novak a des correctifs pour ralentir QEMU.
Alternativement, vous pouvez effectuer une compilation croisée vers un autre CPU-linux (arm-none-gnueabi-linux, etc.), puis demander à QEMU de traduire ce code pour l'exécuter.
La suggestion Nice est simple et peut fonctionner si vous la combinez avec un autre processus qui consommera cpu.
Nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;
Vous n'avez pas dit si vous avez besoin de graphiques, de fichiers et/ou d'E/S réseau? Savez-vous quelque chose sur la classe erreur que vous recherchez? Est-ce une condition de concurrence ou le code fonctionne-t-il simplement mal sur le site d'un client?
Modifier: Vous pouvez également utiliser des signaux comme [~ # ~] arrêter [~ # ~] et [~ # ~] cont [~ # ~] pour démarrer et arrêter votre programme. Un débogueur peut également le faire. Le problème est que le code exécute un pleine vitesse puis est arrêté. La plupart des solutions avec le planificateur Linux auront ce problème. Il y avait une sorte d'analyseur de threads d'Intel afair. Je vois Notes de version Vtune . C'est Vtune, mais j'étais presque sûr qu'il existe un autre outil pour analyser les races de threads. Voir: Intel Thread Checker , qui peut vérifier certaines conditions de course des threads. Mais nous ne savons pas si l'application est multi-thread?
Utilisez cpulimit
:
Cpulimit est un outil qui limite l'utilisation CPU d'un processus (exprimé en pourcentage, pas en temps CPU). Il est utile de contrôler les travaux par lots, lorsque vous ne voulez pas qu'ils mangent trop de cycles CPU. L'objectif est d'empêcher un processus de s'exécuter pendant plus d'un rapport de temps spécifié. Il ne modifie pas la valeur Nice ou d'autres paramètres de priorité de planification, mais l'utilisation réelle du processeur . De plus, il est capable de s'adapter à la charge globale du système , dynamiquement et rapidement.
Le contrôle de la quantité de CPU utilisée se fait en envoyant des signaux SIGSTOP et SIGCONT POSIX aux processus.
Tous les processus enfants et les threads du processus spécifié partageront le même pourcentage de CPU.
C'est dans les dépôts Ubuntu. Juste
apt-get install cpulimit
Voici quelques exemples sur la façon de l'utiliser sur un programme déjà en cours d'exécution:
Limitez le processus 'bigloop' par le nom de l'exécutable à 40% du processeur:
cpulimit --exe bigloop --limit 40 cpulimit --exe /usr/local/bin/bigloop --limit 40
Limiter un processus par PID à 55% CPU:
cpulimit --pid 2960 --limit 55
Si vous voulez simplement simuler votre programme pour analyser son comportement sur une machine vraiment lente, vous pouvez essayer faire fonctionner votre programme entier en tant que thread
d'un autre programme principal.
De cette manière, vous pouvez hiérarchiser le même code avec des priorités différentes dans quelques threads à la fois et collecter les données de votre analyse. Je l'ai utilisé dans le développement de jeux pour l'analyse du traitement de trame.
Utilisez sommeil ou attendez à l'intérieur de votre code. Ce n'est pas la façon la plus brillante de le faire, mais acceptable dans tout type d'ordinateur avec des vitesses différentes.
La façon la plus simple de le faire serait d'envelopper votre code exécutable principal dans une boucle while avec un sommeil à la fin de celui-ci.
Par exemple:
void main()
{
while 1
{
// Logic
// ...
usleep(microseconds_to_sleep)
}
}
Comme les gens le mentionneront, ce n'est pas le moyen le plus précis, car votre code logique fonctionnera toujours à vitesse normale mais avec des retards entre les exécutions. En outre, cela suppose que votre code logique s'exécute en boucle.
Mais c'est à la fois simple et configurable.