konstante CPU-Last erzeugen
-
Naiver Ansatz: Du kaufst dir ne Dual-Core Maschine, und konfigurierst dein System so, dass es nur auf einem Kern läuft. Deine zu testende Anwendung schiebst du nach dem Start auf den unbenutzten Core.
Zumindest mit Linux weiß ich, dass dieses Vorgehen prinzipiell möglich wäre - obs Fake genug für deine Anwendung ist, weiß ich leider nicht.
-
Und dann? Wie hilft mir das bei meinem Performance-Test?
-
falls deine anwendung single-threaded ist: starte einen zweiten thread mit einer endlosschleife darin und gleicher priorität, dann bekommt deine anwendung 50% rechenzeit. startest du einen zweiten thread, dann bekommt sie 1/3 der rechenzeit, bei einem dritten thread 1/4 usw.
mit sleep() kannste da nix machen. selbst ein sleep(1) sleept zu lange.Gemessen wird die Performance und das Verhalten einer anderen Applikation.
bau doch in diese applikation zwangspausen ein. das dürfte einfacher sein.
-
Nein, ist es nicht
An der Applikation arbeiten ca 100 Leute. Und zwar nciht erst seit gestern.
-
dEUs schrieb:
klappt nicht.
Mit Sleep(1) kriegt man verschiedene Werte hin, nicht nur nahe 100%.
Z.B. haben 5000 Threads bei mir eine Auslastung von ca. 25% erzeugt. Bei 10000 war die Auslatung dann allerdings schon bei 90%.
-
dEUs schrieb:
In dem Tool kann man natürlich nicht einstellen "Erzeuge mir 30% Auslastung". Man kann aber einen Parameter ändern und so die CPU-Auslastung steuern. Dass 30% auf Rechner A auf Rechner B nur 20% sein können, ist mir klar. Was ich brauch, ist eine Funktionalität, die eine konstante, einstellbare CPU-Last erzeugt.
Gemessen wird die Performance und das Verhalten einer anderen Applikation.
Was meinst du mit "von außerhalb"?
Von ausserhalb wäre, wenn du z.b. einen Serverdienst dort laufen lässt, und dann mehrere Lastmaschinen damit verbindest.
Konkret würde ich evtl. diesen Ansatz mal ausprobieren:
1. Anzahl der Threads einstellbar machen.
2. in einer gewissen Vererbungshierarchie Aufgaben für die Threads vergeben.
3. Evtl. nun möglichkeiten haben, Threadgruppen zu starten, von verschiedenen Aufgabentypen.class MyThreadWorker { virtual void run(int n)=0; } class SimpleCounter : public MyThreadWorker { virtual void run(int n){for(int i =0; i < n; i++) std::cout << i << std::endl;}//evtl. in nen anderen stream als cout ausgeben, da das evtl. nicht threadsafe ist. }
-
Und dann? Serverdienst, Lastmaschinen, hä? Wie hilft mir das alles konstant eine CPU-Last zu erzeugen?
-
TomasRiker schrieb:
Mit Sleep(1) kriegt man verschiedene Werte hin, nicht nur nahe 100%.
Z.B. haben 5000 Threads bei mir eine Auslastung von ca. 25% erzeugt. Bei 10000 war die Auslatung dann allerdings schon bei 90%.Probier's doch wenigstens mal aus, dEUs.
-
TomasRiker schrieb:
dEUs schrieb:
klappt nicht.
Mit Sleep(1) kriegt man verschiedene Werte hin, nicht nur nahe 100%.
Z.B. haben 5000 Threads bei mir eine Auslastung von ca. 25% erzeugt. Bei 10000 war die Auslatung dann allerdings schon bei 90%.Das ist keine Option. Erstens ist das auch nciht konstant und zweitens verbrauchen schon 500 Threads bei mir knapp ein halbes GB virtuellen Arbeitsspeicher!
-
Hundertprozentig konstant wirst du es nie hinkriegen ...
5000 Threads liefen bei mir ohne Probleme.
-
50% auslastung heisst doch nichts anderes, als dass dir die haelte der rechenleistung uebrig bleiben, wenn deine cpu also 2Mrd cycles/s hat, bekommst du 1Mrd cycles/s.
schlussfolgerung waere, dass du die cpu runtertaktest, das geht mit vielen tools bei den meisten modernen cpus wenn ich richtig informiert bin.
-
dEUs schrieb:
...und zweitens verbrauchen schon 500 Threads bei mir knapp ein halbes GB virtuellen Arbeitsspeicher!
was ja auch wieder dein programm bremsen könnte, oder ist das nicht gewollt, soll nur rechenzeit abgezwackt werden?
was willst du überhaupt messen? 'systemlast' ist ein ziemlich oberflächlicher begriff...
-
dEUs schrieb:
Und dann? Serverdienst, Lastmaschinen, hä? Wie hilft mir das alles konstant eine CPU-Last zu erzeugen?Du wolltest wissen wie man von ausserhalb Last erzeugt.
Ist natürlich nur sinnvoll, wenn man auch eine Applikation hat, die das als Test benötigt.Würde nachwievor über die Anzahl der Threads gehen.
Bzw. deren Aufgaben.
-
falls du zwei rechner zur verfuegung hast, koennte der testrechner davon einen timecritical thread erzeugen und in kurzen intervalen (z.b. nach 1000 durchlaeufen einer schleife) blocked ein byte per tcp erwarten, ein zweiter rechner koennte dann je nach auslastungswunsch die packete schicken, das sollte dann relativ konstant laufen.
-
die vorschläge werden ja immer abenteurlicher
-
Hab mal ein bisschen rum probert. Solange die CPU Zeit von meinem Prozess über 50% war konnte man es durch ändern der Werte ganz gut einstellen, aber alles was drunter war, hat nur noch kurzzeitige schwankungen und keine konstante CPU Zeit erzeugt.
int main() { double m = 20; double n = 9; while(true) { for(int j = 0; j<130; j++){ if(j == 0) Sleep(1); for(long i = 0; i< 500; i++) { m += cos(sqrt(m)); m -= cos(sqrt(m)); n *= cos(m); m += n; n -= sin(m + i); m -= n; } } } std::cout<<m; }
-
wie wärs, nen real time thread zu starten, der entsprechend der nötigen last alle paar system ticks wieder schlafen gelegt wird?
-
@TomasRiker:
Der Speicherverbrauch ist einfach zu extrem. 1,5GB bei 1500 Threads!@rapso:
Runtertackten und Thread anhalten sind beides keine Optionen.
Das mit dem Paketen versteh ich nicht - wofür die Pakete?@ha lustig:
Werde ich mal austesten, danke.@thordk:
Habe so etwas ähnliches schon versucht, werde es aber genau so nochmals testen.Danke für die rege Beteiligung!
-
probie doch mal ob mal mit vmware, virtual pc, quemu usw. aus
wahrscheinlich kann man da die last einstellen, entwäder läst du dann deine app in der virtuelen umgebung laufen oder in der virtuelen umgebung ein thread der 100% auslastung in der vm erzeugt (aber da die vm eingestelt ist auf eine bestimte last, erzeugt er auf deiner maschiene z.b. nur 50%)
dEUs schrieb:
TomasRiker schrieb:
dEUs schrieb:
klappt nicht.
Mit Sleep(1) kriegt man verschiedene Werte hin, nicht nur nahe 100%.
Z.B. haben 5000 Threads bei mir eine Auslastung von ca. 25% erzeugt. Bei 10000 war die Auslatung dann allerdings schon bei 90%.Das ist keine Option. Erstens ist das auch nciht konstant und zweitens verbrauchen schon 500 Threads bei mir knapp ein halbes GB virtuellen Arbeitsspeicher!
dann lasse die threads etwas mehr machen als while(true)sleep(1) dann brauchst du keine 500 threads mehr
unter linux erzeuge ich immer last in den ich auch cat /dev/random > /dev/null lesen lasse, ich glaube wenn man die daten vorher durch dd sendet kann man auch einstellen wie viel byte pro sek gelesen werden
ich denke du hast auch ein problem mit den messen, was windows unter cpu last versteht ist wahrscheinlich zu ungenau für dich, wobei ich mich sowieso frage was macht es für ein sin zu sagen "unser applikation läuft gut mit 50% cpu last, diese 50% last müssen aber konstant sein" was in der relaität aber ehr die ausnahme ist
-
dEUs schrieb:
@TomasRiker:
Der Speicherverbrauch ist einfach zu extrem. 1,5GB bei 1500 Threads!mit was erzeugst du denn die Threads?