2009-04-01 10 views
2

Ich habe ein wirklich seltsames Problem mit einem .Net-Dienst.Multiprozessor und Leistung

Ich entwickelte einen Multithread-x64-Windows-Dienst.

Ich habe diesen Dienst in einem x64-Server mit 8 Kernen getestet. Die Leistung war großartig!

Jetzt habe ich den Dienst auf einen Produktionsserver (x64 - 32 Kerne) verschoben. Bei den Tests habe ich herausgefunden, dass die Leistung mindestens 10-mal schlechter ist als beim Testserver.

Ich habe viele Leistungsindikatoren überprüft, die versuchen, einen Grund für diese schlechte Leistung zu finden, aber ich konnte keinen Punkt finden.

Könnte ein GC-Problem sein? Haben Sie jemals ein solches Problem erlebt?

Vielen Dank im Voraus! Alexandre

+0

Klären: Wenn Sie die Affinität festlegen, so dass es nur auf 8 Kernen auf dem großen Computer ausgeführt wird, funktioniert es immer noch schlecht? Wenn nicht, dann ist es wahrscheinlich Speicherkonflikt. – MichaelGG

Antwort

0

Könnte es auf Unterschiede im Speicher oder der Festplatte zurückzuführen sein? Wenn es den Engpass gäbe, würden Sie den Wert für die zusätzliche Verarbeitungsleistung nicht erhalten. Kann nicht wirklich ohne weitere Details Ihrer Anwendung/Konfiguration sagen.

2

Es gibt viel zu viele Variablen, um zu wissen, warum eine Maschine langsamer ist als die andere. 32-Kern-Maschinen sind in der Regel spezialisierter, wo ein Acht-Kern könnte einfach eine Dual-Proc-Quad-Core-Maschine sein. Laufen gleichzeitig vm oder andere Dinge? In der Regel wird bei vielen Kernen die E/A-Bandbreite zum begrenzenden Faktor (selbst wenn die CPUs immer noch genügend Bandbreite haben).

Zu Beginn sollten Sie wahrscheinlich viele Timer in Ihrem Code (oder Profiling oder was auch immer) hinzufügen, um herauszufinden, welcher Teil Ihres Codes die meiste Zeit beansprucht.

Leistung troublshooting 101: was der Engpass ist (wo im Code und welche Subsystem (Speicher, Festplatte, CPU))

1

Es gibt so viele Faktoren hier:

  • sind Sie eigentlich mit die Kerne?
  • sind Ihre zusätzlichen Threads Sperrprobleme offensichtlicher zu sein?
  • Haben Sie nicht genug Speicher, um alle zusätzlichen Stapel/Daten zu verarbeiten, die Sie verarbeiten können?
  • kann Ihr IO (Festplatte/Netzwerk/Datenbank) Stack mit dem Durchsatz Schritt halten?

etc

9

Dies ist ein häufiges Problem, das Menschen in der Regel nicht bewusst sind, weil nur sehr wenige Menschen Erfahrung auf vielen CPU-Maschinen haben.

Das grundlegende Problem ist die Konkurrenz.

Mit zunehmender CPU-Anzahl steigt die Anzahl der Konflikte in allen gemeinsam genutzten Datenstrukturen. Bei niedrigen CPU-Zahlen ist die Konkurrenz gering und die Tatsache, dass Sie mehrere CPUs haben, verbessert die Leistung. Wenn die CPU-Anzahl deutlich größer wird, beginnt die Konkurrenz, Ihre Leistungsverbesserungen zu übertönen; Wenn die CPU-Zählung groß wird, beginnt die Konkurrenz tatsächlich , was die Leistung unter die einer niedrigeren Anzahl von CPUs reduziert.

Sie stehen im Grunde einem der Aspekte des Skalierbarkeitsproblems gegenüber.

Ich bin mir nicht sicher, aber wo dieses Problem liegt; in Ihren Datenstrukturen oder in den Betriebssystemdatenstrukturen. Erstere können Sie ansprechen - Lock-Free-Datenstrukturen sind ein exzellenter, hochskalierbarer Ansatz. Letzteres ist schwierig, da es im Wesentlichen die Vermeidung bestimmter Betriebssystemfunktionen erfordert.

+0

Ich streite nicht mit irgendetwas davon, aber für eine 10-fache Verlangsamung (anstatt eines enttäuschenden Mangels an Verbesserung) würde ich anfangen, nach etwas Grundlegenderem als Lock-Verrücktheit zu suchen. (Netzwerk- oder Festplattenprobleme zum Beispiel) –

+0

Ich verstehe Ihre Zurückhaltung, aber wenn Sie unangemessene Datenstrukturen auf vielen CPU-Plattformen ausführen, verbringen Sie fast Ihre gesamte Zeit in destruktiven Konflikten. Es ist ein Killer - und stellen Sie sich vor, wie es sein wird, wenn Intel in zwei Jahren die 80-Kern-CPU herausbringt. Die Software ist nicht bereit. –

+0

Also ich bin glücklich, seine Probleme auf diese zu schreiben. Da ich natürlich nichts über seine Software weiß, kann er natürlich auch andere Arten von Problemen haben. –

0

Da viele Threads gleichzeitig ausgeführt werden, müssen Sie sehr vorsichtig sein, um Probleme mit Threads zu vermeiden, die miteinander kämpfen, um auf Ihre Daten zuzugreifen. Lesen Sie weiter unter Non-blocking synchronization.

0

Wie viele Threads verwenden Sie? Die Verwendung von zu vielen Threadpool-Threads kann zu einem Thread-Hunger führen, wodurch Ihr Programm langsamer wird.

Einige Artikel: http://www2.sys-con.com/ITSG/virtualcd/Dotnet/archives/0112/gomez/index.html http://codesith.blogspot.com/2007/03/thread-starvation-in-shared-thread-pool.html

(für Gewinde Hunger in ihnen suchen)

Sie eine .NET-Profiler verwenden könnte Ihre Flaschenhälse zu finden, sind hier eine gute kostenlose ein: http://www.eqatec.com/tools/profiler

0

Ich stimme mit Blank überein, es ist wahrscheinlich eine Art von Streit. Es ist wahrscheinlich, dass es sehr schwer ist, es zu finden, leider. Es könnte in Ihrem Anwendungscode, dem Framework, dem Betriebssystem oder einer Kombination davon sein. Am wahrscheinlichsten ist Ihr Anwendungscode, da Microsoft erhebliche Anstrengungen unternommen hat, um die CLR und das Betriebssystem auf 32P-Boxen zu skalieren.

Der Konflikt könnte in einigen Hot-Locks sein, aber es könnte sein, dass einige Prozessor-Cache-Zeilen zwischen CPUs hin und her schwappen.

Was ist Ihre Metrik für 10x schlechter? Durchsatz?

Haben Sie versucht, die 32-proc-Box mit weniger CPUs zu booten? Verwenden Sie die Option /NUMPROC in boot.ini oder BCDedit.

Erzielen Sie 100% CPU-Auslastung? Wie lautet die Kontextwechselrate? Und wie ist das mit der 8P Box zu vergleichen?

Verwandte Themen