1,应用背景:项目压力测试,要求同时支持并发数量8000(一秒钟1到2个请求,一直加到8000),5台tomcat配置(apache-tomcat-7.0.72)
线程池配置:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="800" minSpareThreads="100" maxSpareThreads="500" maxQueueSize="100" prestartminSpareThreads="true" maxIdleTime="60000" />
connector 配置:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> <Connector port="8080" executor="tomcatThreadPool" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="40000" redirectPort="8443" enableLookups="false" maxPostSize="10485760" URIEncoding="UTF-8" acceptCount="1000" maxKeepAliveRequests="1" acceptorThreadCount="2" disableUploadTimeout="true" maxConnections="10000" tcpNoDelay="true" />
2,概念知识
1)connector对象
tomcat 中Connector是用来创建request和response对象,并用于处理请求和处理交换数据的;然后将请求发送给Engine(servlet 容器),Engine处理完成之后再通过Connector 返回给客户端,这也是一个MVC的处理过程。其中Connector可以分为HTTP Connector,AJP Connector等。
不同版本的tomcat支持不同的Connector,Tomcat 7 支持BIO,NIO和APR
Tomcat 8 支持BIO,NIO,APR和NIO2
Tomcat 9 支持NIO,APR和NIO2
其中APR 是Apache Portable Runtime,是Apache可移植运行库,利用本地库可以实现高可用性,是高并发模式下的首选模式,但是需要安装apr,apri-utils,tomcat-native等包。
tomcat 中的connector可以通过protocol属性来制定使用不同的协议,默认为HTTP/1.1
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
在Tomcat7中,自动选取使用BIO或APR(如果找到APR需要的本地库,则使用APR,否则使用BIO);
在Tomcat8中,自动选取使用NIO或APR(如果找到APR需要的本地库,则使用APR,否则使用NIO)。
2)tomcat 处理请求的过程
在accept队列中接收连接(当客户端向服务器发送请求时,如果客户端与OS完成三次握手建立了连接,则OS将该连接放入accept队列);
在连接中获取请求的数据,生成request;调用servlet容器处理请求;返回response。
其中:连接是TCP层面的(传输层),对应socket;
请求是HTTP层面的(应用层),必须依赖于TCP的连接实现;一个TCP连接中可能传输多个HTTP请求。
3)socket数量和连接之间的关系
目前大多数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 参数含义
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。
4 Executor 参数
name:该线程池的标记
maxThreads:线程池中最大活跃线程数,默认值200(Tomcat7和8都是)
minSpareThreads:线程池中保持的最小线程数,最小值是25
maxIdleTime:线程空闲的最大时间,当空闲超过该值时关闭线程(除非线程数小于minSpareThreads),单
位是ms,默认值60000(1分钟)
daemon:是否后台线程,默认值true
threadPriority:线程优先级,默认值5
namePrefix:线程名字的前缀,线程池中线程名字为:namePrefix+线程编号
参考文档:http://www.cnblogs.com/kismetv/p/7806063.html
相关推荐
《深入解析Tomcat线程池源码》 Tomcat作为一款广泛应用的开源Servlet容器,其在性能优化上有着独到之处。线程池是Tomcat处理并发请求的关键组件,它负责调度和管理线程,有效地提高了服务器的响应速度和并发处理...
【标题】:深入理解Tomcat线程池机制 【描述】:Tomcat作为最流行的Java Web容器,其高效处理请求的能力离不开线程池的优化。本文将详细解析Tomcat线程池的实现原理,帮助读者深入理解其工作方式。 【标签】:Tomcat ...
Tomcat的连接器会使用这些线程来处理请求,因此正确配置线程池的大小对于优化性能至关重要。如果线程池配置得过小,可能会导致处理请求的延迟增加;如果配置得过大,则可能会造成线程上下文切换的开销,反而降低性能...
### Tomcat 6.0 共享线程池配置详解 #### 一、引言 在探讨Tomcat 6.0共享线程池配置之前,我们先了解下什么是线程池以及为什么要在Tomcat服务器中配置...希望本文能帮助你在实际项目中更好地利用Tomcat线程池的功能。
springboot线程池使用的一个demo,注解开发,很简单,下载即用
Tomcat 使用维护手册 Tomcat 是一个流行的开源 Java Web 服务器容器,广泛应用于企业级 Web 应用程序。为了确保 Tomcat 服务器的高效运行,需要对其进行合理的维护和优化。本文档将详细介绍 Tomcat 的维护操作、...
根据应用的需求,可能需要对Tomcat进行性能调优,如调整线程池大小、JVM内存设置等。同时,也要注意安全配置,如限制远程管理、设置强密码等。 ### 10. 使用示例 在提供的文档`tomcat的使用方法(免费带例子).doc`...
Apache Tomcat 8.5是Java Servlet容器,用于运行Java Web应用程序。它的配置优化对于提升应用性能、确保稳定性和安全至关重要。在这个配置优化后版本中,我们已经设置好了管理员的用户名和密码,允许用户直接使用...
9. **JMX管理**:通过Java Management Extensions(JMX),开发者可以远程监控和管理Tomcat的运行状态,如查看线程池状态、内存使用情况等。 10. **性能优化**:优化Tomcat涉及调整线程池大小、缓存设置、减少上...
在Java Web应用中,Tomcat是一个广泛使用的开源应用服务器,它提供了Servlet容器和JSP引擎等核心功能。在处理数据库连接方面,Tomcat提供了一种高效且可管理的数据源实现,名为“tomcat-jdbc数据源”。这个数据源是...
7. 性能优化:Tomcat 8在内存管理、线程池和垃圾收集等方面进行了优化,提升了服务器的性能。 8. 安全增强:提供了更多的安全特性,如更好的密码加密存储和更强的身份验证机制。 总结来说,Tomcat 7和Tomcat 8在...
NIO模式下,Tomcat使用一个线程池处理多个连接,提高了并发性能。 五、Session管理 Tomcat提供了内置的Session管理,包括会话创建、有效期设置、会话跟踪、分布式环境下的会话复制等。默认情况下,Session信息存储...
4. 优化Tomcat线程池设置,根据实际负载调整。 七、故障排查 1. 查看`logs/catalina.out`、`logs/host-manager.*.log`和`logs/manager.*.log`等日志文件。 2. 使用JMX监控Tomcat运行状态,如内存使用、线程池情况等...
Tomcat使用了线程池来处理请求,通过`Executor`接口和实现类,如`ThreadPoolExecutor`,可以调整线程池参数以优化性能。 5. **安全性**: Tomcat的安全特性包括SSL/TLS支持,角色和权限管理,以及基于JAAS(Java ...
Linux环境下使用Apache Tomcat 7 Apache Tomcat是一款开源的Java Servlet容器,它实现了Java EE中的Web应用服务器标准,特别是Servlet和JSP规范。在Linux系统中,Tomcat 7是一个常用的轻量级服务器,适合运行Java ...
6. **线程池**:Tomcat使用线程池来处理并发请求,提高系统效率。当请求到来时,Tomcat会从线程池中获取一个空闲线程来执行请求,而不是每次请求都创建新线程,这样可以减少系统资源消耗。 7. **配置文件**:Tomcat...
在本案例中,我们讨论的是Apache Tomcat 9.0.5的zip版本,该版本解压后可以直接使用,无需复杂的安装过程。 1. **Tomcat的下载与解压** - 下载:Apache Tomcat 9.0.5可以从官方站点下载,提供的格式包括ZIP和...
这个压缩包包含了Windows和Linux两个操作系统平台的安装版本,使得用户可以在不同的操作系统环境下方便地安装和使用Tomcat。 在Windows系统中,Tomcat通常以服务的形式运行,允许用户通过控制台或图形界面启动、...
Apache Tomcat 7.0是Java Servlet和JavaServer Pages(JSP)的开源Web应用程序服务器,由Apache软件基金会开发和维护。...无论是小型项目还是大型企业应用,都可以考虑使用Tomcat作为后端服务的运行平台。
- 学习和研究Tomcat如何实现Servlet容器的多线程、线程池、连接管理和内存管理等高级特性。 - 针对特定需求,开发自定义的Valve(管道组件),Connector,Realm(认证模块)等。 总的来说,Tomcat7.0.42的源码为...