2013-11-04 8 views
7

Wenn ich von Netty 3 auf Netty 4 umstelle, beträgt die Leistungsreduzierung etwa 45%.Netty 4 Leistungsabnahme

Ich verglich den Thread-Dump von Netty 3 und Netty 4 während Leistungstests. Es scheint, dass der Netty 4 Server mehr Zeit für die Schreiboperationen benötigt. Wenn ich jedoch einen auf Netty 4 basierenden Client mit einem auf Netty 3 basierenden Server verwende, beträgt die Leistungsreduzierung nur etwa 5%, also vermutete ich, dass der Grund auf der Serverseite liegt, aber ich kann den Grund nicht finden.

Kann mir jemand einen Rat geben? https://code.google.com/p/nfs-rpc/source/browse/#svn%2Ftrunk%2Fnfs-rpc-netty4

+1

Haben Sie versucht, Ihre Anwendung zu profilieren? Wenn ja, wo sind die Engpässe? –

+0

Welche Art von Thread-Pool verwenden Sie? hat sich dies zwischen der 3-> 4 Migration geändert? –

Antwort

3

Netty4 eingeführt, Sie stimmen Sie den Code vielleicht einen neuen Thread Modell sollte eine bessere Leistung zu erhalten:

Der Code kann unter folgender URL zu sehen. Hier sind einige Punkte von Netty Wiki, und es gibt mehr Änderungen in netty4.

Es gibt kein wohldefiniertes Thread-Modell in 3.x, obwohl versucht wurde, die Inkonsistenz in 3.5 zu beheben. 4.0 definiert ein striktes Thread-Modell, das einem Benutzer hilft, einen ChannelHandler zu schreiben, ohne sich um die Thread-Sicherheit zu sorgen.

Netty ruft die Methoden eines ChannelHandler nicht gleichzeitig auf, es sei denn, der ChannelHandler ist mit @Sharable annotiert. Dies ist unabhängig vom Typ der Handlermethoden - eingehende, ausgehende oder Lebenszyklus-Ereignisbehandlungsmethoden.

Ein Benutzer muss keine eingehenden oder ausgehenden Ereignishandlermethoden mehr synchronisieren.

4.0 nicht erlaubt Hinzufügen eines ChannelHandler mehr als einmal, es sei denn es ist mit @Sharable kommentiert.

Es gibt immer passiert-before-Beziehung zwischen jedem ChannelHandler-Methode Aufrufe von Netty gemacht.

Ein Benutzer muss kein flüchtiges Feld definieren, um den Status eines Handlers beizubehalten. Ein Benutzer kann einen EventExecutor angeben, wenn er einer ChannelPipeline einen Handler hinzufügt.

Wenn angegeben, werden die Handler-Methoden des ChannelHandler immer vom angegebenen EventExecutor aufgerufen.

Wenn nicht angegeben, werden die Handler-Methoden immer von EventLoop aufgerufen, dessen zugehöriger Channel registriert ist.

EventExecutor und EventLoop, die einem Handler oder einem Kanal zugewiesen sind, sind immer single-threaded.

Die Handler-Methoden werden immer vom selben Thread aufgerufen.

Wenn Multithread EventExecutor oder EventLoop angegeben ist, wird einer der Threads zuerst ausgewählt und dann wird der ausgewählte Thread bis zur Abmeldung verwendet.

Wenn zwei Handler in derselben Pipeline unterschiedliche EventExecutoren zugewiesen haben, werden sie gleichzeitig aufgerufen. Ein Benutzer muss auf die Threadsicherheit achten, wenn mehrere Handler auf gemeinsam genutzte Daten zugreifen, selbst wenn auf die gemeinsam genutzten Daten nur von den Handlern in derselben Pipeline zugegriffen wird. Die zu ChannelFuture hinzugefügten ChannelFutureListeners werden immer vom EventLoop-Thread aufgerufen, der dem zugeordneten Kanal der Zukunft zugewiesen ist.

Verwandte Themen