konstante CPU-Last erzeugen



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



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

    btw. http://msdn2.microsoft.com/en-us/library/ms686342.aspx



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


Anmelden zum Antworten