konstante CPU-Last erzeugen



  • Hallo zusammen,

    für ein paar Performance-Tests muss ich konstante CPU-Last erzeugen.
    Wie mache ich das am Besten?
    Hab es mit einem oder mehreren Threads mit Endlosschleifen versucht, die alle x Durchläufe ein Sleep(1) machen. Dadurch bekomme ich zwar die CPU-Auslastung hoch, aber sie schwankt doch sehr stark (Sie streut ca 15% nach oben und unten um eine bestimmte Auslastung)

    Vielen Dank für eure Vorschläge



  • komplexe berechnungen durchführen, die sich nicht komplett wegoptimieren lassen.

    z.b. die ersten paar tausend primzahlen berechnen. aber achte drauf, dass du keine rekursion verwendest.



  • Betreib halt einfach ein wenig Numbercrunching.
    Berechne PI in mehrern Threads, oder Primzahlen wie mein Vorposter schon sagte.
    Evtl. diese dann noch durch einen 2. Thread ausgeben lassen.
    Allerdings weiss ich nicht, ob es möglich ist, die Auslastung zu steuern, z.b. über
    einen Parameter "cpuauslastung = 30%".

    Musst du die Last auf der Maschine erzeugen?
    Oder kannst du auch von ausserhalb mit Lastgeneratoren darauf zugreifen?
    Und von was testest du die Performance? Von der CPU?



  • Ich brauch eine Funktionalität die eine beliebige Auslastung erzeugt.
    D.h. 20%, 30%, 50%, was man halt einstellt.

    Die Berechnung der Primzahlen ist prinzipiell auch ncihts anderes als eine Schleife in der ich halt nur eine Variable inkrementier.



  • Edit: zu spät



  • ThomasRiker schrieb:

    Würde ein einfaches while(true); nicht auch konstant 100% verbraten? Wenn du dann noch die Prozesspriorität auf Echtzeit stellst ...

    Aber es geht doch garnicht darum 100% zu verbraten. Es sollen x% verbraten werden, vermutlich um zu testen wie seine Anwendung mit 100-x % läuft, für verschiedene x.



  • 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"?



  • Jester schrieb:

    ThomasRiker schrieb:

    Würde ein einfaches while(true); nicht auch konstant 100% verbraten? Wenn du dann noch die Prozesspriorität auf Echtzeit stellst ...

    Aber es geht doch garnicht darum 100% zu verbraten. Es sollen x% verbraten werden, vermutlich um zu testen wie seine Anwendung mit 100-x % läuft, für verschiedene x.

    Exakt!
    Die Applikation hat Komponenten, die eigentlich in einem Hardrealtime-System laufen müssten, da Daten gemessen und mit Zeitstempeln versehen werden.
    Wir müssen jetzt herausfinden, ab welcher CPU-Auslastung diese Daten komplett unbrauchbar werden.



  • Jester schrieb:

    Aber es geht doch garnicht darum 100% zu verbraten. Es sollen x% verbraten werden, vermutlich um zu testen wie seine Anwendung mit 100-x % läuft, für verschiedene x.

    Ja, aber als ich die Antwort verfasst habe, war davon noch nix zu lesen 😉

    Neue Idee:
    Es gibt doch sicher die Möglichkeit, die aktuelle CPU-Last abzufragen. Dann erzeugst du so lange ganz "kleine" Threads, bis die Last sich beim gewünschten Wert eingependelt hat. Jeder Thread könnte einfach nur aus while(true) Sleep(0); bestehen. Ob das wirklich klappt, müsste man halt mal testen.



  • klappt nicht.



  • 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.


Anmelden zum Antworten