web-dev-qa-db-fra.com

Faire fonctionner un programme lentement

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.

102
RoboAlex
  • Réduisez la priorité en utilisant 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.
  • Vous voudrez peut-être augmenter la fréquence d'interruption de la minuterie pour mettre plus de charge sur le noyau, ce qui à son tour ralentira tout. Cela nécessite une reconstruction du noyau.
  • Vous pouvez utiliser Mise à l'échelle de la fréquence du processeur mécanisme (nécessite le module du noyau) et contrôler (ralentir, accélérer) le CPU en utilisant le cpufreq-set commande.
  • Une autre possibilité est d'appeler sched_yield() , qui donnera du quantum à d'autres processus, dans les parties critiques de performance de votre programme (nécessite un changement de code).
  • Vous pouvez accrocher des fonctions courantes comme 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).
  • Comme @Bill l'a mentionné, vous pouvez toujours exécuter Linux dans un logiciel de virtualisation qui vous permet de limiter la quantité de ressources CPU allouées, de mémoire, etc.
  • Si vous voulez vraiment que votre programme soit lent, exécutez-le sous Valgrind (peut également vous aider à trouver des problèmes dans votre application comme des fuites de mémoire, de mauvaises références de mémoire, etc.).
  • Une certaine lenteur peut être obtenue en recompilant votre binaire avec des optimisations désactivées (c'est-à-dire -O0 Et en activant les assertions (c'est-à-dire -DDEBUG).
  • Vous pouvez toujours acheter un ancien PC ou un netbook bon marché (comme n ordinateur portable par enfant , et n'oubliez pas de le donner à un enfant une fois que vous avez terminé les tests) avec un processeur lent et exécutez votre programme .

J'espère que cela aide.

144
user405725

[~ # ~] 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?

36
artless noise

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
19
Izkata
  1. Obtenez un vieil ordinateur
  2. Les packages d'hébergement VPS ont tendance à s'exécuter lentement, ont de nombreuses interruptions et des latences très variables. Moins vous irez, pire sera le matériel. Contrairement au matériel vraiment ancien, il y a de fortes chances qu'ils contiennent des jeux d'instructions (SSE4) qui ne se trouvent généralement pas sur le vieux matériel. Néanmoins, si vous voulez un système qui marche lentement et qui se ferme souvent, un hôte VPS bon marché sera le démarrage le plus rapide.
13
Mikhail

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.

3
Pervez Alam

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.

2
Alper

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.

2
Kalail