美文网首页
Tomcat 请求线程的解析

Tomcat 请求线程的解析

作者: flyjar | 来源:发表于2022-01-12 10:52 被阅读0次

    查询tomcat当前并发连接数

    netstat -na | grep ESTAB | grep 端口号 | wc -l
    

    关于tomcat 请求线程的问题

        在Servlet 3.0之前,Servlet采用Thread-Per-Request的方式处理请求,即每一次Http请求都由某一个线程从头到尾负责处理。如果一个请求需要进行IO操作,比如访问数据库、调用第三方服务接口等,那么其所对应的线程将同步地等待IO操作完成, 而IO操作是非常慢的,所以此时的线程并不能及时地释放回线程池以供后续使用。在并发量越来越大的情况下,这将带来严重的性能问题。即便是像Spring、Struts这样的高层框架也脱离不了这样的桎梏,因为他们都是建立在Servlet之上的。为了解决这样的问题,Servlet 3.0引入了异步处理,然后在Servlet 3.1中又引入了非阻塞IO来进一步增强异步处理的性能。
    Servlet 3.0开始提供了AsyncContext用来支持异步处理请求,那么异步处理请求到底能够带来哪些好处?
       Web容器一般来说处理请求的方式是:为每个request分配一个thread。我们都知道thread的创建不是没有代价的,Web容器的threadpool都是有上限的。
        那么一个很容易预见的问题就是,在高负载情况下,thread pool都被占着了,那么后续的request就只能等待,如果运气不好客户端会报等待超时的错误。
        现在遇到了高负载,有超过200个request到Servlet-A,如果这个时候请求Servlet-B就会等待,因为所有HTTP thread都已经被Servlet-A占用了。
        这个时候工程师发现了问题,扩展了线程池大小到400,但是负载依然持续走高,现在有400个request到Servlet-A,Servlet-B依然无法响应
        所以说当一个请求的业务需要长时间处理的话,可以采用异步处理的 使用AsyncContext,我们就可以将耗时的操作交给另一个项目中的thread去做,这样Tomcat下的HTTP thread就被释放出来了,可以去处理其他请求。
        非常重要的一点:HTTP Thread 和 项目中的Thread并不在一个线程池,一个隶属于容器,一个隶属于项目
    

    Tomcat 请求线程数

    一、accept-count:最大等待数
    官方文档的说明为:当所有的请求处理线程都在使用时,所能接收的连接请求的队列的最大长度。当队列已满时,任何的连接请求都将被拒绝。accept-count的默认值为100。
    详细的来说:当调用HTTP请求数达到tomcat的最大线程数时,还有新的HTTP请求到来,这时tomcat会将该请求放在等待队列中,这个acceptCount就是指能够接受的最大等待数,默认100。如果等待队列也被放满了,这个时候再来新的请求就会被tomcat拒绝(connection refused)。
    
    二、maxThreads:最大线程数
    每一次HTTP请求到达Web服务,tomcat都会创建一个线程来处理该请求,那么最大线程数决定了Web服务容器可以同时处理多少个请求。maxThreads默认200,肯定建议增加。但是,增加线程是有成本的,更多的线程,不仅仅会带来更多的线程上下文切换成本,而且意味着带来更多的内存消耗。JVM中默认情况下在创建新线程时会分配大小为1M的线程栈,所以,更多的线程异味着需要更多的内存。线程数的经验值为:1核2g内存为200,线程数经验值200;4核8g内存,线程数经验值800。
    
    三、maxConnections:最大连接数
    官方文档的说明为:
    
    这个参数是指在同一时间,tomcat能够接受的最大连接数。对于Java的阻塞式BIO,默认值是maxthreads的值;如果在BIO模式使用定制的Executor执行器,默认值将是执行器中maxthreads的值。对于Java 新的NIO模式,maxConnections 默认值是10000。
    对于windows上APR/native IO模式,maxConnections默认值为8192,这是出于性能原因,如果配置的值不是1024的倍数,maxConnections 的实际值将减少到1024的最大倍数。
    如果设置为-1,则禁用maxconnections功能,表示不限制tomcat容器的连接数。
    maxConnections和accept-count的关系为:当连接数达到最大值maxConnections后,系统会继续接收连接,但不会超过acceptCount的值。
    
    server:
      #tomcat配置
      tomcat:
        # 当所有线程都在使用时,建立连接的请求的等待队列长度,默认100
        accept-count: 100
        # 线程池维持最小线程数,默认10
        min-spare-threads: 4
        # 允许最大连接数,默认10000,当达到临界值时,系统可能会基于accept-count继续接受连接
        max-connections: 10000
        # 最大线程数,默认200
        max-threads: 1000
        
    

    相关文章

      网友评论

          本文标题:Tomcat 请求线程的解析

          本文链接:https://www.haomeiwen.com/subject/oqxwcrtx.html