2010-12-22 7 views
1


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

-1

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.

+0

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

+0

Können Sie bestätigen, dass RTL_CRITICAL_SECTION_DEBUG.ContentionCount die gleiche Bedeutung seit Windows XP bis Windows 7 hat? – jesse

+0

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

0

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.

0

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.

+0

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

Verwandte Themen