Connector参数配置
- port,端口号。Tomcat默认端口号是8080。
- address,配置Connector在监听网络请求时监听在哪一个地址上。在很多服务器上,服务器上的IP是不止一个的,会有很多,如果不配置address的话,默认会在所有的IP上监听请求,有时由于安全上的原因是不被允许的。这时,通过address来指定仅仅监听哪几个地址。
- protocol,协议。http1.1,默认的就行。
- connectionTimeOut,客户端连接超时时间,单位是毫秒。要发请求时,建立好连接后就是不发请求。这是要耗费服务器资源的,因为有连接在挂着,服务器端分配了线程在这里对请求进行处理,如果不关闭连接,也不发请求,这个连接无法结束。如果大量的这种情况存在就会造成服务端资源耗尽。服务端需要配置这样一个参数,来使得当一个连接上面没有任何请求时,不要占着坑。
- acceptCount ,当系统繁忙时,所有的线程都在处理请求时,没有空闲线程时,就要排队了。acceptCount是用来配置排队的长度的,就是这个队列最大是多大,默认值是100。如果排队的数超过了100,其余的请求会被拒绝处理。这时connector就不会处理新的请求了。
- maxConnections,是指Connector同时支持的最大连接数。对BIO Connector来说是线程池的最大值。当超过这个数值时,只会被接受不会被处理,必须等前面请求处理完了,有空闲线程了才会去处理。maxConnections=-1表示不限制最大连接数,但具体的连接数还会受限于其他资源。
线程池
- 线程的创建和销毁都是比较耗时的,如果来一个请求就创建一个线程,请求完成了响应再把线程销毁掉,这样对系统的性能损坏是比较大的。
- 可以事先创建一定数量的线程放在那里,用完之后在放回池里,这样减少了线程的创建以及销毁过程。
- 如在银行办理业务,银行会开一个窗口(最小空闲线程数minSpareThreads)。来个3个顾客,只有一个线程, 后面两个人排队。可以再创建两个线程,即再开两个窗口,但窗口上限即最大线程数maxThreads 。如果有来了其他的顾客,就只能排队了。
- 3人的业务都处理完了,这时只留下一个线程就好了。对于这种线程可变的叫做弹性线程池。最小线程数保证当有请求来时尽快的进行处理,最大线程数是一个限制,是由于机器的性能等方面的原因造成的。开多了线程,他们之间的竞争很多也会影响性能。
- 最小空闲线程数:minSpareThreads
- 最大线程数:maxThreads
修改Connector的参数配置
默认的Connector配置
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
- 默认的Connector配置,它的端口号是8080,协议是HTTP/1.1,连接超时是20秒,redirectPort是https的端口。
- 在与Connection的平级节点上,也就是Service节点下,配置一个线程池。并在Connection中使用这个线程池。
- 并且修改Connector的其他配置
<Service name="Catalina">
<Executor name="myThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="10"/>
<Connector port="8181" protocol="HTTP/1.1"
connectionTimeout="200000"
executor = "myThreadPool"
redirectPort="8443" URIEncoding="UTF-8" />
</Service>
- 修改了Connector的端口号,超时时间,为这个Connector配置了线程池。
- 启动Tomcat,访问之前Restaurant的地址,端口号也要改为8181。
- 可以把线程池中的最小空闲线程数和最大线程数都修改成1,直观的感受一下线程池的作用。
- 通过telnet启动本地8181端口,向Restaurant发送一次请求,让请求占着,不结束。
- 再打开另一个终端,也使用telnet启动本地8181端口,向Restaurant发送一次请求,这里敲击回车,让请求发送,但由于线程池只开了一个连接,所以第一个请求没有结束,第二个请求只能排队等待。
- 切换到第一个窗口,回车发送请求,第一个请求处理完成,第二个请求也会跟着处理完成
- telnet localhost 8181
- GET /Restaurant/choose?size=small&spicy=none HTTP/1.1
总结线程池配置
- 线程池配置项
<Executor>
- minSpareThreads
- maxThreads
- Connector配置线程池
- 指定依赖的线程池配置
- 直接指定线程池配置参数
- 直接把minSpareThreads、maxThreads配置到Connector中
- 这样Connector就会使用自己的配置,但注意不要配置指定依赖的Executor
- 如果既配置了线程池配置项Executor又在Connectoior指定了自己的线程池参数,Connector会使用Executor的配置
- 直接配置Executor,多个Connector可以共享这个Executor的配置