Lassen Sie ein Programm langsam laufen

102

Gibt es eine Möglichkeit, ein C ++ - Programm langsamer auszuführen, indem Betriebssystemparameter unter Linux geändert werden? Auf diese Weise möchte ich simulieren, was passieren wird, wenn dieses bestimmte Programm auf einem wirklich langsameren Computer ausgeführt wird.

Mit anderen Worten, eine schnellere Maschine sollte sich für dieses bestimmte Programm wie eine langsamere Maschine verhalten.

RoboAlex
quelle
5
Sie könnten "nett" verwenden, um ihm eine wirklich niedrige Priorität zu geben - keine definitive Sache, aber kann helfen!
John3136
7
Führen Sie es in einem VM mit einem anderen Programm aus, das den Prozessor dreht.
Thang
12
niceist ein Befehl, der die Planungspriorität senkt. Variieren Sie alt, relativ grob. Sie könnten sich die Planungsprioritäten ansehen, aber wenn der Computer nicht mit anderen Aufgaben beschäftigt ist, läuft Ihr Programm immer noch schnell. Es wird also wahrscheinlich nicht ausreichend helfen.
Jonathan Leffler
9
Sie müssen bedenken, dass auf Computern jederzeit viele Prozesse ausgeführt werden. Daher ist es nicht besonders hilfreich, wenn nur Ihre App langsamer ausgeführt wird. Wenn Sie sehen möchten, wie sich Ihre App auf beschissener Hardware verhält, sollten Sie diese beschissene Hardware besorgen oder die BIOS-Einstellungen Ihrer Hardware vorübergehend ändern, um sie beschissen zu machen. Mit einigen BIOS können Sie zusätzliche Kerne deaktivieren und die CPU herunterfahren.
Mike Trusov
23
Drücken Sie die "Turbo" -Taste!
SoftDev

Antworten:

145
  • Verringern Sie die Priorität mit nice(und / oder renice). Sie können dies auch programmgesteuert mithilfe eines nice()Systemaufrufs tun . Dies verlangsamt nicht die Ausführungsgeschwindigkeit an sich, führt jedoch dazu, dass der Linux-Scheduler weniger (und möglicherweise kürzere) Ausführungszeiträume zuweist, häufiger vorbeugt usw. Siehe Prozessplanung (Kapitel 10) unter Grundlegendes zum Linux-Kernel Weitere Informationen zum Scheduling finden .
  • Möglicherweise möchten Sie die Timer-Interrupt-Frequenz erhöhen , um den Kernel stärker zu belasten, was wiederum alles verlangsamt. Dies erfordert eine Kernel-Neuerstellung.
  • Sie können den CPU-Frequenzskalierungsmechanismus (erfordert ein Kernelmodul) verwenden und die CPU mit dem cpufreq-setBefehl steuern (verlangsamen, beschleunigen) .
  • Eine andere Möglichkeit besteht darin sched_yield(), leistungskritische Teile Ihres Programms aufzurufen , wodurch andere Prozesse quantifiziert werden (Codeänderung erforderlich).
  • Sie können häufig verwendete Funktionen Haken wie malloc(), free(), clock_gettime()usw. mit LD_PRELOAD und einige dumme Dinge tun wie mit ein paar Millionen CPU - Zyklen brennen rep; hop;, einfügen Speicherbarrieren usw. Dadurch wird das Programm sicher verlangsamen. (In dieser Antwort finden Sie ein Beispiel, wie Sie einige dieser Dinge tun können.)
  • Wie bereits erwähnt, können Sie Linux jederzeit in einer Virtualisierungssoftware ausführen, mit der Sie die Menge der zugewiesenen CPU-Ressourcen, des Speichers usw. begrenzen können.
  • Wenn Sie wirklich möchten, dass Ihr Programm langsam ist, führen Sie es unter Valgrind aus (kann Ihnen auch dabei helfen, einige Probleme in Ihrer Anwendung zu finden, z. B. Speicherlecks, fehlerhafte Speicherreferenzen usw.).
  • Eine gewisse Langsamkeit kann erreicht werden, indem Sie Ihre Binärdatei mit deaktivierten Optimierungen neu kompilieren (dh -O0Zusicherungen aktivieren (dh -DDEBUG).
  • Sie können jederzeit einen alten PC oder ein billiges Netbook (wie einen Laptop pro Kind , und vergessen Sie nicht, es einem Kind zu spenden, wenn Sie mit dem Testen fertig sind) mit einer langsamen CPU kaufen und Ihr Programm ausführen.

Ich hoffe es hilft.

Gemeinschaft
quelle
15
+1: abwechslungsreiche Vorschläge, einschließlich grundlegender Anforderungen für jeden
lxop
4
Debugging-Symbole aktivieren (-ggdb3 ) nicht nicht verlangsamt die Ausführung des Binärcodes nach unten. Es macht es nur größer.
Café
11
+1 esp. Für "... kaufe einen alten PC oder ein billiges Netbook ... und vergiss nicht, es einem Kind zu spenden, wenn du mit dem Testen fertig bist"
Kris
3
Könnten Sie Ihre Antwort bearbeiten, um zu zeigen, wie verschiedene Arten von "langsam" simuliert werden können? Es gibt einen Unterschied zwischen langsamer E / A, langsamer CPU, langsamem Speicher, Speicher-Thrashing usw.
Parasietje
3
+1 für Vlad. Wahrscheinlich ist cpufreq einfach zu machen, wenn Sie eine CPU und einen Linux-Kernel mit Unterstützung haben. Dies sollte eine Granularität auf Befehlsebene aufweisen. Dies ist wahrscheinlich die beste generische Antwort, ohne neue Hardware zu kaufen. Es simuliert kein langsameres Netzwerk, keine langsamere Festplatte, kein langsameres Video usw., was ebenfalls zu Rennen führen kann.
Kunstloser Lärm
36

QEMU ist ein CPU-Emulator für Linux. Debian hat Pakete dafür (ich kann mir vorstellen, dass die meisten Distributionen dies tun werden). Sie können ein Programm in einem Emulator ausführen, und die meisten von ihnen sollten die Verlangsamung unterstützen. Zum Beispiel hat Miroslav Novak Patches, um QEMU zu verlangsamen.

Alternativ können Sie die Kompilierung auf ein anderes CPU-Linux (arm-none-gnueabi-linux usw.) kreuzen und dann QEMU diesen Code zur Ausführung übersetzen lassen.

Der nette Vorschlag ist einfach und kann funktionieren, wenn Sie ihn mit einem anderen Prozess kombinieren, der CPU verbraucht.

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

Sie haben nicht gesagt, ob Sie Grafiken, Dateien und / oder Netzwerk-E / A benötigen? Haben Sie etwas über die wissen Klasse von Fehlern die Sie suchen? Handelt es sich um eine Rennbedingung, oder funktioniert der Code bei einem Kunden nur schlecht?

Bearbeiten: Sie können auch Signale wie STOP und CONT verwenden , um Ihr Programm zu starten und zu stoppen. Ein Debugger kann dies auch tun. Das Problem ist, dass der Code mit voller Geschwindigkeit ausgeführt wird und dann gestoppt wird. Die meisten Lösungen mit dem Linux-Scheduler haben dieses Problem. Es gab eine Art Thread-Analysator von Intel afair. Ich sehe Vtune Release Notes . Dies ist Vtune, aber ich war mir ziemlich sicher, dass es ein anderes Tool gibt, um Thread-Rennen zu analysieren. Siehe: Intel Thread Checker , der nach einigen Thread-Race-Bedingungen suchen kann. Aber wir wissen nicht, ob die App Multithreading ist?

Kunstloser Lärm
quelle
1
und bochs ist älterer und langsamerer CPU-Emulator (nur x86).
Osgx
22

Verwendung cpulimit:

Cpulimit ist ein Tool, das die CPU-Auslastung eines Prozesses begrenzt (ausgedrückt in Prozent, nicht in CPU-Zeit). Es ist nützlich, Stapeljobs zu steuern, wenn Sie nicht möchten, dass sie zu viele CPU-Zyklen verbrauchen. Ziel ist es, zu verhindern, dass ein Prozess länger als ein bestimmtes Zeitverhältnis ausgeführt wird. Es ändert nicht den netten Wert oder andere Einstellungen für die Planungspriorität, sondern die tatsächliche CPU-Auslastung . Außerdem kann es sich dynamisch und schnell an die gesamte Systemlast anpassen .

Die Steuerung der verwendeten CPU-Menge erfolgt durch Senden von SIGSTOP- und SIGCONT POSIX-Signalen an Prozesse.

Alle untergeordneten Prozesse und Threads des angegebenen Prozesses teilen sich den gleichen Prozentsatz der CPU.

Es ist in den Ubuntu-Repos. Gerade

apt-get install cpulimit

Hier einige Beispiele zur Verwendung in einem bereits laufenden Programm:

Begrenzen Sie den Prozess 'bigloop' durch den Namen der ausführbaren Datei auf 40% CPU:

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

Begrenzen Sie einen Prozess durch PID auf 55% CPU:

cpulimit --pid 2960 --limit 55
Izkata
quelle
Ich habe cpulimit noch nicht getestet, aber es scheint die beste Antwort auf ähnliche Fragen auf SE-Websites zu sein. Gibt es einen bemerkenswerten Unterschied zwischen einem Programm, das mit Einschränkungen von cpulimit ausgeführt wird, und einem Programm, das auf langsamerer Hardware ausgeführt wird? Mein Ziel ist es, eine App zu testen, um sicherzustellen, dass die App auf langsameren Computern ausreichend reagiert (und die Grafik für die langsameren Computer zu optimieren).
trusktr
@trusktr Das hängt stark davon ab, was das Programm tatsächlich tut. Nebenbei kann ich mir bei älterer Hardware vorstellen, dass sich die Festplattengeschwindigkeit und der verfügbare Arbeitsspeicher (RAM) auch auf die Leistung auswirken, und auch auf Grafik und GPU. Es kann mehr geben. Wenn die CPU tatsächlich der Engpass ist, lohnt es sich wahrscheinlich immer noch, cpulimit auszuprobieren. (Diese Antwort ist 7 Jahre alt, und damals waren solche Performance-Hits nicht in meinem Kopf)
Izkata
Interessant. Sie haben Recht, ich habe weder Festplatte noch GPU in Betracht gezogen. Ich nehme an, das Testen mit tatsächlich langsamerer Hardware ist der beste Weg, dies zu tun, aber im Moment habe ich nur eine leistungsstarke Workstation, obwohl ich auch für Telefone der unteren Preisklasse (JS + WebGL-App) veröffentlichen möchte.
trusktr
13
  1. Besorgen Sie sich einen alten Computer
  2. VPS-Hosting-Pakete laufen in der Regel langsam, haben viele Unterbrechungen und sehr unterschiedliche Latenzen. Je billiger Sie gehen, desto schlechter wird die Hardware. Im Gegensatz zu wirklich alter Hardware besteht eine gute Chance, dass sie Befehlssätze (SSE4) enthalten, die auf alter Hardware normalerweise nicht zu finden sind. Wenn Sie jedoch ein System suchen, das langsam läuft und häufig schließt, ist ein billiger VPS-Host der schnellste Start.
Mikhail
quelle
3

Wenn Sie Ihr Programm nur simulieren möchten, um sein Verhalten auf einem sehr langsamen Computer zu analysieren, können Sie versuchen , Ihr gesamtes Programm als eines threadanderer Hauptprogramme auszuführen .

Auf diese Weise können Sie denselben Code mit unterschiedlichen Prioritäten in wenigen Threads gleichzeitig priorisieren und Daten Ihrer Analyse erfassen. Ich habe dies in der Spieleentwicklung für die Frame-Processing-Analyse verwendet.

Pervez Alam
quelle
2

Verwenden Sie sleep oder warten Sie in Ihrem Code. Dies ist nicht die hellste Methode, aber für alle Arten von Computern mit unterschiedlichen Geschwindigkeiten akzeptabel.

Alper
quelle
2

Der einfachste Weg, dies zu tun, besteht darin, Ihren ausführbaren Hauptcode in eine while-Schleife mit einem Ruhezustand am Ende zu setzen.

Beispielsweise:

void main()
{
    while 1
    {
        // Logic
        // ...
        usleep(microseconds_to_sleep)
    }
}

Wie bereits erwähnt, ist dies nicht der genaueste Weg, da Ihr Logikcode weiterhin mit normaler Geschwindigkeit ausgeführt wird, jedoch mit Verzögerungen zwischen den Durchläufen. Außerdem wird davon ausgegangen, dass Ihr Logikcode in einer Schleife ausgeführt wird.

Aber es ist sowohl einfach als auch konfigurierbar.

Kalail
quelle