基于tomcat的连接数与线程池详解

2019-10-18 19:49:58王冬梅

Executor是Service元素的内嵌元素。一般来说,使用线程池的是Connector组件;为了使Connector能使用线程池,Executor元素应该放在Connector前面。Executor与Connector的配置举例如下:

<Executor name="tomcatThreadPool" namePrefix ="catalina-exec-" maxThreads="150" minSpareThreads="4" /> 
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" acceptCount="1000" /> 

Executor的主要属性包括:

name:该线程池的标记

maxThreads:线程池中最大活跃线程数,默认值200(Tomcat7和8都是)

minSpareThreads:线程池中保持的最小线程数,最小值是25

maxIdleTime:线程空闲的最大时间,当空闲超过该值时关闭线程(除非线程数小于minSpareThreads),单位是ms,默认值60000(1分钟)

daemon:是否后台线程,默认值true

threadPriority:线程优先级,默认值5

namePrefix:线程名字的前缀,线程池中线程名字为:namePrefix+线程编号

四、查看当前状态

上面介绍了Tomcat连接数、线程数的概念以及如何设置,下面说明如何查看服务器中的连接数和线程数。

查看服务器的状态,大致分为两种方案:(1)使用现成的工具,(2)直接使用Linux的命令查看。

现成的工具,如JDK自带的jconsole工具可以方便的查看线程信息(此外还可以查看CPU、内存、类、JVM基本信息等),Tomcat自带的manager,收费工具New Relic等。下图是jconsole查看线程信息的界面:

下面说一下如何通过Linux命令行,查看服务器中的连接数和线程数。

1、连接数

假设Tomcat接收http请求的端口是8083,则可以使用如下语句查看连接情况:

netstat –nat | grep 8083

结果如下所示:

可以看出,有一个连接处于listen状态,监听请求;除此之外,还有4个已经建立的连接(ESTABLISHED)和2个等待关闭的连接(CLOSE_WAIT)。

2、线程

ps命令可以查看进程状态,如执行如下命令:

ps –e | grep java

结果如下图:

可以看到,只打印了一个进程的信息;27989是线程id,java是指执行的java命令。这是因为启动一个tomcat,内部所有的工作都在这一个进程里完成,包括主线程、垃圾回收线程、Acceptor线程、请求处理线程等等。

通过如下命令,可以看到该进程内有多少个线程;其中,nlwp含义是number of light-weight process。

ps –o nlwp 27989