105 votes

Faire en sorte qu'un programme s'exécute 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 passerait si ce programme particulier était exécuté sur une machine réellement plus lente.

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

147voto

  • Réduire la priorité en utilisant nice (et/ou renice ). Vous pouvez également le faire de manière programmatique en utilisant nice() appel système. Cela ne ralentira pas la vitesse d'exécution en soi, mais fera en sorte que le planificateur de Linux alloue moins (et peut-être moins) de temps d'exécution, préempte plus souvent, etc. Voir Ordonnancement des processus (Chapitre 10) de Comprendre le noyau Linux pour plus de détails sur la programmation.
  • Vous pouvez augmenter la fréquence d'interruption du timer de charger davantage le noyau, ce qui ralentira tout. Cela nécessite une reconstruction du noyau.
  • Vous pouvez utiliser Mise à l'échelle de la fréquence du CPU (nécessite un module du noyau) et de contrôler (ralentir, accélérer) l'unité centrale en utilisant le mécanisme de contrôle de l'unité centrale. cpufreq-set comando.
  • Une autre possibilité est d'appeler sched_yield() qui donnera des quantum à d'autres processus, dans les parties de votre programme dont la performance est critique (nécessite une modification du code).
  • Vous pouvez accrocher des fonctions courantes comme malloc() , free() , clock_gettime() etc. en utilisant LD_PRELOAD et faire des choses stupides comme brûler quelques millions de cycles de CPU avec rep; hop; , insérer des barrières de mémoire, etc. Cela ralentira le programme à coup sûr. (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, la mémoire, etc.
  • Si vous voulez vraiment que votre programme soit lent, exécutez-le sous Valgrind (peut également vous aider à trouver certains problèmes dans votre application comme les fuites de mémoire, les mauvaises références de mémoire, etc).
  • Une certaine lenteur peut être obtenue en recompilant votre binaire avec des optimisations désactivées (i.e. -O0 et permettre les assertions (c'est-à-dire -DDEBUG ).
  • Vous pouvez toujours acheter un vieux PC ou un netbook bon marché (comme le Un ordinateur portable par enfant et n'oubliez pas d'en faire don à un enfant une fois que vous aurez terminé les tests) avec un processeur lent et exécutez votre programme.

J'espère que cela vous aidera.

37voto

artless noise Points 7110

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

Alternativement, vous pourriez faire une compilation croisée vers un autre CPU-linux (arm-none-gnueabi-linux, etc) et ensuite faire en sorte que QEMU traduise ce code pour le faire fonctionner.

El joli La suggestion est simple et peut fonctionner si vous la combinez avec un autre processus qui consommera du cpu.

nice -19 test &
while [ 1 ] ; do sha1sum /boot/vmlinuz*; done;

Vous n'avez pas dit si vous avez besoin d'E/S graphiques, de fichiers et/ou de réseau ? Savez-vous quelque chose sur les classe d'erreur que vous recherchez ? S'agit-il d'une condition de course, ou le code est-il simplement peu performant sur le site d'un client ?

Edit : Vous pouvez également utiliser des signaux tels que STOP y 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 utilisant le planificateur Linux auront ce problème. Il y avait une sorte d'analyseur de fil de discussion d'Intel afair. Je vois Notes de version de Vtune . C'est Vtune, mais je suis sûr qu'il existe un autre outil pour analyser les courses de filets. Voir : Intel Thread Checker qui peut vérifier certaines conditions de course de threads. Mais nous ne savons pas si l'application est multithreadée ?

23voto

Izkata Points 3634

Utilice cpulimit :

Cpulimit est un outil qui limite l'utilisation du CPU d'un processus. (exprimé en pourcentage, pas en temps CPU). Il est utile pour contrôler les travaux par lots, lorsque vous ne voulez pas qu'ils consomment trop de cycles CPU. L'objectif est d'empêcher un processus de fonctionner au-delà d'un ratio de temps spécifié. Il ne modifie pas la valeur de nice ou d'autres paramètres de priorité d'ordonnancement, mais l'utilisation réelle du CPU . De plus, il est capable de s'adapter à la charge globale du système de manière dynamique et rapide.

Le contrôle de la quantité de cpu utilisée se fait en envoyant les signaux POSIX SIGSTOP et SIGCONT aux processus.

Tous les processus enfants et les threads du processus spécifié partageront le même pourcentage de CPU.

Il est dans les dépôts Ubuntu. Il suffit de

apt-get install cpulimit

Voici quelques exemples sur la façon de l'utiliser sur un programme déjà en cours d'exécution :

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

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

Limiter un processus par PID à 55% du CPU :

cpulimit --pid 2960 --limit 55

13voto

Mikhail Points 3262
  1. Procurez-vous un vieil ordinateur
  2. Les packs d'hébergement VPS ont tendance à fonctionner lentement, à présenter de nombreuses interruptions et des latences très variables. Plus le prix est bas, plus le matériel est mauvais. Contrairement au matériel vraiment ancien, il y a de fortes chances qu'ils contiennent des jeux d'instructions (SSE4) que l'on ne trouve généralement pas sur le matériel ancien. Quoi qu'il en soit, si vous voulez un système qui marche lentement et se ferme souvent, un hôte VPS bon marché sera le démarrage le plus rapide.

3voto

Pervez Alam Points 534

Si vous souhaitez simplement simuler votre programme pour analyser son comportement sur une machine vraiment lente, vous pouvez essayer en faisant en sorte que l'ensemble de votre programme soit exécuté comme un 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 plusieurs threads à la fois et recueillir les données de votre analyse. J'ai utilisé cette méthode dans le développement de jeux pour l'analyse du traitement des images.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X