编辑
2023-11-08
Tomcat源码学习
00
请注意,本文编写于 549 天前,最后修改于 549 天前,其中某些信息可能已经过时。

AprEndPoint是Tomcat中的一个组件,用于处理网络连接。它是基于APR(Apache Portable Runtime Libraries)库实现的,通过调用JNI(Java Native Interface)来调用本地的APR库,从而提供跨平台的操作系统接口。AprEndPoint与NioEndPoint类似,都实现了非阻塞I/O,但是AprEndPoint通过调用本地库实现非阻塞I/O,而不是使用Java的NIO API。

AprEndPoint的工作过程如下:

  1. Acceptor:Acceptor的作用是监听连接并建立连接。它通过调用JNI调用操作系统的API来实现,具体包括socket、bind、listen和accept。Acceptor将接收到的新连接交给Poller处理。

  2. Poller:Poller的作用是查询I/O事件。与NioEndPoint不同,AprEndPoint的Poller不是通过调用Java NIO的Selector来查询Socket的状态,而是通过JNI调用APR中的poll方法,APR再调用操作系统的epoll API来实现。在AprEndPoint中,还可以配置一个参数deferAccept,它对应TCP协议中的TCP_DEFER_ACCEPT,设置这个参数后,当TCP客户端有新的连接请求到达时,TCP服务端先不建立连接,而是等待一段时间再建立连接,这样可以优化性能。

  3. SocketProcessor:SocketProcessor负责处理Socket的读写操作。它从Poller获取到的Socket交给Http11Processor处理。

  4. Http11Processor:Http11Processor负责处理HTTP协议的请求和响应。它解析HTTP请求,调用相应的Servlet进行处理,并生成HTTP响应返回给客户端。

AprEndPoint的优化方面:

  • 使用DirectByteBuffer缓冲区:AprEndPoint使用DirectByteBuffer来减少数据拷贝次数,提高性能。DirectByteBuffer是在本地内存中分配的,可以直接读取本地内存,避免了数据从内核到用户态的拷贝。

  • 零拷贝技术:通过使用sendfile来实现零拷贝技术,避免了数据在用户态和内核态之间的多次拷贝,提高性能。


Learn more:

  1. Tomcat(五)网络连接器-AprEndPoint_莫失莫忘hh的博客-CSDN博客
  2. AprEndpoint组件:Tomcat APR提高I/O性能的秘密 - hochan_100 - 博客园
  3. AprEndpoint (Tomcat API Documentation)

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!