一、Nio、Bio、APR
1、Connector的protocol
Connector在处理HTTP请求时,会使用不同的protocol。不同的Tomcat版本支持的protocol不同,其中最典型的protocol包括BIO、NIO和APR(Tomcat7中支持这3种,Tomcat8增加了对NIO2的支持,而到了Tomcat8.5和Tomcat9.0,则去掉了对BIO的支持)。
BIO是Blocking IO,顾名思义是阻塞的IO;NIO是Non-blocking IO,则是非阻塞的IO。而APR是Apache Portable Runtime,是Apache可移植运行库,利用本地库可以实现高可扩展性、高性能;Apr是在Tomcat上运行高并发应用的首选模式,但是需要安装apr、apr-utils、tomcat-native等包。
2、如何指定protocol
Connector使用哪种protocol,可以通过<connector>元素中的protocol属性进行指定,也可以使用默认值。
指定的protocol取值及对应的协议如下:
- HTTP/1.1:默认值,使用的协议与Tomcat版本有关
- org.apache.coyote.http11.Http11Protocol:BIO
- org.apache.coyote.http11.Http11NioProtocol:NIO
- org.apache.coyote.http11.Http11Nio2Protocol:NIO2
- org.apache.coyote.http11.Http11AprProtocol:APR
如果没有指定protocol,则使用默认值HTTP/1.1,其含义如下:在Tomcat7中,自动选取使用BIO或APR(如果找到APR需要的本地库,则使用APR,否则使用BIO);在Tomcat8中,自动选取使用NIO或APR(如果找到APR需要的本地库,则使用APR,否则使用NIO)。
3、BIO/NIO有何不同
无论是BIO,还是NIO,Connector处理请求的大致流程是一样的:
在accept队列中接收连接(当客户端向服务器发送请求时,如果客户端与OS完成三次握手建立了连接,则OS将该连接放入accept队列);在连接中获取请求的数据,生成request;调用servlet容器处理请求;返回response。为了便于后面的说明,首先明确一下连接与请求的关系:连接是TCP层面的(传输层),对应socket;请求是HTTP层面的(应用层),必须依赖于TCP的连接实现;一个TCP连接中可能传输多个HTTP请求。
在BIO实现的Connector中,处理请求的主要实体是JIoEndpoint对象。JIoEndpoint维护了Acceptor和Worker:Acceptor接收socket,然后从Worker线程池中找出空闲的线程处理socket,如果worker线程池没有空闲线程,则Acceptor将阻塞。其中Worker是Tomcat自带的线程池,如果通过<Executor>配置了其他线程池,原理与Worker类似。
在NIO实现的Connector中,处理请求的主要实体是NIoEndpoint对象。NIoEndpoint中除了包含Acceptor和Worker外,还是用了Poller,处理流程如下图所示(图片来源:http://gearever.iteye.com/blog/1844203)。
Acceptor接收socket后,不是直接使用Worker中的线程处理请求,而是先将请求发送给了Poller,而Poller是实现NIO的关键。Acceptor向Poller发送请求通过队列实现,使用了典型的生产者-消费者模式。在Poller中,维护了一个Selector对象;当Poller从队列中取出socket后,注册到该Selector中;然后通过遍历Selector,找出其中可读的socket,并使用Worker中的线程处理相应请求。与BIO类似,Worker也可以被自定义的线程池代替。
通过上述过程可以看出,在NIoEndpoint处理请求的过程中,无论是Acceptor接收socket,还是线程处理请求,使用的仍然是阻塞方式;但在“读取socket并交给Worker中的线程”的这个过程中,使用非阻塞的NIO实现,这是NIO模式与BIO模式的最主要区别(其他区别对性能影响较小,暂时略去不提)。而这个区别,在并发量较大的情形下可以带来Tomcat效率的显著提升:
目前大多数HTTP请求使用的是长连接(HTTP/1.1默认keep-alive为true),而长连接意味着,一个TCP的socket在当前请求结束后,如果没有新的请求到来,socket不会立马释放,而是等timeout后再释放。如果使用BIO,“读取socket并交给Worker中的线程”这个过程是阻塞的,也就意味着在socket等待下一个请求或等待释放的过程中,处理这个socket的工作线程会一直被占用,无法释放;因此Tomcat可以同时处理的socket数目不能超过最大线程数,性能受到了极大限制。而使用NIO,“读取socket并交给Worker中的线程”这个过程是非阻塞的,当socket在等待下一个请求或等待释放时,并不会占用工作线程,因此Tomcat可以同时处理的socket数目远大于最大线程数,并发性能大大提高。
二、3个参数:acceptCount、maxConnections、maxThreads
再回顾一下Tomcat处理请求的过程:在accept队列中接收连接(当客户端向服务器发送请求时,如果客户端与OS完成三次握手建立了连接,则OS将该连接放入accept队列);在连接中获取请求的数据,生成request;调用servlet容器处理请求;返回response。
相对应的,Connector中的几个参数功能如下:
1、acceptCount
accept队列的长度;当accept队列中连接的个数达到acceptCount时,队列满,进来的请求一律被拒绝。默认值是100。
2、maxConnections
Tomcat在任意时刻接收和处理的最大连接数。当Tomcat接收的连接数达到maxConnections时,Acceptor线程不会读取accept队列中的连接;这时accept队列中的线程会一直阻塞着,直到Tomcat接收的连接数小于maxConnections。如果设置为-1,则连接数不受限制。
默认值与连接器使用的协议有关:NIO的默认值是10000,APR/native的默认值是8192,而BIO的默认值为maxThreads(如果配置了Executor,则默认值是Executor的maxThreads)。
在windows下,APR/native的maxConnections值会自动调整为设置值以下最大的1024的整数倍;如设置为2000,则最大值实际是1024。
3、maxThreads
请求处理线程的最大数量。默认值是200(Tomcat7和8都是的)。如果该Connector绑定了Executor,这个值会被忽略,因为该Connector将使用绑定的Executor,而不是内置的线程池来执行任务。
maxThreads规定的是最大的线程数目,并不是实际running的CPU数量;实际上,maxThreads的大小比CPU核心数量要大得多。这是因为,处理请求的线程真正用于计算的时间可能很少,大多数时间可能在阻塞,如等待数据库返回数据、等待硬盘读写数据等。因此,在某一时刻,只有少数的线程真正的在使用物理CPU,大多数线程都在等待;因此线程数远大于物理核心数才是合理的。
换句话说,Tomcat通过使用比CPU核心数量多得多的线程数,可以使CPU忙碌起来,大大提高CPU的利用率。
4、参数设置
(1)maxThreads的设置既与应用的特点有关,也与服务器的CPU核心数量有关。通过前面介绍可以知道,maxThreads数量应该远大于CPU核心数量;而且CPU核心数越大,maxThreads应该越大;应用中CPU越不密集(IO越密集),maxThreads应该越大,以便能够充分利用CPU。当然,maxThreads的值并不是越大越好,如果maxThreads过大,那么CPU会花费大量的时间用于线程的切换,整体效率会降低。
(2)maxConnections的设置与Tomcat的运行模式有关。如果tomcat使用的是BIO,那么maxConnections的值应该与maxThreads一致;如果tomcat使用的是NIO,那么类似于Tomcat的默认值,maxConnections值应该远大于maxThreads。
(3)通过前面的介绍可以知道,虽然tomcat同时可以处理的连接数目是maxConnections,但服务器中可以同时接收的连接数为maxConnections+acceptCount 。acceptCount的设置,与应用在连接过高情况下希望做出什么反应有关系。如果设置过大,后面进入的请求等待时间会很长;如果设置过小,后面进入的请求立马返回connection refused。
相关推荐
在Tomcat的配置和性能优化中,了解如何设置连接数和线程池是至关重要的。 首先,Connector按照处理连接的方式可以分为不同的协议类型,包括BIO(阻塞IO)、NIO(非阻塞IO)、APR(Apache Portable Runtime)。BIO...
标题中的“Tomcat配置连接数(优化)”指的是在Apache Tomcat服务器中调整与处理并发请求相关的设置,以提升服务器的性能和稳定性。这通常涉及到调整最大连接数、线程池大小、超时时间等核心参数。在高并发场景下,...
4. 如果已达到最大线程数,线程池会阻塞等待,直到有线程变为空闲状态。 5. 一旦找到空闲线程,将其从数组中移除,唤醒该线程并执行任务。 6. 任务执行完毕后,线程返回到线程池,重新标记为空闲,等待下次分配。 ...
在 Tomcat 的配置文件 `server.xml` 中,与连接数相关的参数主要包括: - `minProcessors`:最小空闲连接线程数,默认为 10。 - `maxProcessors`:最大连接线程数,默认为 75。 - `acceptCount`:允许的最大连接数...
1. **最大线程数**:`maxThreads`配置决定Tomcat可以同时处理的请求数量,应根据服务器处理能力适当设置,如`maxThreads="200"`。 2. **最小空闲线程**:`minSpareThreads`确保了即使在低负载时也有一定数量的线程...
6. 监控 Apache 连接数:可以使用 ps -ef | grep httpd | wc -l 命令查看当前的 Apache 连接数,并根据连接数设置来判断服务器的稳定性。 二、Tomcat 配置文件 Tomcat 的配置文件包括 server.xml、web.xml、tomcat...
配置数据源通常在`context.xml`或`server.xml`文件中完成,包括设置数据库URL、用户名、密码、最大连接数、最小连接数等参数。配置完成后,应用可以通过JNDI查找来获取数据源,然后通过数据源创建和管理数据库连接。...
对于性能调优,Tomcat可以通过调整`server.xml`中的参数,例如最大连接数、线程池大小等来提高处理能力。对于Nginx,可以优化工作进程数、连接数限制和超时设置等。还可以编写脚本来自动化这些调优过程,确保系统...
"tomcat-connectors-1.2.30-src"是Tomcat连接器JK模块的1.2.30版本源代码,这个版本是针对Tomcat的一个较新更新,对于开发者来说,深入理解这些源代码对于优化服务器性能和解决集成问题非常有价值。 【描述】...
8. **性能优化**:通过调整Tomcat的配置参数,如最大连接数、线程池大小、缓冲区大小等,可以显著提升应用性能。 9. **JMX监控**:Tomcat提供了JMX接口,可以远程监控和管理Tomcat实例的状态和配置。 10. **插件...
9. **性能优化**:Tomcat可以通过调整配置参数,如线程池大小、最大连接数、内存分配等,来提高其性能。同时,还可以结合使用缓存和负载均衡技术来进一步提升系统性能。 10. **扩展性**:虽然Tomcat本身是轻量级的...
AJP主要用于Tomcat与Apache HTTP Server之间的通信,而HTTP协议则用于处理外部客户端请求。通过选择合适的协议,可以进一步提高系统的通信效率。 ##### 3.3 Tomcat运行模式的选择 Tomcat支持三种运行模式:BIO、...
3. catalina.properties:包含了Tomcat的一些全局属性设置,如最大线程数、最小空闲线程数等。 四、Tomcat5.5管理与维护 1. 管理工具:Tomcat提供的管理工具,如Manager App和Host Manager,可以在线进行应用部署、...
- **线程池配置**:Tomcat的线程池配置不当,如最大线程数设置过小,当并发请求过多时,无法及时处理所有请求,最终可能导致Tomcat服务崩溃。 ### 2. 操作系统资源限制 操作系统层面的资源限制也是Tomcat自动关闭...
例如,`conf/server.xml`中的`Connector`元素允许配置最大连接数、空闲超时等参数。 8. **部署应用**:Web应用程序通常以WAR(Web ARchive)格式打包,可以被部署到Tomcat的`webapps`目录下。Tomcat会自动检测新...
通过修改Connector的配置,可以优化服务器性能,例如设置最大连接数、超时时间等。 4. **Executor**: Executor是Tomcat 5.5引入的一个新特性,允许开发者自定义线程池来处理请求。这在处理大量并发请求时非常有用,...
5. **Tomcat性能优化**:优化Tomcat涉及到调整内存设置、限制并发连接数、启用线程池、压缩响应等内容,以提高服务器的响应速度和并发处理能力。 6. **安全性**:在Tomcat中实现Web应用的安全性,可以配置SSL/TLS以...
例如,可以调整最大连接数、超时设置等来优化性能。 7. **日志和错误处理**:Tomcat有内置的日志系统,可以帮助开发者调试和监控应用的运行情况。错误信息会被记录在特定的日志文件中,便于问题排查。 8. **国际化...
8. **性能优化**:Tomcat可以通过调整`server.xml`中的各种参数来优化性能,如最大连接数、线程池大小、缓冲区大小等。 9. **部署与更新**:除了手动将WAR文件放入`webapps`目录,还可以通过`Manager App`的接口...