Tomcat(三)——Tomcat的Connector及线程池配置

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的配置

猜你喜欢

转载自blog.csdn.net/u011741311/article/details/80142293