Programmatische Begrenzung der CPU-Auslastung eines Threads, der in einem Service ausgeführt wird

8

Ich verwende VB9 (VS2008).

Ich habe einen Windows-Dienst erstellt, der einige Ordner regelmäßig indiziert.

Gibt es eine Möglichkeit, die CPU-Auslastung abhängig vom aktuellen Systemzustand nach oben zu begrenzen, dh wenn das System im Leerlauf ist, kann der Thread die CPU so gut wie nötig nutzen, wenn es andere Programme gibt / Prozesse laufen dann sollte es die CPU in einer Weise verwenden, die das System nicht langsam macht.

    
user57175 27.01.2009, 08:01
quelle

4 Antworten

17

Sie können die Priorität des Threads in .Net über Thread reduzieren. Priorität

Wenn Sie es auf BelowNormal setzen, werden andere Threads davor geplant.

Dies kann dazu führen, dass der Thread ausgehungert wird, aber es klingt, als ob dies eine akzeptable Designentscheidung für Ihre Bedürfnisse ist.

Beachten Sie, dass dies die Hauptauswirkung der Background-Aufgabe ist, da Sie eine beträchtliche Festplatten-IO durchführen. Möglicherweise ist die Reduzierung der Priorität nicht ausreichend (da die Festplatten-IO auch während des Threads in Teilen weiterläuft) gedrosselt.

Ein Überwachungsthread, der die Verwendung der Maschine überprüft (optional nur dann, wenn mindestens ein interaktiver Benutzer vorhanden ist), könnte die Indexierung anhalten (oder die E / A erheblich drosseln). Dies wird auf modernen Maschinen wichtiger sein, wo viele Cores (und hyper threading virtual cores) verfügbar sind, was bedeutet, dass trotz der Tatsache, dass der Benutzer tatsächlich viel Arbeit macht, Ressourcen zum Ausführen des Indizierungsthreads vorhanden sind, aber nicht zum Ausführen der Disk IO.

Sie sollten auch prüfen, ob Sie das Energieschema überprüfen um festzustellen, ob Sie zu diesem Zeitpunkt laufen sollten (da der Batterieverbrauch von beiden Festplatten nicht unerheblich ist)

Wenn Sie noch mehr tun möchten, um die Auswirkungen dieses Hintergrunds zu reduzieren, fügen IO-gebundene Aufgabenversionen von Windows ab Vista zwei nützliche APIs hinzu:

E / A niedriger Priorität

Dadurch kann Ihr Code E / A mit einer niedrigeren Priorität als andere E / A planen.

Windows Taskplaner

Sie können dies verwenden, um Dinge so zu planen, dass sie bei "Systemleerlaufzeit" ausgeführt werden. Dies ist der Fall, wenn das System nicht beschäftigt ist und der Benutzer nicht anwesend ist.

    
ShuggyCoUk 21.04.2009, 12:02
quelle
3

Unter XP ist ShuggyCoUk korrekt. Das erste, was zu tun ist, ist die Thread-Priorität auf etwas unter 8 zu senken. Dies bedeutet, dass alle anderen Threads oder Prozesse, die mit der Priorität 8 oder höher ausgeführt werden, immer anstelle des Threads ausgeführt werden. Hinweis: Ich empfehle nicht, einfach die Prozesspriorität auf & lt; 8 festzulegen, sondern nur den Thread (oder die Threads), den Sie "nett" ausführen möchten.

Wie Shuggy bemerkt hat, ist das Problem nicht die CPU-Zeit - es ist die I / O, die Ihr Dienst erzeugt. Unter XP werden alle I / O's gleich behandelt - Ihre I / O kann also andere Dinge beeinträchtigen.

Vista (und bald auch Win7) hat zwei Dinge, die genau das machen, was Sie wollen.

Der erste ist der Windows Taskplaner . Sie können dies verwenden, um Dinge so zu planen, dass sie zur "Systemleerlaufzeit" ausgeführt werden. Dies ist der Fall, wenn das System nicht beschäftigt ist und der Benutzer nicht anwesend ist.

Das zweite ist E / A niedriger Priorität . Dadurch kann Ihr Code E / A mit einer niedrigeren Priorität als andere E / A planen.

Beide zusammen können verwendet werden, um Code zu entwickeln, der ein guter Systembürger ist.

Beachten Sie, dass Sie mobile Systeme auch berücksichtigen sollten, indem Sie Ihren Hintergrundartikel zurückskalieren oder deaktivieren, wenn das System mit Batterien betrieben wird. Sie können einfach sein - einfaches Ausschalten der Batterie; oder anspruchsvoll, wobei das Energieschema berücksichtigt und als Hinweis verwendet wird vom Benutzer.

Da Sie daran arbeiten, einen Dienst zu schreiben, der ein guter Systembürger ist, können Sie auch ein paar andere Dinge tun.

1) Sie könnten den Umfang der geleisteten Arbeit überwachen und verlangsamen oder stoppen, wenn genügend Fortschritte erzielt wurden. 2) Achten Sie auf Ihren Speicherbedarf - je kleiner, desto besser. Dies ist oft selbstverständlich, aber es ist besonders wichtig für Dienstleistungen, da sie rund um die Uhr laufen.

    
Foredecker 15.02.2009 16:04
quelle
1

Wenn Sie die API SetThreadPriority verwenden, können Sie den Thread so konfigurieren, dass er eine niedrigere Thread-Priorität als normal verwendet. Der Thread verwendet alle verfügbaren CPU-Ressourcen, wenn das System inaktiv ist, gibt die CPU-Zeit jedoch für alle Threads mit höherer Priorität frei.

    
1800 INFORMATION 27.01.2009 08:12
quelle
1

Ein Großteil der Belastung Ihres Systems durch Ihren Indizierungsprozess ist wahrscheinlich die Festplatten-I / O. Wenn Ihr Prozess in Vista / Windows Server 2008 funktioniert, können Sie neben der Vorgehensweise von ShuggyCoUk auch die Festplatten-I / O-Priorität ändern Hintergrund. So funktionieren die meisten Paging-, Defrag- und andere Wartungsaufgaben auf diesen Systemen. Wenn nicht, können Sie auch die Datenträger-E / A-Warteschlange überwachen, um festzustellen, ob ausstehende Vorgänge von Benutzerinteraktionen ausgehen.

    
macbirdie 15.02.2009 15:36
quelle