tomcat请求机制简述及调优

一、tomcat请求机制简述

Tomcat  作为Web容器,需要承受较高的访问量,能够同时响应不同用户的请求,能够在恶劣环境下保持较高的稳定性和健壮性。 Tomcat 的线程池位于tomcat-util.jar文件中,包含了两种线程池方案。方案一:使用APR的Pool技术,使用了JNI;方案二:使用Java实现的ThreadPool。这里介绍的是第二种。如果想了解APR的Pool技术,可以查看APR的源代码。  ThreadPool默认创建了5个线程,保存在一个200维的线程数组中,创建时就启动了这些线程,当然在没有请求时,它们都处理“等待”状态(其实就是一个while循环,不停的等待notify)。如果有请求时,空闲线程会被唤醒执行用户的请求。  具体的请求过程是: 服务启动时,创建一个一维线程数组(maxThread=200个),并创建空闲线程(minSpareThreads=5个)随时等待用户请求。 当有用户请求时,调用 threadpool.runIt(ThreadPoolRunnable)方法,将一个需要执行的实例传给ThreadPool中。其中用户需要执行的实例必须实现ThreadPoolRunnable接口。 ThreadPool 首先查找空闲的线程,如果有则用它运行要执行ThreadPoolRunnable;如果没有空闲线程并且没有超过maxThreads,就一次性创建 minSpareThreads个空闲线程;如果已经超过了maxThreads了,就等待空闲线程了。总之,要找到空闲的线程,以便用它执行实例。找到后,将该线程从线程数组中移走。 接着唤醒已经找到的空闲线程,用它运行执行实例(ThreadPoolRunnable)。 运行完ThreadPoolRunnable后,就将该线程重新放到线程数组中,作为空闲线程供后续使用。   由此可以看出,Tomcat的线程池实现是比较简单的,ThreadPool.java也只有840行代码。用一个一维数组保存空闲的线程,每次以一个较小步伐(5个)创建空闲线程并放到线程池中。使用时从数组中移走空闲的线程,用完后,再“归还”给线程池。 ThreadPool提供的仅仅是线程池的实现,而如何使用线程池也是有很大学问的。

 Tomcat有两种EndPoint,分别是AprEndpoint和PoolTcpEndpoint。我们只关注PoolTcpEndpoint如何使用ThreadPool的。 首先,PoolTcpEndpoint创建了一个ThreadPoolRunnable实例——LeaderFollowerWorkerThread,实际上该实例就是接收(Accept)并处理(Process)用户socket请求。接着将该实例放进ThreadPool中并运行,此时就可以接收用户的请求了。 当有Socket请求时,LeaderFollowerWorkerThread首先获得了Socket实例,注意此时 LeaderFollowerWorkerThread并没有急着处理该Socket,而是在响应Socket消息前,再次将 LeaderFollowerWorkerThread放进ThreadPool中,从而它(当然是另外一个线程了)可以继续处理其他用户的Socket 请求;接着,拥有Socket的LeaderFollowerWorkerThread再来处理该用户的Socket请求。   

二、tomcat调优小结

1.分配给Tomcat足够大的内存空间。

压解版本中文件位置 :bin\catalina.bat

增加 :set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m

2.设置Tomcat连接器相关参数。

<Connector

executor="tomcatThreadPool"

port="8090"

redirectPort="8443"

protocol="org.apache.coyote.http11.Http11NioProtocol"

compression="on"

compressionMinSize="2048"

enableLookups="false"

acceptCount="1000"

URIEncoding="UTF-8"

connectionTimeout="40000" />

连接器使用的线程池的名子:executor="tomcatThreadPool"

连接器端口 :port="8090"

连接器使用的传输方式 :protocol="org.apache.coyote.http11.Http11NioProtocol"

传输时是否支持压缩 :compression="on"

压缩的大小 :compressionMinSize="2048"

3.设置Tomcat连接器池。

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="350" />

线程池名: name="tomcatThreadPool"

线程前缀: namePrefix="catalina-exec-"

最大产生线程数:maxThreads="1000"

最小初始现程数:minSpareThreads="350"

4.开启Tomcat6的Nio机制。

protocol="org.apache.coyote.http11.Http11NioProtocol"

5.设置Tomcat安全相关。

压解版本中文件位置 \conf\web.xml

<init-param>

<param-name>listings</param-name>

<param-value>false</param-value>

</init-param>

设置Manager用户名和密码

压解版本中文件位置 \conf\ tomcat-users.xml

<?xml version='1.0' encoding='utf-8'?>

<tomcat-users>

<role rolename="manager"/>

<user username="temobi" password="temobi8090" roles="manager"/>

</tomcat-users>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值