Tomcat优化之配置线程池高并发连接

最典型的应用比如tomcat,tomcat内部采用的就是多线程,上百个客户端访问同一个web应用,tomcat接入后都是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用到我们的servlet程序,比如doGet或者doPost方法。

如果不采用多线程机制,上百个人同时访问一个web应用的时候,tomcat就得排队串行处理了,那样客户端根本是无法忍受那种访问速度的。

 

彻底理解tomcat是怎样多线程处理http请求并将代码执行到controller里的的

1.线程池,thread = threadPool.getThread(),thread.executeHttp(htttpRequest),thread的start方法执行里面调用:每个thread里再获取所有的controller,根据传进入thread的httprequest找到相应的controllerer对象获取出来,controller对象就开始执行了嘛。

 

2.轨迹:线程池-》线程-》传request->线程找到对应的controller,执行

 

3.Main线程负责向子线程传入参数,任何线程的启动都是由主线程来启动加载的

 

原理:在使用和配置tomcat的线程池之前明白线程池的原理,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠 状态,当客户端有一个新请求时,就会唤醒线程池中的某一个睡眠线程,让它来处理客户端的这个请求,当处理完这个请求后,线程又处于睡眠状态。可能你也许会 问:为什么要搞得这么麻烦,如果每当客户端有新的请求时,我就创建一个新的线程不就完了?这也许是个不错的方法,因为它能使得你编写代码相对容易一些,但 你却忽略了一个重要的问题??性能!
     如果 为每个客户端请求创建一个新线程的话,那耗费的CPU时间和内存将是惊人的,如果采用一个拥有200个线程的线程池,那将会节约大量的的系统资源,使得更 多的CPU时间和内存用来处理实际的商业应用,而不是频繁的线程创建与销毁。 

使用线程池,用较少的线程处理较多的访问,可以提高tomcat处理请求的能力。
1:配置executor属性

打开/conf/server.xml文件,在Connector之前配置一个线程池(这个executor可以自己手动去掉注释):

           namePrefix="catalina-exec-"
           maxThreads="250"
           maxIdleTime="60000"
           prestartminSpareThreads="true" 
           minSpareThreads="50"/> 
重要参数说明:

name:共享线程池的名字。这是Connector为了共享线程池要引用的名字,该名字必须唯一。默认值:None;

namePrefix:在JVM上,每个运行线程都可以有一个name 字符串。这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀的后面。默认值:tomcat-exec-;

maxThreads:该线程池可以容纳的最大线程数。默认值:200,一般建议设置500~ 800 ,要根据自己的硬件设施条件和实际业务需求而定。 

maxIdleTime:在Tomcat关闭一个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数大于minSpareThread的值,才会关闭空闲线程。默认值:60000(一分钟)。

minSpareThreads:Tomcat应该始终打开的最小不活跃线程数。默认值:25。Tomcat启动初始化的线程数,在tomcat初始化的时候就初始化

2:配置Connector

           port="8080" protocol="HTTP/1.1"  
           connectionTimeout="20000"  
            redirectPort="8443"   
           minProcessors="5"  
           maxProcessors="75"  
           acceptCount="1000"/> 
重要参数说明:
executor:表示使用该参数值对应的线程池;

minProcessors:服务器启动时创建的处理请求的线程数;

maxProcessors:最大可以创建的处理请求的线程数;

acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
--------------------- 
作者:zhangvalue 
来源:CSDN 
原文:https://blog.csdn.net/zhangvalue/article/details/83990819 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(java)