Programm mit niedrigerer CPU-Geschwindigkeit ausführen?


7

Es wäre sehr nützlich für mich, bestimmte Programme in einer Linux-Umgebung mit einer festen (niedrigeren) CPU-Taktrate auszuführen (z. B. runat 400mhz ./my-program --argument-of="my program"um diese Taktrate zu erhalten).

Ich brauche es, um Verzögerungen zwischen den einzelnen Assembly-Anweisungen meines Programms zu erzeugen, und es würde mich nicht töten, wenn die Verzögerung nicht genau ist (z. B. wenn sie vom OS-Scheduler abhängt, wie es fast sicher sein wird).

Das Ziel ist es, die Effizienz von Algorithmen bei der Programmierung nicht so schwerer Anwendungen in der Schule sehr deutlich zu machen (eine 3-GHz-CPU macht es schwierig, langsame Algorithmen zu bemerken, die nur wenig Zeit laufen und wirklich optimiert werden könnten). Vielleicht kann es auch nützlich sein, um die Rennbedingungen in Echtzeit zu erkennen.

Kennen Sie ein solches Tool? Gibt es eine Art Dolmetscher, den ich hacken könnte, um dies zu erreichen? Kann mir gdb relativ einfach helfen? Ich denke, es kommt der Steuerung einer mir bekannten Linux-Programmausführung am nächsten.

Das Ausführen des Hole-Systems in einer VM mit CPU-Cap könnte eine weitere Option sein, da es mir die Illusion vermittelt - eine CPU mit niedrigerer Geschwindigkeit -, aber am besten einzelne Programme ausführen.


1
Unvollständige Antwort, aber Sie können versuchen, cpu.shares über cgroups zu manipulieren . Konfigurieren Sie grundsätzlich die cgroup und führen Sie das Programm in der konstanten cgroup über aus cgexec.
Bratchley

@JoelDavis Ich glaube nicht, dass Sie einen Prozess über cgroups verlangsamen können. Sie können steuern, wie viel CPU-Zeit empfangen wird. Wenn dies jedoch der einzige aktive Prozess ist, wird 100% der CPU-Zeit benötigt.
Gilles 'SO - hör auf böse zu sein'

Antworten:


5

Ich denke, die Anwendung, die Sie suchen, heißt cpulimit. Dies ist kein Befehl, der normalerweise in einem System enthalten ist. Sie müssen ihn daher entweder über Ihren Distribution-Paketmanager (Ubuntu / Debian) oder von der Quelle aus installieren.

Ubuntu / Debian

$ apt-cache search cpulimit
cpulimit - tool for limiting the CPU usage of a process

Die Installation würde also folgendermaßen ablaufen:

$ sudo apt-get install cpulimit

Aus der Quelle

Laden Sie es so herunter:

$ wget https://github.com/opsengine/cpulimit/archive/master.zip \
       -O cpulimit-master.zip

Entpacken & bauen:

$ unzip cpulimit-master.zip ; cd cpulimit-master ; make

Verwendungszweck

Sie können es mit a installieren make install, aber im Moment verwenden wir es nur aus dem Verzeichnis, in dem wir es erstellt haben:

$ pwd
/home/saml/tst/96387/cpulimit-master
$ src/cpulimit -e firefox -l 30

Dadurch wird der aufgerufene Prozess firefoxauf 30% der verfügbaren CPU-Auslastung begrenzt.

Sie können es auch auf laufende Prozesse anwenden, nachdem diese aufgerufen wurden:

$ pgrep firefox
1234

$ src/cpulimit -p 1234 -l 30

Sie können den Rest der Verwendung von sehen cpulimit:

$ src/cpulimit 
Error: You must specify a cpu limit percentage
Usage: cpulimit [OPTIONS...] TARGET
   OPTIONS
      -l, --limit=N          percentage of cpu allowed from 0 to 400 (required)
      -v, --verbose          show control statistics
      -z, --lazy             exit if there is no target process, or if it dies
      -i, --ignore-children  don't limit children processes
      -h, --help             display this help and exit
   TARGET must be exactly one of these:
      -p, --pid=N            pid of the process (implies -z)
      -e, --exe=FILE         name of the executable program file or path name
      COMMAND [ARGS]         run this command and limit it (implies -z)

Report bugs to <marlonx80@hotmail.com>.

Außerdem gibt es hier auf cyberciti.biz ein gutes Tutorial zur Verwendung mit dem Titel: Linux Limit CPU Usage Per Process .

HINWEIS: Denken Sie daran, dass die CPU-Auslastung in Prozent begrenzt ist. Wenn Sie also eine Quad-Core-Box (4 CPU) haben, müssen Sie diese von 0% auf 400% begrenzen.


1

Möglicherweise können Sie die Uhr Ihres Prozessors einstellen, jedoch global, nicht für ein bestimmtes Programm. Prozessoren funktionieren nicht so. Prozessoren für Umgebungen mit begrenzter Leistung (insbesondere Laptops und andere mobile Geräte) unterstützen in der Regel mehrere Geschwindigkeiten.

Sie können im Prinzip festlegen, dass die Prozessorgeschwindigkeit (falls unterstützt) geändert wird, wenn Ihr Prozess geplant ist, und die Prozessorgeschwindigkeit zurückgesetzt wird, wenn ein anderer Prozess geplant wird. Mir ist keine Software bekannt, die dies unterstützt. Wahrscheinlich wäre eine ziemlich umfangreiche Änderung des Kernels erforderlich.

Sie können Ihr Programm in einer langsamen virtuellen Maschine wie Qemu (ohne KVM, damit Sie eine reine Software-Emulation erhalten) oder Bochs ausführen.

Wenn Sie mit einer niedrigeren CPU-Geschwindigkeit arbeiten, werden Sie wahrscheinlich nicht mehr Rennbedingungen haben.

Wenn Ihr Programm Multithreading ist, können Sie es zwingen, einen einzelnen Prozessor oder einen bestimmten Satz von Prozessoren zu verwenden taskset, z. B. taskset 3 myprogramum nur auf den CPUs Nr. 0 und Nr. 1 ausgeführt zu werden. Wenn das Programm gezwungen wird, auf einer einzelnen CPU ausgeführt zu werden, treten wahrscheinlich weniger Rennbedingungen auf.

Führen Sie Ihr Programm für Ihren Anwendungsfall mehrmals aus, anstatt es langsamer auszuführen. Wenn Sie beispielsweise beabsichtigen, dass Ihr Programm auf Geräten, die etwa zehnmal langsamer als Ihr Computer sind, eine bestimmte Geschwindigkeit aufweist, testen Sie es, indem Sie Ihr Programm zehnmal hintereinander ausführen. Das mehrmalige Ausführen des Programms erhöht die Wahrscheinlichkeit, dass Rennbedingungen auftreten.


Schauen Sie sich die Manpage für an taskset. Sie können es auch über den -cSchalter anweisen, dass es auf einem bestimmten CPU ausgeführt werden soll. taskset -c 0,2,4-11 myprogram.
slm

1

Eine andere Möglichkeit ist die Verwendung einer langsamen Hardware - eine kostengünstige ARM-basierte Karte wie Raspbery Pi oder (etwas leistungsfähigeres) Compulab Trimslice sollte dies tun. Sie haben eine begrenzte Menge an Speicher, eine langsame CPU und können dennoch ein vollständiges Linux-System ausführen - Fedora, Debian und einige andere Distributionen haben eine ARM-Version.


0

Ziel ist es, die Effizienz von Algorithmen bei der Programmierung nicht so schwerer Anwendungen sehr deutlich zu machen

Der normative Weg, dies zu tun, besteht darin, den Vorgang viele Male zu wiederholen. Wenn Sie zwei verschiedene Algorithmen haben, die dieselbe (nicht so schwere) Aufgabe X ausführen, und Sie sie vergleichen möchten, wiederholen Sie die Aufgabe X tausend- oder millionenfach. Dies erfordert möglicherweise, dass Sie ein einfaches Programm (auf hoher Ebene) schreiben, um den Benchmark zu steuern. Solange dasselbe Treiberprogramm alle Tests ausführt, erhalten Sie einen realistischen Vergleich darüber, wie schnell einer im Verhältnis zum anderen ist.


Es ist zwar richtig, dass Benchmarking der offizielle Weg ist - dies ist jedoch akademisch. Ich bearbeite meine Frage, um dies zu klären. Danke für deine Antwort.
mgarciaisaia

0

Mit cpufreq-info können Sie alle CPU-Taktraten abrufen, die von Ihrer CPU unterstützt werden. Und Sie können cpufreq-set verwenden, um eine CPU-Taktrate auszuwählen.


0

Führen Sie einfach Ihr Programm unter valgrind aus . Sie werden wahrscheinlich einen 50-fachen Leistungstreffer erhalten.

Als Bonus - und dies scheint Ihrem Anwendungsfall zu entsprechen - können Sie valgrind davon überzeugen , Ihnen Anrufdiagramme, Profilinformationen, verschiedene nützliche Dinge wie Fehler bei der Speichernutzung vor dem Festlegen usw. zu geben.

Zum Beispiel

$ valgrind --tool=callgrind --separate-callers=30 ./a.out

erstellt eine callgrind.out- Datei. Sie können diese Profildaten in kcachegrind anzeigen , einer ziemlich netten Benutzeroberfläche.

Erinnerung: Alle Profiler lügen. Sie müssen Ihre Profiler verstehen, um den Grad der falschen Wahrheit beurteilen zu können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.