Meine Anwendung verwendet viele kritische Abschnitte, und ich möchte wissen, welche von ihnen zu hohen Konflikten führen kann. Ich möchte Engpässe vermeiden, um die Skalierbarkeit insbesondere bei Multi-Core-, Multi-Prozessor-Systemen zu gewährleisten.
Ich habe bereits eine versehentlich gefunden, als ich bemerkte, dass viele Fäden hängen blieben, während sie darauf warteten, in den kritischen Bereich zu gelangen, wenn die Anwendung unter starker Belastung stand. Das war ziemlich einfach zu beheben, aber wie kann man solche konfliktkritischen Abschnitte erkennen, bevor sie zu einem echten Problem werden?
Ich weiß, es gibt eine Möglichkeit, einen vollständigen Dump zu erstellen und diese Informationen von ihm zu bekommen (irgendwie?). Aber das ist eher aufdringlich. Gibt es Methoden, mit denen die Anwendung sich selbst diagnostizieren kann?
Ich könnte Daten aus der Struktur _RTL_CRITICAL_SECTION_DEBUG verwenden, aber es gibt Hinweise, dass dies in verschiedenen Windows-Versionen unsicher sein könnte: http://blogs.msdn.com/b/oldnewthing/archive/2005/07/01/434648.aspx Kann jemand eine zuverlässige und nicht zu komplexe Methode vorschlagen, um solche Informationen zu erhalten?Wie erkennen Sie kritische Teile mit hohem Konflikt?
Antwort
Worüber Sie sprechen, ist zwar sinnvoll, aber im Produktionscode nicht wirklich durchführbar.
Ich meine .. Sie können Dinge im Produktionscode tun, wie zum Beispiel die LockCount und RecursionCount Werte bestimmen (dies ist dokumentiert), RecursionCount von LockCount subtrahieren und presto, haben Sie die # von Threads warten auf ihre Hände auf die CRITICAL_SECTION-Objekt.
Vielleicht möchten Sie sogar tiefer gehen. Die RTL_CRITICAL_SECTION_DEBUG-Struktur ist im SDK dokumentiert. Das einzige, was sich in Bezug auf diese Struktur jemals geändert hat, war, dass einige reservierte Felder Namen erhielten und verwendet wurden. Ich meine .. es ist in den SDK-Kopfzeilen (winnt.h), dokumentierte Felder ändern sich nicht. Du hast Raymonds Geschichte falsch verstanden. (Er ist teilweise Schuld, er mag eine Sensation so viel wie der nächste Typ.)
Mein genereller Punkt ist, wenn es schwere Sperrkonflikt in Ihrer Anwendung ist, sollten Sie es auf jeden Fall herausfinden. Aber machen Sie den Code niemals in einem kritischen Abschnitt größer, wenn Sie ihn vermeiden können. Und das Lesen der Debug-Struktur (oder sogar lockcount/recursioncount) sollte nur passieren, wenn Sie das Objekt halten. Es ist in einer Debug/Test-Version in Ordnung, aber es sollte nicht in Produktion gehen.
Es gibt andere Möglichkeiten, neben kritischen Abschnitten (d. H. Semaphoren) mit Nebenläufigkeit umzugehen. Eine der besten Möglichkeiten ist die nicht blockierende Synchronisation. Das bedeutet, dass Sie Ihren Code so strukturieren müssen, dass er auch bei freigegebenen Ressourcen nicht blockiert werden muss. Sie sollten sich über Nebenläufigkeit informieren. Sie können hier auch ein Code-Snippet posten, und jemand kann Ihnen Tipps geben, wie Sie Ihren Übereinstimmungscode verbessern können.
Werfen Sie einen Blick auf Intel Thread Profiler. Es sollte helfen, solche Probleme zu erkennen.
Sie können Ihren Code auch instrumentieren, indem Sie kritische Abschnitte in einen Proxy einbetten, der Daten auf der Festplatte zur Analyse ablegt. Es hängt wirklich von der App selbst ab, aber es könnte zumindest die Information sein, wie lange der Thread auf die CS gewartet hat.
Thread Profiler ist ein leistungsfähiges Werkzeug, aber ich brauche eine leichte Methode, ohne den ganzen Code zu instrumentieren. Ich denke, ich werde RTL_CRITICAL_SECTION_DEBUG.ContentionCount verwenden. – jesse
- 1. Kritische Abschnitte mit Multicore-Prozessoren
- 2. Kritische Pfadanalyse
- 3. So erkennen Sie einen Konflikt zwischen zwei Git-Repositories.
- 4. Java - Grafik kritische Verbindungen
- 5. UIPanGestureRecognizer Konflikt mit scrollview
- 6. Kann Laravel Anwendungen mit hohem Traffic handhaben?
- 7. GraphicsMagick CGBI unbekannte kritische Brocken
- 8. Wie erkennen Sie Synchronisationsverletzungen mit Java
- 9. Alamofire Konflikt mit SugarRecord?
- 10. Fix boot disk kritische Nachricht
- 11. Antivirus-Konflikt mit Programm
- 12. PHP So behandeln Sie kritische Fehler auf einem Produktionsserver korrekt.
- 13. AlertController - Konflikt mit UIViewController
- 14. Konflikt mit jQuery Skripte
- 15. Kritische Abschnitte Speicher unter Vista/Win2008 undicht?
- 16. Assembly Konflikt mit Newtonsoft.Json
- 17. CrittercismIOS Konflikt mit MvvmCross
- 18. Konflikt mit DrawText-Funktion
- 19. Gibt es Cryptography-Bibliotheken mit hohem Abstraktionsgrad für C#?
- 20. Multithreading und kritische Abschnitte Verwendung - C++
- 21. Low-Speed-Netzwerk mit hohem Risiko der Trennung
- 22. Konflikt mit Stil und Sprintf
- 23. Wie mit in Konflikt stehenden Tastaturkürzeln umzugehen
- 24. Wie teile ich einen Cookie mit PHP
- 25. Angular UI Modal mit hohem Z-Index nicht oben
- 26. Javascript: Optimierung von Details für kritische/hochverarbeitete Javascript-Code
- 27. TSQL: Timeouts auf hohem Verkehr Tabelle
- 28. Streamen von Daten auf HDFS mit hohem Durchsatz
- 29. Wie kann ich einen Bestätigungsdialog für kritische Aktionen implementieren?
- 30. Javascript kritische Fehler, wenn Angular 2 Anwendung
Natürlich ist dies nicht für den Produktionscode, das ist eine Debugging-Sache. Ich frage nicht nach Ratschlägen zur Verbesserung der Synchronisierung, um Konflikte zu vermeiden. Ich komme damit klar. Ich bitte um Hilfe bei der Entscheidung, was optimiert werden muss. Ich habe Dutzende kritischer Abschnitte. Einige von ihnen werden selten verwendet, andere sind möglicherweise strittig. Ich möchte die Anwendung in Stresstests versetzen und sehen, welche kritischen Bereiche Engpässe sind. Sie sagen also, dass RTL_CRITICAL_SECTION_DEBUG dokumentiert ist.Meinst du es in SDK-Headern? Weil ich es in der MSDN-Dokumentation nicht finden kann. – jesse
Können Sie bestätigen, dass RTL_CRITICAL_SECTION_DEBUG.ContentionCount die gleiche Bedeutung seit Windows XP bis Windows 7 hat? – jesse
Es ist in den SDK-Kopfzeilen (winnt.h) und die Definition ändert sich nicht basierend auf der Zielversion festgelegt. Du bist sicher, es zu benutzen. – martona