前面几个章节基本上把和netty相关的知识点都介绍了一遍,零碎的知识都学会了,就需要总结一下,为什么netty的性能如此之高?有哪些思想是可以给开发者借鉴的? 记下来就概括一下:
异步非堵塞通信:Netty的IO线程NioEventLoop因为聚合了多路复用器Selector
零拷贝:
>>Netty的接收和发送ByteBuffer採用DIRECT BUFFERS:相比于堆外直接内存,消息在发送过程中多了一次缓冲区的内存拷贝
>>Netty提供了组合Buffer对象:避免了传统通过内存拷贝的方式将几个小Buffer合并成一个大的Buffer
>>Netty的文件传输採用了transferTo方法:它能够直接将文件缓冲区的数据发送到目标Channel,避免了传统通过循环write方式导致的内存拷贝问题
内存池:更加灵活高效的管理内存分配
无锁化的串行设计理念:
>>消息的处理尽可能在同一个线程内完毕
>>期间不进行线程切换。这样就避免了多线程竞争和同步锁
高效的并发编程:
>>volatile的大量、正确使用
>>CAS和原子类的广泛使用
>>线程安全容器的使用
>>通过读写锁提升并发性能
高性能的序列化框架:
>>序列化后的码流大小(网络带宽的占用)
>>序列化&反序列化的性能(CPU资源占用)
>>是否支持跨语言(异构系统的对接和开发语言切换)
灵活的TCP參数配置能力:ChannelOption
& TCP_NODELAY
>>是否启用Nagle算法,改算法将小的碎片数据连接成更大的报文来最小化所发送的报文的数量
>>如果需要发送一些较小的报文,则需要禁用该算法,从而最小化报文传输延时
& SO_LINGER
>>关闭Socket的延迟时间,默认值为-1,表示禁用该功能
>>使用默认值,不做设置
& SO_SNDBUF
>>cat /proc/sys/net/ipv4/tcp_smem查询其大小
>>缓冲区大小=网络带宽*网络时延
>>TCP数据发送缓冲区大小,即TCP发送滑动窗口
& SO_RCVBUF
>>缓冲区大小=网络带宽*网络时延
& SO_REUSEADDR
>>是否复用处于TIME_WAIT状态连接的端口,适用于有大量处于TIME_WAIT状态连接的场景,如高并发量的Http短连接场景等
& SO_BACKLOG
>>Backlog主要是指当ServerSocket还没执行accept时,这个时候的请求会放在os层面的一个队列里,这个队列的大小即为backlog值
>>backlog的默认值为os对应的net.core.somaxconn,调整backlog队列的大小一定要确认ulimit -n中允许打开的文件数是够的
& SO_KEEPALIVE
>>是否保持长连接状态
高效的Reactor线程模型
& Reactor单线程模型
>>作为NIO服务端,接收client的TCP连接
>>作为NIOclient。向服务端发起TCP连接
>>读取通信对端的请求或者应答消息
>>向通信对端发送消息请求或者应答消息
& Reactor多线程模型
>>有专门一个NIO线程-Acceptor线程用于监听服务端,接收client的TCP连接请求
>>网络IO操作-读、写等由一个NIO线程池负责
>> 1个NIO线程能够同一时候处理N条链路。可是1个链路仅仅相应1个NIO线程,防止发生并发操作问题。
& 主从Reactor多线程模型
>>服务端用于接收client连接的不再是个1个单独的NIO线程。而是一个独立的NIO线程池
上面这些基本是能够支持netty有高性能的一些保证和依据,有些思想是可以借鉴的,比如'内存零拷贝'这个特性很重要..