Programmatisch einschränken der CPU-Nutzung ein Thread läuft innerhalb eines Service
Ich bin mit VB9 (VS2008).
Habe ich einen Windows-Dienst, der Indizes einige Ordner regelmäßig.
Gibt es eine Möglichkeit, ich kann eine Obergrenze für die CPU-Nutzung je nach der aktuellen system-Zustand, d.h., wenn das system im Leerlauf ist, wird der thread die CPU nutzen, so viel wie es braucht, aber wenn es andere Programme/Prozesse ausgeführt werden, dann sollte es die CPU in der Weise, dass nicht das system verlangsamen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Reduzieren Sie die Priorität des Threads, in .Net über Thread.Priorität
Einstellung BelowNormal bedeutet, dass andere threads geplant werden, vor.
Dies kann dazu führen, das Gewinde, das verhungert, aber es klingt wie das ist, ein akzeptables design-Entscheidung für Ihre Bedürfnisse.
Beachten Sie, dass seit der Durchführung erhebliche disk-IO ist dies tatsächlich der wichtigste Einfluss, der den Boden zurück-Aufgabe, und Sie können feststellen, dass die Verringerung der Priorität nicht ausreicht (da der Datenträger-E /a wird weiterhin in teilen auch während der thread gedrosselt wird.
Einen überwachung thread, der überprüft die Auslastung der Maschine (Optional Fürsorge nur, wenn mindestens ein interaktiver Benutzer vorhanden ist) könnte anhalten der Indizierung (oder drosseln des IO-erheblich). Dies wird immer wichtiger sein wird auf modernen Maschinen, wo es viele Kerne (hyper-threading virtuelle Kerne), was bedeutet, dass trotz der Benutzer tatsächlich tun, eine Menge Arbeit ersparen Ressourcen vorhanden sind, um die Ausführung Ihrer Indizierung thread, aber nicht wirklich ausführen der disk-IO.
Möglicherweise möchten Sie auch zu prüfen, ob Sie überprüfen die Energieschema um festzustellen, ob Sie sollten zu dieser Zeit ausgeführt (da der Akku drain von beiden schwer Zugriff auf die Festplatte ist nicht unerheblich)
Wenn Sie wollen sogar noch mehr tun, um die Auswirkungen dieser hintergrund-IO-bound Aufgabe windows-Versionen ab Vista fügen Sie zwei nützliche APIs:
Niedrige Priorität I/O
Dies erlaubt Ihrem code auf Klasse-I/O auf einer niedrigeren Priorität als die anderen I/O.
Der Windows Task Scheduler
Können Sie diese planen, die Dinge laufen unter "system idle time". Diese, wenn das system nicht ausgelastet ist, und der Benutzer ist nicht vorhanden.
Auf XP, ShuggyCoUk korrekt ist. Das erste, was zu tun ist, einfach senken Sie die thread-Priorität auf etwas unter 8. Dies bedeutet, dass von einem anderen thread oder Prozess ausgeführt wird, die mit der Priorität 8 oder größer wird immer ausgeführt, anstatt deinen thread. Hinweis: ich empfehle nicht, einfach die Einstellung, Ihre Prozess-Priorität auf <8, einfach den thread (oder threads), die Sie ausführen möchten 'schön'.
Als Shuggy hat darauf hingewiesen, die Frage ist nicht, wie er CPU-Zeit - es ist die I/O-Ihren Dienst generiert. Auf XP werden alle I/O ' s werden gleich behandelt - also I/O hat das Potenzial, sich in andere Dinge einzumischen.
Vista (und bald auf Win7) hat zwei Dinge entwickelt, genau das zu tun, was Sie wollen.
Die erste ist die Der Windows Task Scheduler. Sie können diese verwenden, um Zeitplan, die Dinge laufen unter "system idle time". Diese, wenn das system nicht ausgelastet ist, und der Benutzer ist nicht vorhanden.
Die zweite ist Niedrige Priorität I/O. Dies erlaubt Ihrem code auf Klasse-I/O auf einer niedrigeren Priorität als die anderen I/O.
Beides zusammen kann verwendet werden zum entwickeln von code, dass ist ein gutes system, Bürger.
Beachten Sie, sollten Sie auch mit mobilen Systemen Rechnung, indem Sie die Skalierung zurück oder deaktivieren Sie Ihre hintergrund-Element, wenn das system läuft auf Batterien. Sie können einfach über diese einfache ausschalten im Akkubetrieb; oder anspruchsvolle, wobei die Energieschema berücksichtigt, und das als Tipp von dem user.
Da Sie arbeiten schreiben einen service, dass ist ein gutes system, Bürger, die Sie tun können, ein paar andere Dinge auch.
1) konnte Man beobachten, die Menge an Arbeit, die getan im Laufe der Zeit und verlangsamen oder stoppen, wenn genügend Fortschritte erzielt wurden.
2) achten Sie auf Ihre Speicher-footprint - je kleiner, desto besser. Diese oft selbstverständlich, aber es ist besonders wichtig, für Dienstleistungen, wie Sie 24/7 laufen.
Wenn Sie die
SetThreadPriority
- API, können Sie den thread auf eine geringere thread-Priorität als normal. Der thread nutzt alle verfügbaren CPU-Ressourcen, wenn das system im Leerlauf ist, aber verzichtet auf CPU-Zeit, um alle threads mit einer höheren Priorität.Großteil der Last auf Ihrem system aus Ihrer Indizierung ist wohl der disk-I/O, also außer dem, was ShuggyCoUk gesagt, wenn Ihr Prozess funktioniert in Vista/Windows Server 2008 können Sie auch ändern, disk-I/O-Priorität in den hintergrund. Das ist, wie die meisten paging, defrag und andere Wartungs-Aufgaben auf diese Systeme. Wenn nicht, können Sie auch überwachen, disk-i/o-Warteschlange, um zu sehen, ob es ausstehende Vorgänge aus der Benutzer-Interaktion.