Was sind die häufigsten Ursachen für die hohe CPU-Nutzung?

Hintergrund:

In meine Anwendung in C++ geschrieben, die ich erstellt habe, 3 threads:

  • AnalysisThread (oder Hersteller) : es liest eine Eingabedatei, analysiert es und erzeugt Muster, und enqueue in std::queue1.
  • PatternIdRequestThread (oder Verbraucher) : es deque Muster aus der Warteschlange und sendet Sie nacheinander auf die Datenbank über einen client (geschrieben in C++), das gibt Muster uid das ist dann zugeordnet, um die entsprechenden Muster.
  • ResultPersistenceThread : es braucht noch einige Dinge, Gespräche zur Datenbank, und es funktioniert gut wie erwartet, so weit wie CPU-Auslastung betroffen ist.

Ersten beiden threads nehmen 60-80% CPU-Auslastung, jede dauert etwa 35% im Durchschnitt.

Frage:

Ich verstehe nicht, warum manche threads nehmen hohe CPU-Auslastung.

Analysiere ich es wie folgt : wenn es das OS, wer trifft Entscheidungen, wie Kontext-switchunterbrechenund Planung zu welchem thread sollte Zugang zu system-Ressourcen, wie CPU-Zeit, dann kommen wie einige threads in einem Prozess geschehen, um mehr CPU als die anderen? Es sieht aus wie einige threads gewaltsam nimmt die CPU aus dem OS mit vorgehaltener Waffeoder das OS hat eine echte Schwäche für einige threads und so ist es voreingenommen gegenüber Sie von Anfang an, geben Ihnen alle Ressourcen, die es hat. Warum kann Sie nicht unparteiisch sein, und geben Sie Ihnen alle gleich?

Ich weiß, es ist naiv. Aber bin ich verwirrt mehr, wenn ich denke, dass entlang dieser Linie : der OS ermöglicht den Zugriff auf die CPU an einen thread, bezogen auf die Menge der Arbeit durch den thread, aber wie sieht das OS berechnen oder Vorhersagen, die Menge der Arbeit vor Ausführung komplett?

Ich Frage mich, was sind die Ursachen für die hohe CPU-Nutzung? Wie können wir Sie erkennen? Ist es möglich, Sie zu identifizieren, einfach durch einen Blick auf den code? Was sind die Werkzeuge?

Ich bin mit Visual Studio 2010.

1 ist. Ich habe meine Zweifel std::queue als gut. Ich weiß, dass die standard-Container sind nicht thread-sicher. Aber wenn genau ein thread enqueue items to queue, dann ist es sicher, wenn genau ein thread deque-Elemente aus? Ich kann mir vorstellen es ist wie ein Rohr, auf der einen Seite, die Sie einfügen von Daten, auf der anderen, entfernen Sie Daten, dann warum sollte es unsicher sein wenn es fertig ist simultenously? Aber das ist nicht die eigentliche Frage in diesem Thema, aber Sie können fügen Sie einen Hinweis in Ihrer Antwort, die Bewältigung dieser.

Updates:

Nachdem ich gemerkt habe, dass meine consumer-thread war mit busy-spin, das habe ich behoben mit Schlafen für 3 Sekunden. Dieses Update ist nur vorübergehend, und bald werde ich verwenden Event statt. Aber auch mit Schlafendie CPU-Nutzung sank um 30-40%, und gelegentlich geht es bis zu 50%, das scheint nicht erwünscht zu sein, aus der usability-Sicht, wie das system reagiert nicht auf die anderen Anwendungen, in denen der Benutzer derzeit arbeitet.

Gibt es eine Möglichkeit, die ich noch verbessern könnte an der hohen CPU-Auslastung? Wie bereits gesagt, die Produzenten-thread (was nutzt nun die meisten CPU-Zyklen) liest eine Datei ein, analysiert die Pakete (von einigen-format) und erzeugt Muster aus Ihnen. Wenn ich Schlaf, dann die CPU-Auslastung verringern würde, aber würde es eine gute Idee sein? Was sind die häufigsten Wege um es zu lösen?

InformationsquelleAutor der Frage Nawaz | 2012-02-14

Schreibe einen Kommentar