Tomcat
体系结构
Tomcat 服务器是由一系列可配置的组件构成的,其中核心组件是 Catalina Servlet 容器,它是所有其他组件的顶层容器。
Tomcat 7 conf/server.xml 配置文件:
<Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost"> <Context path="" docBase="WORKDIR" reloadable="true"/> </Host> </Engine> </Service> </Server>
(1)Server 表示整个的Catalina Servlet容器,可以包含一个或多个 Service 组件。
(2)Service 组件将一个或多个连接器组件(Connector)绑定到一个 Servlet 引擎(Engine)上。
(3)Connector 组件负责与客户端建立连接,接收客户端请求,以及返回响应结果给客户端。
(4)Engine 组件从 Connector 接收和处理所有的请求,并将响应返回给 Connector。每个 Service 组件只能包含一个 Engine。
(5)Host 表示一个虚拟主机,一个引擎可以包含多个 Host。
(6)Context 表示一个 Web 应用程序,运行在特定的虚拟主机中。一个 Host 可以包含一个或多个 Context。
性能优化
Tomcat 默认参数是为开发环境制定,不适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈。
(1)内存优化
主要是对 JVM 堆内存优化,我们可以在 Tomcat 的启动脚本 catalina.sh 中设置 JAVA_OPTS 参数。
JAVA_OPTS="-server -Xms4096m -Xmx4096m -Xss512k -Xmn512m -XX:MaxPermSize=256m -Djava.awt.headless=true"
-
-server 启用 JDK 的 server 版本。
-
-Xms JVM初始化时堆的内存大小。
-
-Xmx JVM可使用堆的最大内存。
-
-Xss 每个线程的堆栈大小。
-
-Xmn 年轻代大小。
-
-XX:MaxPermSize 持久代大小。
(2)线程优化
Connector 接收客户端连接请求,然后分配线程让 Engine 来处理这个请求。Engine 处理完请求后,通过 Connector 将响应结果返回给客户端。
默认配置下,Tomcat 会为每个 Connector 创建一个绑定的线程池,一个线程用来处理一个请求。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="800" acceptCount="400" minSpareThreads="25"/>
-
maxThreads:处理请求的最大线程数,默认值是 200。
-
acceptCount:无可用线程时,新建立的连接进入队列等待 ,队列满时连接请求将被拒绝。默认值是 100。
-
minSpareThreads:始终保持活跃状态的最小线程数,默认值是 10。
-
connectionTimeout:Connector 与客户端建立连接到客户端提交URI的时间。超过这个时间,连接将会被断开。单位:毫秒,默认值是 20000。
运行模式
Connector 通过 protocol 属性来指定 Tomcat 运行模式,包括 BIO,NIO,AIO,APR。
默认值与 Tomcat 版本有关,Tomcat 7 以下版本默认运行 BIO 模式,Tomcat 8 以上版本默认运行 NIO 模式。
-
BIO(同步阻塞 I/O) 一个连接一个线程,即客户端有连接请求时,Connector 启动一个线程进行处理。
-
NIO(同步非阻塞 I/O) 一个请求一个线程,即客户端发送的连接请求会注册到多路复用器上,轮询到连接有 I/O 请求时启动一个线程进行处理。
-
AIO(异步非阻塞 I/O) 一个有效请求一个线程,客户端的 I/O 请求由操作系统完成后,再通知应用程序启动线程进行处理。
-
APR(Apache 可移植运行库) Tomcat 以 JNI 的形式调用 Apache HTTP 服务器的核心动态链接库来处理文件读取或网络传输操作,大大提高了 Tomcat 对静态文件的处理性能,是运行高并发应用的首选模式。
Tomcat 7 运行模式由 BIO 修改为 NIO:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443"/>