2010-07-13 7 views
8

ich gelesen habe ein Blog vor einer Weile Post eine Java-Anwendung behauptet, besser lief, als es erlaubt war eine einzelne CPU in einem Multi-Core-Maschine zu verwenden: http://mailinator.blogspot.com/2010/02/how-i-sped-up-my-server-by-factor-of-6.htmlJvm auf Multi-Core-

Welche Gründe könnte es für eine Java-Anwendung sein, , laufen auf Multicore-Rechnern, um viel langsamer als auf einer einzelnen Kernmaschine zu laufen?

+0

Es gibt eine ganze Reihe vielversprechender Links für [Java, Performance und Multi-Core] (http://www.google.com/search?q=java+performance+multi+core). Können Sie eine Notiz hinterlassen, wenn dieser Blogeintrag auf der Liste steht? –

Antwort

8

Wenn zwischen freigegebenen Ressourcen in den verschiedenen Threads erhebliche Konflikte bestehen, könnte das Sperren und Entsperren von Objekten eine große Menge an IPI Interprozessor-Interrupts erfordern und die Prozessoren könnten mehr Zeit mit dem Verwerfen ihrer L1- und L2-Caches verbringen und erneutes Abrufen von Daten von anderen CPUs, als sie tatsächlich zur Lösung des vorliegenden Problems benötigen.

Dies kann ein Problem sein, wenn die Anwendung Weg too-fine-grained locking hat. (Ich habe es einmal summiert "es hat keinen Sinn, mehr als eine Sperre pro CPU-Cache-Zeile", die definitiv wahr und vielleicht noch zu feinkörnig ist.)

Java "jedes Objekt ist ein Mutex" könnte führen zu zu viele Sperren im laufenden System, wenn zu viele leben und streiten.

Ich habe keinen Zweifel, jemand könnte absichtlich eine solche Anwendung schreiben, aber es ist wahrscheinlich nicht sehr häufig. Die meisten Entwickler würden ihre Anwendungen schreiben, um Ressourcenkonflikte zu reduzieren, wo sie können.

+0

Das ignoriert [Amdahls Gesetz] (http://en.wikipedia.org/wiki/Amdahl%27s_law) und [Little's Gesetz] (http://en.wikipedia.org/wiki/Little%27s_law), die im Grunde kochen bis hin zu: Manche Dinge lassen sich nicht sehr gut in parallele Aufgaben aufteilen, unabhängig von Sprache/Umgebung. –

1

Ich bezweifle den "Much" Teil.

Meine Vermutung wäre, dass die Kosten des Verschiebens von einer CPU in eine andere hoch genug sind, um bemerkbar zu sein. Im Allgemeinen möchten Sie, dass Jobs auf der gleichen CPU bleiben, sodass die Daten so oft wie möglich lokal zwischengespeichert werden.

1

Dies ist völlig Spekulation ohne den Artikel/Daten in Frage, aber es gibt einige Arten von Programmen, die nicht gut für die Parallelisierung geeignet sind - vielleicht ist die Anwendung nie CPU-gebunden (dh die CPU ist nicht der Flaschenhals, vielleicht einige Art von I/O ist).

Allerdings ist diese Frage/Konversation ohne weitere Details ziemlich unbegründet.

1

Es gibt keinen Java-spezifischen Grund dafür, aber das Verschieben des Status von Core zu Core oder sogar von CPU zu CPU braucht Zeit. Diese Zeit kann besser genutzt werden, wenn der Prozess auf einem einzelnen Kern bleibt. Auch das Caching kann in solchen Fällen verbessert werden.

Dies ist jedoch nur relevant, wenn das Programm nicht mehrere Threads verwendet und somit seine Arbeit effektiv auf mehrere Cores/CPUs verteilen kann.

0

Neue Intel-CPUs haben Turbo Boost:

http://en.wikipedia.org/wiki/Intel_Turbo_Boost

+0

Das würde im schlimmsten Fall bedeuten, dass ein wirklich absurder (wenn nicht bösartiger) Taskplaner versuchen könnte, Dinge so zu arrangieren, dass Turbo Boost nicht eingreift - und ich bin mir nicht einmal sicher, ob er so manipuliert werden könnte. In jedem Fall würde es nie zu einem 6-fachen Leistungsunterschied kommen. –

+1

Ich stimme zu. Turbo Boost kommt nicht einmal annähernd auf das Sechsfache. – Puppy

0

Diese auf der Anzahl der Threads die Anwendung Spawns abhängig sein wird. Wenn Sie etwa vier Worker-Threads spawnen, die viel Zahlen verarbeiten, ist die App auf einem Quad-Core-Rechner fast viermal schneller, je nachdem, wie viel Buchhaltung und Zusammenführung Sie machen müssen.

1

Die Anwendung könnte blockierende Inter-Thread-Kommunikation sehr schlecht nutzen. Dies liegt jedoch ausschließlich an der Tatsache, dass die Anwendung außergewöhnlich schlecht programmiert ist.

Es gibt keinen Grund, warum auch nur mittelmäßig programmierte Multi-Core-Anwendungen mit einer mäßig parallelen Workload langsamer auf mehreren Kernen laufen sollten.

1

Aus einer reinen Performance-Perspektive besteht die Herausforderung oft im Speicher-Subsystem. Während also mehr CPUs oft gut sind, sind CPUs, die nicht in der Nähe des Speichers sind, in dem die Java-Objekte sitzen, sehr, sehr teuer. Es ist sehr maschinenspezifisch und hängt stark vom genauen Pfad zwischen jeder CPU und dem Speicher ab. Sowohl Intel als auch AMD haben hier verschiedene Formen/Geschwindigkeiten, und die Ergebnisse sind sehr unterschiedlich.

Siehe NUMA aus Gründen, warum Multi-Core möglicherweise behindern.

Wir haben Leistungsdeltas im Bereich von 30% oder mehr gesehen, abhängig davon, wie JVMs an Prozessoren angeheftet sind. SPECjbb2005 wird nun hauptsächlich im "Mehrfach-JVM" -Modus ausgeführt, wobei jede JVM aus diesem Grund einer bestimmten CPU/Speicher zugeordnet ist.

0

CPU haben oft eine Grenze, wie viel Wärme sie produzieren können. Dies bedeutet, dass ein Chip mit weniger Kern mit einer hohen Frequenz laufen kann, was dazu führen kann, dass ein Programm schneller läuft, wenn es den zusätzlichen Kern nicht effektiv verwendet. Heute liegt der Unterschied zwischen 4, 6 und 8 Kern, wo mehr Kerne einzeln langsamer sind. Ich kenne keine einzelnen Kernsysteme, die schneller sind als das schnellste 4-Kern-System.

+0

In dem Artikel hat der Autor seinen Server schneller gemacht, indem er es nur einer einzigen CPU zugewiesen hat statt 6 – IttayD

+0

Sie haben Recht, dass er all seine Prozesse einem Kern zuordnet. Wenn das funktioniert, hat er fast sicher ein Tuning-Problem, aber was es ist, ist unklar. –

1

Das JIT wird keine Speicherbarrieren enthalten, wenn es denkt, es läuft in einem einzigen Kern. Ich vermute, dass das in dem referenzierten Artikel passiert.

Hier ist eine sehr kurze Erklärung von Speicherbarrieren ist, sondern bietet auch eine saubere Technik, um den JIT'd Code des Sehens: http://www.infoq.com/articles/memory_barriers_jvm_concurrency

Dies wird nicht alle Anwendungen zu sagen, von profitieren würden auf einem einzigen gelegt Ader.