ネッティーに関連する知識を有する者、あなたはどのくらい知っています

原則ネッティー
ネッティーは、高性能、非同期イベント駆動型のNIOフレームワークである、API JAVA NIOベースの実装を提供します。これは、すべてのIO操作が非同期フューチャー・リスナーメカニズムにより、非ブロックされている非同期NIOフレームワーク、ネッティーとしてTCP、UDPおよびファイル転送のサポートを提供し、ユーザーが簡単に通知機構を介してアクティブなIO操作を取得したり、取得することができます結果。

網状高性能
IOプログラミングプロセスにおいて、アクセス要求がマルチスレッドまたはIOが多重化を使用して処理することができる複数のクライアントを処理する必要があります。IOは、IO複数の多重化によってブロックシステムは、シングルスレッドのクライアントが複数同時に要求するケースを扱うことができるように、選択同じブロックに多重。伝統的なマルチスレッド/マルチプロセスモデル比では、I / Oは、最大の利点を多重化する小規模なシステムのオーバーヘッドで、システムが新たな追加プロセスやスレッドを作成する必要はありません、還元、これらの保守プロセスとスレッドを実行する必要はありませんシステムメンテナンスは、システムリソースを節約し、ワークロード。

また、NIO SocketChannelへの対応とを有するソケットとサーバーソケットは、二つの異なるソケットチャネルのServerSocketChannelを実現提供します。

多重化された通信

次のように網状のアーキテクチャ及び反応器モード、そのサーバの通信シーケンスで実装されます。

ネッティーに関連する知識を有する者、あなたはどのくらい知っています
クライアントの通信シーケンス図は次のとおりです。
ネッティーに関連する知識を有する者、あなたはどのくらい知っています
ネッティーIOスレッドNioEventLoopセレクタは、重合マルチプレクサので、十分なIOを高めることができるチャンネルは、非ブロック読み取りおよび書き込み操作がされているので、同時クライアントの数百人を、扱うことができます頻繁なIOスレッドに起因する目詰まりを避けるために、スレッドの動作効率は、中断されています。

异步通讯 NIO

由于 Netty 采用了异步通信模式,一个 IO 线程可以并发处理 N 个客户端连接和读写操作,这从根本上解决了传统同步阻塞 IO 一连接一线程模型,架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。

零拷贝(DIRECT BUFFERS 使用堆外直接内存)

  1. Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲区的二次拷贝。如果使用传统的堆内存(HEAP BUFFERS)进行 Socket 读写,JVM 会将堆内存 Buffer 拷贝一份到直接内存中,然后才写入 Socket 中。相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝。

  2. Netty 提供了组合 Buffer 对象,可以聚合多个 ByteBuffer 对象,用户可以像操作一个 Buffer 那样方便的对组合 Buffer 进行操作,避免了传统通过内存拷贝的方式将几个小 Buffer 合并成一个大的Buffer。

  3. Netty的文件传输采用了transferTo方法,它可以直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环 write 方式导致的内存拷贝问题内存池(基于内存池的缓冲区重用机制)随着 JVM 虚拟机和 JIT 即时编译技术的发展,对象的分配和回收是个非常轻量级的工作。但是对于缓冲区 Buffer,情况却稍有不同,特别是对于堆外直接内存的分配和回收,是一件耗时的操作。为了尽量重用缓冲区,Netty 提供了基于内存池的缓冲区重用机制。

高效的 Reactor 线程模型

常用的 Reactor 线程模型有三种,Reactor 单线程模型, Reactor 多线程模型, 主从 Reactor 多线程模型。

Reactor 单线程模型

Reactor 单线程模型,指的是所有的 IO 操作都在同一个 NIO 线程上面完成,NIO 线程的职责如下:

1) 作为 NIO 服务端,接收客户端的 TCP 连接;

2) 作为 NIO 客户端,向服务端发起 TCP 连接;

3) 读取通信对端的请求或者应答消息;

4) 向通信对端发送消息请求或者应答消息。

ネッティーに関連する知識を有する者、あなたはどのくらい知っています

由于 Reactor 模式使用的是异步非阻塞 IO,所有的 IO 操作都不会导致阻塞,理论上一个线程可以独立处理所有 IO 相关的操作。从架构层面看,一个 NIO 线程确实可以完成其承担的职责。例如,通过Acceptor 接收客户端的 TCP 连接请求消息,链路建立成功之后,通过 Dispatch 将对应的 ByteBuffer派发到指定的 Handler 上进行消息解码。用户 Handler 可以通过 NIO 线程将消息发送给客户端。

Reactor 多线程模型

Rector 多线程模型与单线程模型最大的区别就是有一组 NIO 线程处理 IO 操作。 有专门一个NIO 线程-Acceptor 线程用于监听服务端,接收客户端的 TCP 连接请求; 网络 IO 操作-读、写等由一个 NIO 线程池负责,线程池可以采用标准的 JDK 线程池实现,它包含一个任务队列和 N个可用的线程,由这些 NIO 线程负责消息的读取、解码、编码和发送;

ネッティーに関連する知識を有する者、あなたはどのくらい知っています
主从 Reactor 多线程模型

服务端用于接收客户端连接的不再是个 1 个单独的 NIO 线程,而是一个独立的 NIO 线程池。Acceptor 接收到客户端 TCP 连接请求处理完成后(可能包含接入认证等),将新创建的SocketChannel 注册到 IO 线程池(sub reactor 线程池)的某个 IO 线程上,由它负责SocketChannel 的读写和编解码工作。Acceptor 线程池仅仅只用于客户端的登陆、握手和安全认证,一旦链路建立成功,就将链路注册到后端 subReactor 线程池的 IO 线程上,由 IO 线程负责后续的 IO 操作。
ネッティーに関連する知識を有する者、あなたはどのくらい知っています

无锁设计、线程绑定

シリアルロックフリーのデザインを使用してネッティーは、競争によるパフォーマンスの低下を避けるために、シリアルIOスレッド、マルチスレッド内で動作します。表面には、シリアル設計は、CPU利用率が同時実行の十分に高い程度ではないようです。モデルの仕事より良い性能を通す複数の - ただし、パラメータNIOスレッドプールのスレッドが同時に複数のスレッドを開始することができる調整することにより、パラレルシリアルキューのシリアライズ、そのような局在ロックスレッド設計と比較して実行します。

ネッティーに関連する知識を有する者、あなたはどのくらい知っています
NioEventLoop網状がメッセージを読んだ後、ダイレクトコールChannelPipeline fireChannelReadは(オブジェクトMSG)、長いユーザが自動的にスレッドを切り替えない限り、切り替えが行われたスレッド避けるシリアル化プロセスへのそのような方法の間、NioEventLoopハンドラによってユーザに呼び出すことはできませんロックマルチスレッド、パフォーマンスの観点からの操作による競争が最適です。

高性能フレームワーク配列

網状のデフォルトのGoogleいるProtobufインターフェイスのサポートを提供し、ユーザが網状コーデック拡張することにより、他の性能フレームワーク配列を実装することができる、例えば倹約は、バイナリフレームコーデック圧縮しました。

  1. SO_RCVBUFとSO_SNDBUF:推奨値は通常、128Kまたは256Kです。

ネットワークの輻輳を防止するための小さな封筒大型バッグ、

  1. SO_TCPNODELAYは:バッファ内のNagleアルゴリズム小さなパケットが自動的にそれによってネットワークアプリケーションの効率を向上させる、小さなパケット伝送ネットワーク輻輳の多数から大きなパケットを形成するように接続されています。しかし、遅延に敏感なアプリケーションのためのシナリオでは、最適化アルゴリズムを閉じる必要があります。

ハッシュ値とソフト割り込みCPUバウンド

  1. ソフト割り込み:ソフト割り込みは、ネットワークのスループットを向上させ、RPSを開いた後に達成することができます。RPSデータ・パケットの送信元アドレス、宛先アドレスおよび送信元ポートと宛先、ハッシュ値を計算し、各接続し、CPUに接続された上面図から、このハッシュ値に応じて動作するソフト割り込みCPUを選択セット、ハッシュ値によって、ネットワークのパフォーマンスを改善するためにソフト割り込みCPU並列処理の複数でバランスをとります。

継続的に更新さ............

おすすめ

転載: blog.51cto.com/14587687/2462783