2010-04-04 4 views
29

Ich möchte eine umfassende Checkliste für Java Low-Latency-Anwendung erstellen. Kannst du deine Checkliste hier hinzufügen?Wie lautet Ihre Entwicklungscheckliste für Java-Anwendungen mit niedriger Latenz?

Hier ist meine Liste
1. Ihre Objekte unveränderlich
2. Versuchen Stellen synchronisierte Methode sollte
3. Sperren zu reduzieren, um gut dokumentiert und sorgfältig
4. Verwenden Profiler
5 behandelt . Amdhal Gesetz, und finden sie die sequentiellen Ausführungspfad
6. Verwenden sie Java 5 Gleichzeitigkeit Dienstprogramme und Schlösser
7. vermeiden sie Themen-Prioritäten, wie sie Plattform abhängig sind
8. JVM Warm-up kannGebrauch verwendet werden 9. Bevorzugen unfairen Sperrstrategie
10. Vermeiden kontextSchalt Warnungen (viele Threads zu kontraproduktiv führen)
11. Vermeiden Boxen, un-Boxen
12. Gib Aufmerksamkeit
13. Anzahl der Threads Compiler sollte gleich oder kleiner als die Anzahl der Kern

Low-Latency-Anwendung ist für jede Millisekunden abgestimmt.

+2

Viele Menschen schreiben Java-Anwendungen mit niedriger Latenz, die in weniger als 1 ms antworten. Niedrige Latenz in Java bedeutet für mich eine Untermillisekunde. –

+0

Danke, ich habe mich geändert. –

+0

* "6. Sperren verwenden" * => oder noch besser, versuchen Sie, Ihren Algorithmus frei zu sperren. – assylias

Antwort

0

Verwenden Sie StringBuilder anstelle von String beim Generieren von großen Strings. Zum Beispiel Abfragen.

+2

macht nur Sinn, wenn Sie etwas mit dem String, z. Verketten anderer Strings oder Reversieren oder dergleichen. – Tedil

+1

Es macht normalerweise keinen Unterschied. Die Bytecodes, die der Java-Compiler für String-Verkettungen generiert, verwenden StringBuilders! –

+0

Verkettung in einer Schleife (oder mehreren Anweisungen) ist der übliche Fall, in dem expliziter 'StringBuilder' gewinnt. –

6

Obwohl Unveränderlichkeit gut ist, wird es nicht unbedingt Latenz verbessern. Die Gewährleistung niedriger Latenz ist wahrscheinlich plattformabhängig.

Neben der allgemeinen Leistung ist das GC-Tuning sehr wichtig. Die Reduzierung der Speichernutzung wird GC helfen. Insbesondere, wenn Sie die Anzahl von Objekten im mittleren Alter, die bewegt werden müssen, reduzieren können - halten Sie das Objekt entweder langlebig oder kurzlebig. Vermeiden Sie auch etwas, das die Dauerwelle berührt.

+0

Hawtin, verwendet keine unveränderlichen Datenstrukturen Latenz, wenn Sie nicht um geteilte Daten synchronisieren müssen? –

+0

das ist wahrscheinlich die beste Antwort hier – bestsss

5

Vermeiden Sie Boxen/Unboxing, verwenden Sie möglichst primitive Variablen.

+0

Wertvoller Punkt. –

0

Eine weitere wichtige Idee besteht darin, zuerst die Leistung zu ermitteln, dann die Leistung zu messen, eventuelle Engpässe zu isolieren, zu optimieren und dann erneut zu messen, um die Verbesserung zu überprüfen.

Wie Knuth sagte, ist "vorzeitige Optimierung die Wurzel allen Übels".

+1

Der Erfolg oder Misserfolg einer Anwendung hängt nur von der Leistung ab. Obwohl eine vorzeitige Optimierung falsch ist, wird diese Regel nicht für jede Anwendung geeignet sein. Anwendungen mit geringer Latenz müssen mit bestimmten Richtlinien erstellt werden. –

+1

Ich mochte immer "Lass es zuerst funktionieren, bevor du es schnell arbeiten lässt". – Oversteer

+1

Ich denke gerne daran, dass Knuth den größten Teil seines Lebens der algorithmischen Effizienz gewidmet hat. :) –

4

Vermeiden Kontext, wo immer möglich, auf dem Nachrichtenverarbeitungspfad Schalt Consequence: Verwenden Sie NIO und Einzelereignisschleife Gewinde (Reaktor)

+0

Danke, dein wertvoller Punkt ist hinzugefügt. –

1

Sie mehr Threads in Ihrer Anwendung nicht planen, als Sie Kerne auf der darunter liegenden Hardware. Beachten Sie, dass das Betriebssystem Thread-Ausführung und möglicherweise andere Dienste erfordert, die dieselbe Hardware verwenden. Daher muss Ihre Anwendung möglicherweise weniger als die maximal verfügbare Anzahl von Prozessorkernen verwenden.

+1

Dies gilt für rechenintensive Aufgaben, nicht unbedingt für blockierende/IO/andere Aufgaben, bei denen mehr Threads sinnvoll sind. Wenn Sie mehr Threads als Kerne haben, müssen Sie sie jedoch so "heranzuführen", dass die rechenintensiven von den blockierenden getrennt werden. –

2

Messen, messen und messen. Verwenden Sie so nahe wie möglich an realen Daten, und zwar so nah wie möglich an der Produktionshardware, um regelmäßig Benchmarks ausführen zu können. Anwendungen mit niedriger Latenz werden oft besser als Appliances betrachtet. Sie müssen also die gesamte Box berücksichtigen, die nicht nur für die bestimmte Methode/Klasse/Paket/Anwendung/JVM usw. bereitgestellt wird.Wenn Sie bei der Produktion keine realistischen Benchmarks erstellen, werden Sie in der Produktion überrascht sein.

4

Vermeiden Sie umfangreiche Sperren und Multithreading, um die erweiterten Funktionen moderner Prozessoren (und ihrer Caches) nicht zu beeinträchtigen. Dann können Sie einen einzelnen Thread bis zu seinen unglaublichen Grenzen (6 Millionen Transaktionen pro Sekunde) mit sehr niedriger Latenz verwenden.

Wenn Sie eine reale Welt mit niedriger Latenz Java-Anwendung mit genügend Details über die Architektur zu sehen, einen Blick auf LMAX:

The LMAX Architecture

0

Ich denke „nur veränderbare Objekte verwenden, wo angemessen“ ist besser als "Mach deine Objekte unveränderlich". Viele Anwendungen mit sehr niedriger Latenz haben Pools von Objekten, die sie zur Minimierung von GC wiederverwenden. Unveränderliche Objekte können auf diese Weise nicht wiederverwendet werden. Zum Beispiel, wenn Sie eine Location-Klasse haben:

class Location { 
    double lat; 
    double lon; 
} 

Sie können einige auf bootup erstellen und verwenden sie immer und immer wieder, so dass sie nie Zuweisungen und die anschließende GC verursachen.

Dieser Ansatz ist viel komplizierter als die Verwendung eines unveränderlichen Standortobjekts, daher sollte es nur dort verwendet werden, wo es benötigt wird.

0

Zusätzlich zu den hier empfohlenen Entwickler-Level-Lösungen kann es auch sehr nützlich sein, beschleunigte JIT-Laufzeiten zu berücksichtigen, z. B. Zing und Off-Heap-Speicherlösungen wie Teracotta BigMemory, Apache Ignite, um Stop-the-World-GC-Pausen zu reduzieren. Wenn einige GUI mit binären Protokollen wie Hessian, ZERO-C ICE statt Webservice usw. beteiligt sind, ist sehr effektiv.

Verwandte Themen