• 1. VS@Vince zhaowenyx@qq.com
  • 2. BriefNetty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Apache MINA is a network application framework which helps users develop high performance and high scalability network applications easily. It provides an abstract event-driven asynchronous API over various transports such as TCP/IP and UDP/IP via Java NIO.
  • 3. selectorchannelclientclientclientclientclientclientacceptProcess ThreadProcess ThreadProcess ThreadProcess ThreadProcess ThreadSimpleIoProcessorPoolCreateCreate sessionsocketsMina线程模型
  • 4. Mina中的线程IoAcceptor/IoConnector线程 IoProcessor线程 IoHandler线程
  • 5. IoAcceptor/IoConnector线程IoAcceptor用于监听客户端的连接,每监听一个端口建立一个线程。IoConnector用于与服务端建立连接,每连接一个服务端就建立一个线程。
  • 6. IoProcessor线程对于一个IoAcceptor或IoConnector线程对应一个IoProcessor线程用于IO的处理,这个IoProcessor线程从IoProcessor线程池中取出。IoProcessor线程池的大小默认为机器的CPU核数+1。
  • 7. IoHandler线程当我们在过滤器链中没有添加“threadPool”过滤器,则业务逻辑处理和IoProcessor使用同一个线程。如果设置了“threadPool”过滤器,则使用设置的线程池产生线程进行业务逻辑处理。
  • 8. 各种线程的产生当 IoAcceptor/IoConnector实例创建的时候,同时一个关联在IoAcceptor/IoConnector上的IoProcessor线程池也被创建。 当IoAcceptor/IoConnector建立套接字(IoAcceptor 的bind()或者是IoConnector 的connect()方法被调用)时,从线程池中取出一个线程,监听套接字端口。 当 IoAcceptor/IoConnector监听到套接字上有连接请求时,建立IoSession 对象,从IoProcessor池中取出一个IoProcessor线程执行IO处理。 如若过滤器中配置了“threadPool”过滤器,则使用此线程池建立线程执行业务逻辑(IoHandler)处理,否则使用IoProcessor线程处理业务逻辑。
  • 9. 线程查看工具:visualvm
  • 10. 常用的Reactor线程模型Reactor单线程模型 Reactor多线程模型 主从Reactor多线程模型
  • 11. Reactor单线程模型 对于一些小容量应用场景,可以使用单线程模型。但是对于高负载、大并发的应用却不合适。当NIO线程负载过重之后,处理速度将变慢,这会导致大量客户端连接超时,超时之后往往会进行重发,这更加重了NIO线程的负载,最终会导致大量消息积压和处理超时,NIO线程会成为系统的性能瓶颈。clientclientclientDispactherReactor ThreadAcceptorHandler1Handler2Handler3Handler4Read decodeWrite encode
  • 12. Reactor多线程模型clientclientclientReactor ThreadAcceptorHandler1Handler2Handler3Handler4 Read decodeWrite encodeReactor Thread PoolDispacther
  • 13. Multiple Reactors模式
  • 14. 主从Reactor多线程模型clientclientclientAcceptorNIO-Thread1NIO-Thread2Handler3Handler4Read decodeWrite encodeMain Reactor Thread Pool(Acceptor Pool)DispactherSub Reactor Thread Pool(IO Pool)NIO-Thread3AuthHandler4Read decodeDispactherRegisterRead decode
  • 15. Netty中的Reactor模式ClientClientClientEventLoopGroup:bossGroupAcceptorEventLoopGroup:workerGroupHandlerHandlerHandlerChannelHandlerHandlerHandlerHandler
  • 16. (本页无文本内容)
  • 17. 异步/中断中断向量表 中断服务函数 中断优先级 水平触发 高电平/低电平 垂直触发 高->低(下降沿)/低->高(上升沿)
  • 18. 核心态与用户态核心态:当CPU正在运行内核代码时(内核代码是共享的)。 用户态:当CPU正在运行用户代码时。 内核态与用户态是操作系统的两种运行级别,intel cpu提供Ring0-Ring3三种级别的运行模式。Ring0级别最高,Ring3最低。
  • 19. Linux使用了Ring3级别运行用户态,Ring0作为内核态,没有使用Ring1和Ring2。Ring3状态不能访问Ring0的地址空间,包括代码和数据。Linux进程的4GB地址空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据。用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过 write,send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执 行这些代码完成操作,完成后,切换回Ring3,回到用户态。这样,用户态的程序就不能随意操作内核地址空间,具有一定的安全保护作用。
  • 20. IO多路复用(Linux2.6)Select(Mina与Netty原始方案) Poll epoll(JDK6后默认开启)
  • 21. select最大并发数限制,因为一个进程所打开的 FD (文件描述符)是有限制的,由 FD_SETSIZE 设置,默认值是 1024/2048 ,因此 Select 模型的最大并发数就被相应限制了。 效率问题,select 每次调用都会线性扫描全部的 FD 集合,这样效率就会呈现线性下降,把 FD_SETSIZE 改大的后果就是,大家都慢慢来。 内核 / 用户空间内存拷贝问题,select 采取了内存拷贝方法。
  • 22. epollepoll 没有最大并发连接的限制,上限是最大可以打开文件的数目,这个数字一般远大于 2048, 一般来说这个数目和系统内存关系很大 ,具体数目可以 cat /proc/sys/fs/file-max 察看。 效率提升, epoll 最大的优点就在于它只管你“活跃”的连接 ,而跟连接总数无关,因此在实际的网络环境中, epoll 的效率就会远远高于 select 和 poll 。 内存拷贝, epoll 在这点上使用了“共享内存 ”,这个内存拷贝也省略了。
  • 23. Netty的结构最底层:buffer模块传统Buffer的读写方式: 将数据写入Buffer,flip()一下,然后将数据读出来 Netty中Buffer的读写改变: 1、Zero-Copy-Capable 2、ChannelBuffer中的readerIndex和writerIndex: Netty中的buffer是完全重新实现的,与NIO ByteBuffer不同的是,它内部保存了一个读指针readerIndex和一个写指针writerIndex,可以同时进行读和写,而不需要使用flip()进行读写切换。
  • 24. Zero-Copy-Capable 这里可以看到,TCP层HTTP报文被分成了两个ChannelBuffer,这两个Buffer对我们上层的逻辑(HTTP处理)是没有意义的。但是两个ChannelBuffer被组合起来,就成为了一个有意义的HTTP报文,这个报文对应的ChannelBuffer,才是能称之为”Message”的东西。这里用到了一个词”Virtual Buffer”,也就是所谓的”Zero-Copy-Capable Byte Buffer”了。
  • 25. 几种序列化协议比较
  • 26. Netty中的protoBuf类ProtoBufEncoder ProtoBufDecoder ProtoBufVarint32FrameDecoder ProtoBufVarint32LengthFieldPrepender
  • 27. Dubbo的10wTPS1K的复杂POJO对象 Netty + Thrift
  • 28. 参考资料mina2线程总结 http://blog.csdn.net/mrliu20082009/article/details/6990812 Netty 4.x学习笔记 – 线程模型 http://hongweiyi.com/2014/01/netty-4-x-thread-model/ Netty 4.x学习笔记 – Channel和Pipeline http://hongweiyi.com/2014/01/netty-4-x-channel-pipeline/ Netty 4.x学习笔记 – ByteBuf http://hongweiyi.com/2014/01/netty-4-x-bytebuf/ Netty-Mina深入学习与对比(一) http://ifeve.com/netty-mina-in-depth-1/ Netty系列之Netty线程模型 http://news.chinaunix.net/opensource/2014/0711/3182668.shtml