Simulieren Sie eine gleichmäßige CPU-Last und Spitzen

Wie kann ich in C # eine konstante CPU-Last erzeugen, die für eine bestimmte Zeit unter 100% liegt? Ich würde auch gerne in der Lage sein, den Ladebetrag nach einer gewissen Zeit zu ändern. Wie empfehlen Sie, Nutzungsspitzen für sehr kurze Zeit zu generieren?

    Zunächst einmal müssen Sie verstehen, dass die CPU-Auslastung immer über eine bestimmte Zeit durchschnittlich ist. Zu jedem gegebenen Zeitpunkt arbeitet die CPU entweder oder es ist nicht. Die CPU arbeitet nie zu 40%.

    Wir können jedoch eine Last von 40% über eine Sekunde simulieren, indem wir die CPU 0,4 Sekunden lang arbeiten lassen und 0,6 Sekunden schlafen. Das ergibt eine durchschnittliche Auslastung von 40% über diese Sekunde.

    Wenn es auf weniger als eine Sekunde heruntergezählt wird, sagen 100 Millisekunden-Stücke eine noch stabilere Nutzung.

    Die folgende Methode verwendet ein Argument, das die gewünschte Verwendung ist, und verwendet dann eine einzelne CPU / einen core in diesem Maße:

    public static void ConsumeCPU(int percentage) { if (percentage < 0 || percentage > 100) throw new ArgumentException("percentage"); Stopwatch watch = new Stopwatch(); watch.Start(); while (true) { // Make the loop go on for "percentage" milliseconds then sleep the // remaining percentage milliseconds. So 40% utilization means work 40ms and sleep 60ms if (watch.ElapsedMilliseconds > percentage) { Thread.Sleep(100 - percentage); watch.Reset(); watch.Start(); } } } 

    Ich verwende hier eine Stoppuhr , weil sie genauer ist als die TickCount- Eigenschaft, aber Sie könnten diese auch verwenden und Subtraktion verwenden, um zu überprüfen, ob Sie lange genug gelaufen sind.

    Zwei Dinge, die man beachten sollte:

    • Auf Multi-Core-Systemen müssen Sie für jeden core einen Thread generieren. Andernfalls wird nur eine CPU / ein core ausgeführt, die eine ungefähre Auslastung in Prozent / Anzahl der coree ergibt.
    • Thread.Sleep ist nicht sehr genau. Es garantiert nie genau die Millisekunde, so dass Sie einige Variationen in Ihren Ergebnissen sehen werden

    Um Ihre zweite Frage zu beantworten, über die Änderung der Auslastung nach einer bestimmten Zeit, schlage ich vor, dass Sie diese Methode für einen oder mehrere Threads ausführen (abhängig von der Anzahl der coree) und wenn Sie die Auslastung ändern möchten, stoppen Sie diese Threads und erstellen Sie neue mit den neuen Prozentwerten. Auf diese Weise müssen Sie die Thread-Kommunikation nicht implementieren, um den percentage eines laufenden Threads zu ändern.

    Neben der Isak-Antwort habe ich hier eine einfache Implementierung für Multicore gegeben:

      public static void CPUKill(object cpuUsage) { Parallel.For(0, 1, new Action((int i) => { Stopwatch watch = new Stopwatch(); watch.Start(); while (true) { if (watch.ElapsedMilliseconds > (int)cpuUsage) { Thread.Sleep(100 - (int)cpuUsage); watch.Reset(); watch.Start(); } } })); } static void Main(string[] args) { int cpuUsage = 50; int time = 10000; List threads = new List(); for (int i = 0; i < Environment.ProcessorCount; i++) { Thread t = new Thread(new ParameterizedThreadStart(CPUKill)); t.Start(cpuUsage); threads.Add(t); } Thread.Sleep(time); foreach (var t in threads) { t.Abort(); } } 

    Für eine gleichmäßige Betonung: Isak Savos Antwort mit einem kleinen Tweak

     int percentage = 80; for (int i = 0; i < Environment.ProcessorCount; i++) { (new Thread(() => { Stopwatch watch = new Stopwatch(); watch.Start(); while (true) { // Make the loop go on for "percentage" milliseconds then sleep the // remaining percentage milliseconds. So 40% utilization means work 40ms and sleep 60ms if (watch.ElapsedMilliseconds > percentage) { Thread.Sleep(100 - percentage); watch.Reset(); watch.Start(); } } })).Start(); } 

    Jedes Mal, wenn Sie die Variable cpuUsageIncreaseby setzen müssen. beispielsweise:

    1- Cpu% erhöhen um> cpuUsageIncreaseby% für eine Minute. 2- Gehen Sie für 20 Sekunden auf 0%. 3- Gehe zu Schritt 1.

      private void test() { int cpuUsageIncreaseby = 10; while (true) { for (int i = 0; i < 4; i++) { //Console.WriteLine("am running "); //DateTime start = DateTime.Now; int cpuUsage = cpuUsageIncreaseby; int time = 60000; // duration for cpu must increase for process... List threads = new List(); for (int j = 0; j < Environment.ProcessorCount; j++) { Thread t = new Thread(new ParameterizedThreadStart(CPUKill)); t.Start(cpuUsage); threads.Add(t); } Thread.Sleep(time); foreach (var t in threads) { t.Abort(); } //DateTime end = DateTime.Now; //TimeSpan span = end.Subtract(start); //Console.WriteLine("Time Difference (seconds): " + span.Seconds); //Console.WriteLine("10 sec wait... for another."); cpuUsageIncreaseby = cpuUsageIncreaseby + 10; System.Threading.Thread.Sleep(20000); } } }