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 vraie machine plus lente.

En d'autres termes, une machine plus rapide devrait se comporter comme une machine plus lente pour ce programme particulier.

102
demandé sur John Roberts 2013-01-17 06:28:13

7 réponses

  • réduire la priorité à l'aide de 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 fera en sorte que Linux scheduler alloue moins de délais d'exécution (et peut-être plus courts), prévient 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 minuterie la fréquence d'interruption pour mettre plus de charge sur le noyau, ce qui devrait ralentir. 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ôle (ralentir, accélérer) le CPU en utilisant le cpufreq-set commande.
  • une autre possibilité est d'appeler sched_yield(), ce qui donnera quantum à d'autres processus, dans les parties critiques de performance de votre programme (nécessite du code changement).
  • Vous pouvez accrocher des fonctions communes comme malloc(), free(), clock_gettime() etc. en utilisant LD_PRELOAD , et faites des trucs stupides comme graver quelques millions de cycles CPU avec rep; hop;, insérer des barrières de mémoire, etc. Cela va ralentir le programme à coup sûr. (Voir cette réponse pour un exemple de comment 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 enable assertions (c'est-à-dire -DDEBUG).
  • Vous pouvez toujours acheter un vieux PC ou un netbook bon marché (comme un ordinateur portable par enfant , et n'oubliez pas de le donner à un enfant une fois que vous sont fait tester) avec un processeur lent et exécutez votre programme.

J'espère que ça aide.

144
répondu Community 2017-05-23 10:29:39

QEMU est un émulateur de PROCESSEUR pour Linux. Debian a des paquets pour cela (j'imagine que la plupart des distributions le feront). Vous pouvez exécuter un programme dans un émulateur et la plupart d'entre eux devraient soutenir ralentir les choses. Par exemple, Miroslav Novak a des correctifs pour ralentir QEMU.

Alternativement, vous pouvez croiser la compilation vers un autre CPU-linux (arm-none-gnueabi-linux, etc.) et ensuite demander à QEMU de traduire ce code pour l'exécuter.

La suggestionnice est simple et peut travaillez si vous le 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 à propos de la classe d'erreur que vous recherchez? Est-ce une condition de concurrence, ou le code fonctionne-t-il mal sur un site client?

Edit: Vous pouvez aussi utiliser des signaux tels que 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 toute vitesse, puis s'arrête. 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 de Vtune . C'est Vtune, mais j'étais sûr qu'il existe un autre outil pour analyser les courses de threads. voir: Intel thread Checker , qui peut vérifier certaines conditions de course de threads. Mais nous ne savons pas si l'application est multi-thread?

36
répondu artless noise 2013-04-04 02:02:48

Utiliser cpulimit:

Cpulimit est un outil qui limite L'utilisation du processeur 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 change pas la valeur de nice ou d'autres paramètres de priorité de planification, mais l'utilisation réelle du processeur . En outre, il est capable de s'adapter à l'ensemble charge du système , dynamiquement et rapidement.

Le contrôle de la quantité de cpu utilisée est effectué en envoyant des signaux SIGSTOP et SIGCONT POSIX aux processus.

Tous les processus enfants et 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 dans un programme en cours d'exécution:

Limite le processus 'bigloop' par nom d'exécutable à 40% CPU:

cpulimit --exe bigloop --limit 40
cpulimit --exe /usr/local/bin/bigloop --limit 40 

Limite un processus par PID à 55% CPU:

cpulimit --pid 2960 --limit 55
19
répondu Izkata 2013-01-17 19:21:05
  1. Obtenir un ancien ordinateur
  2. les paquets d'hébergement VPS ont tendance à fonctionner lentement, à avoir beaucoup d'interruptions et à varier considérablement les latences. Le moins cher que vous allez le pire du matériel sera. Contrairement au matériel vraiment ancien, il y a de bonnes chances qu'ils contiennent des ensembles d'instructions (SSE4) qui ne sont généralement pas trouvés sur l'ancien matériel. Neverless, si vous voulez un système qui marche lentement et volets souvent, un hôte VPS pas cher sera le démarrage le plus rapide.
13
répondu Mikhail 2013-01-18 04:39:12

Si vous voulez juste simuler votre programme pour analyser son comportement sur une machine vraiment lente, vous pouvez essayer de faire fonctionner l'ensemble de votre programme en tant que thread d'un autre programme principal.

De cette manière, vous pouvez prioriser le même code avec des priorités différentes dans quelques threads à la fois et collecter des données de votre analyse. Je l'ai utilisé dans le développement de jeux pour l'analyse de traitement de trame.

3
répondu Pervez Alam 2013-01-24 03:29:42

Utilisez sleep ou wait à 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
répondu Thats how we roll 2013-01-17 03:54:22

Le moyen le plus simple de le faire serait d'envelopper votre code runable principal dans une boucle while avec un sleep à 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, puisque votre code logique fonctionnera toujours à la vitesse normale mais avec des retards entre les exécutions. En outre, il suppose que votre code logique est quelque chose qui s'exécute en boucle.

Mais c'est à la fois simple et configurable.

2
répondu Kalail 2013-03-10 06:03:07