tomcat的线程池配置

简介 
 
线程池作为提高程序处理数据能力的一种方案,应用非常广泛。大量的服务器都或多或少的使用到了线程池技术,不管是用Java还是C++实现,线程池都有如下的特点:线程池一般有三个重要参数:

  1. 最大线程数。在程序运行的任何时候,线程数总数都不会超过这个数。如果请求数量超过最大数时,则会等待其他线程结束后再处理。
  2. 最大共享线程数,即最大空闲线程数。如果当前的空闲线程数超过该值,则多余的线程会被杀掉。
  3. 最小共享线程数,即最小空闲线程数。如果当前的空闲数小于该值,则一次性创建这个数量的空闲线程,所以它本身也是一个创建线程的步长。 线程池有两个概念:
  4. Worker线程。工作线程主要是运行执行代码,有两种状态:空闲状态和运行状态。在空闲状态时,类似“休眠”,等待任务;处理运行状态时,表示正在运行任务(Runnable)。
  5. 辅助线程。主要负责监控线程池的状态:空闲线程是否超过最大空闲线程数或者小于最小空闲线程数等。如果不满足要求,就调整之。

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

使用线程池,用较少的线程处理较多的访问,可以提高tomcat处理请求的能力。使用方式: 
首先。打开/conf/server.xml,增加 

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"     maxThreads="500" minSpareThreads="20" maxIdleTime="60000"  maxQueueSize="100" />

  1. name:该线程池的标记
  2. namePrefix:线程名字的前缀,线程池中线程名字为:namePrefix+线程编号
  3.  maxThreads:线程池中最大活跃线程数,默认值200(Tomcat7和8都是)一般建议设置500~ 800 ,要根据自己的硬件设施条件和实际业务需求而定。
  4.  minSpareThreads:线程池中保持的最小线程数,最小值是25
  5.  maxIdleTime:线程空闲的最大时间,当空闲超过该值时关闭线程(除非线程数小于minSpareThreads),单位是ms,默认值60000(1分钟)
  6. daemon:是否后台线程,默认值true
  7.  threadPriority:线程优先级,默认值5
  8. maxQueueSize: 最大的等待队列数

 <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"  
        connectionTimeout="20000"  
        redirectPort="8443"  
        executor="tomcatThreadPool"  
        enableLookups="false"  
        acceptCount="100"  
        maxPostSize="10485760"  
        compression="on"  
        disableUploadTimeout="true"  
        compressionMinSize="2048"  
        noCompressionUserAgents="gozilla, traviata"  
        acceptorThreadCount="2"  
        compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"  
        URIEncoding="utf-8"/>

简单配置
    <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" acceptCount="1000" />

port:连接端口。protocol:连接器使用的传输方式。 
Tomcat 8 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocolprotocol,

Tomcat 6、7 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol 
注:每个web客户端请求对于服务器端来说就一个单独的线程,客户端的请求数量增多将会导致线程数就上去了,CPU就忙着 跟线程切换。 
而NIO则是使用单线程(单个CPU)或者只使用少量的多线程(多CPU)来接受Socket,而由线程池来处理堵塞在pipe 或者队 列里的请求.这样的话,只要OS可以接受TCP的连接,web服务器就可以处理该请求,大大提高了web服务器的可伸缩性。 
executor: 连接器使用的线程池名称

enableLookups:禁用DNS查询

acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置 100 。

maxPostSize:限制 以FORM URL 参数方式的POST请求的内容大小,单位字节,默认是 2097152(2兆),10485760 为 10M。 
如果要禁用限制,则可以设置为 -1。

acceptorThreadCount: 用于接收连接的线程的数量,默认值是1。一般这个指需要改动的时候是因为该服务器是一个多核CPU,如果是多核 CPU 一般配置为 2。 
compression:传输时是压缩。

compressionMinSize:压缩的大小

noCompressionUserAgents:不启用压缩的浏览器 


提示:压缩会增加Tomcat负担,最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,压缩交由Nginx/Apache 去做。 
Tomcat 的压缩是在客户端请求服务器对应资源后,从服务器端将资源文件压缩,再输出到客户端,由客户端的浏览器负责解压缩并浏览。相对于普通的 浏览过程 HTML、CSS、Javascript和Text,它可以节省40% 左右的流量。更为重要的是,它可以对动态生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等输出的网页也能进行压缩,压缩效率也很高。 

 

  1. className : 该Connector的实现类是org.apache.coyote.tomcat4.CoyoteConnector
  2. minProcessors : 该Connector先创建5个线程等待客户请求,每个请求由一个线程负责
  3. maxProcessors : 当现有的线程不够服务客户请求时,若线程总数不足75个,则创建新线程来处理请求
  4. acceptCount : 当现有线程已经达到最大数75时,为客户请求排队当队列中请求数超过100时,后来的请求返回Connection refused错误
  5. redirectport : 当客户请求是https时,把该请求转发到端口8443去 

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

总结线程池配置


线程池配置项<Executor> 

  • minSpareThreads
  • maxThreads

Connector配置线程池 

  • 指定依赖的线程池配置
  • 直接指定线程池配置参数 

直接把minSpareThreads、maxThreads配置到Connector中
这样Connector就会使用自己的配置,但注意不要配置指定依赖的Executor
如果既配置了线程池配置项Executor又在Connectoior指定了自己的线程池参数,Connector会使用Executor的配置
直接配置Executor,多个Connector可以共享这个Executor的配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值