桃园结义 , 版权所有丨如未注明 , 均为原创丨转载请注明

Tomcat并发

桃园小编 609次浏览 0个评论 扫描二维码

    Tomcat默认的HTTP实现是采用阻塞式的Socket通信,每个请求都需要创建一个线程处理,这种模式下的并发量受到线程数的限制,但对于Tomcat来说几乎没有BUG存在了。当一个进程有500个线程在跑的话,那性能已经是很低很低了。

    Tomcat还可以配置NIO方式的Socket通信,在性能上高于阻塞式的,每个请求也不需要创建一个线程进行处理,并发能力比前者高。但没有阻塞式的成熟。

    Tomcat最大并发数是可以配置的,但Tomcat默认配置的最大请求数是150,也就是说同时支持150个并发。

    具体能承载多少并发,需要看硬件的配置,CPU核心数越多性能越高,分配给JVM 的内存越多性能也就越高,但也会加重GC的负担,但当某个应用拥有250个以上并发的时候,应考虑应用服务器集群。(更好的硬件性能,更多的处理器都会使Tomcat支持更多的并发)。

    操作系统对于进程中的线程数有一定的限制:

        1.Windows 每个进程中的线程数不允许超过2000。

        2.Linux 每个进程中的线程数不允许超过1000。

        3.在Java中,每开启一个线程需要消耗 1MB 的 JVM 内存空间用于作为线程栈之用。

    这个并发能力还与应用的逻辑密切相关,如果逻辑很复杂需要大量的计算,那并发能力势必会下降。如果每个请求都含有很多的数据库操作,那么对于数据库的性能也是非常高的。

    对于单台数据库服务器来说,允许客户端的连接数量是有限制的,并发能力问题设计整个系统架构和业务逻辑。

    系统环境不同,Tomcat版本不同,JDK版本不同,以及修改的设定参数不同。并发量的差异还是蛮大的。

maxThreads="1000" 最大并发数 
minSpareThreads="100"///初始化时创建的线程数
maxSpareThreads="500"///一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。
acceptCount="700"// 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理

   

    Tomcat8为例,想要完全掌握配置,最好还是去官网去浏览锁定自己想知道的相关问题的关键词。https://tomcat.apache.org/tomcat-8.5-doc/config/http.html

    从上面配置也可以看出Tomcat8在操作系统没有装arp库支持时默认工作在NIO模式,默认支持的最大并发连接数是10000。

    注意这个值是Tomcat默认接受的并发连接数,是TCP连接层相关的参数。Tomcat在NIO模式时有一个线程专业接受请求连接,然后将其放到任务队列,然后有工作线程从任务t队列取出请求并并发处理(工作线程数通过maxThreads值控制,Tomcat默认是200),如果每个请求处理很快比如50ms,则工作线程1s内就能处理10000个请求,否则若请求处理很慢比如要几秒,则请求队列中的连接得到处理收到响应的时间也会变慢。

  • maxThreads、minSpareThreads是tomcat工作线程池的配置参数,maxThreads就相当于jdk线程池的maxPoolSize,而minSpareThreads就相当于jdk线程池的corePoolSize。

  • acceptCount、maxConnections是tcp层相关的参数。

图片描述

tomcat有一个acceptor线程来accept socket连接,然后有工作线程来进行业务处理。对于client端的一个请求进来,流程是这样的:tcp的三次握手建立连接,建立连接的过程中,OS维护了半连接队列(syn队列)以及完全连接队列(accept队列),在第三次握手之后,server收到了client的ack,则进入establish的状态,然后该连接由syn队列移动到accept队列。tomcat的acceptor线程则负责从accept队列中取出该connection,接受该connection,然后交给工作线程去处理(读取请求参数、处理逻辑、返回响应等等;如果该连接不是keep alived的话,则关闭该连接,然后该工作线程释放回线程池,如果是keep alived的话,则等待下一个数据包的到来直到keepAliveTimeout,然后关闭该连接释放回线程池),然后自己接着去accept队列取connection(当当前socket连接超过maxConnections的时候,acceptor线程自己会阻塞等待,等连接降下去之后,才去处理accept队列的下一个连接)。acceptCount指的就是这个accept队列的大小。

百度已收录

桃园结义 , 版权所有丨如未注明 , 均为原创丨转载请注明Tomcat并发

您必须 登录 才能发表评论!