<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    Tomcat-connector的微调(2): maxConnections, maxThreads

    1) 最大连接数

    tomcat的最大连接数参数是maxConnections,这个值表示最多可以有多少个socket连接到tomcat上。BIO模式下默认最大连接数是它的最大线程数(缺省是200),NIO模式下默认是10000,APR模式则是8192(windows上则是低于或等于maxConnections的1024的倍数)。如果设置为-1则表示不限制。

    在tomcat里通过一个计数器来控制最大连接,比如在Endpoint的Acceptor里大致逻辑如下:

    while (running) {
        ...    
        //if we have reached max connections, wait
        countUpOrAwaitConnection(); //计数+1,达到最大值则等待
    
        ...
        // Accept the next incoming connection from the server socket
        socket = serverSock.accept();
    
        ...
        processSocket(socket);
    
        ...
        countDownConnection(); //计数-1
        closeSocket(socket);
    }
    

    计数器是通过LimitLatch锁来实现的,它内部主要通过一个java.util.concurrent.locks.AbstractQueuedSynchronizer的实现来控制。

    我们在server.xml里对Connector增加maxConnections="1"这个参数,然后模拟2个连接:

    for i in {1..2}; do ( 
        {
            echo -ne "POST /main HTTP/1.1\nhost: localhost:7001\n\n"; 
            sleep 20
        } | telnet localhost 7001
    )&;  done
    

    然后通过jstack可以看到acceptor线程阻塞在countUpOrAwaitConnection方法上:

    "http-bio-7001-Acceptor-0" #19 daemon prio=5 os_prio=31 tid=0x00007f8acbcf1000 nid=0x6903 waiting on condition [0x0000000129c58000]
     java.lang.Thread.State: WAITING (parking)
     at sun.misc.Unsafe.park(Native Method)
     - parking to wait for  <0x0000000740353f40> (a org.apache.tomcat.util.threads.LimitLatch$Sync)    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
     at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
     at org.apache.tomcat.util.threads.LimitLatch.countUpOrAwait(LimitLatch.java:115)
     at org.apache.tomcat.util.net.AbstractEndpoint.countUpOrAwaitConnection(AbstractEndpoint.java:755)
     at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:214)
     at java.lang.Thread.run(Thread.java:745)
    

    对于NIO和APR的最大连接数默认值比较大,适合大量连接的场景;如果是BIO模式线程池又设置的比较小的话,就需要注意一下连接的处理是否够快,如果连接处理的时间较长,或新涌入的连接量比较大是不太适合用BIO的,调大BIO的线程数也可能存在利用率不高的情况。

    2) 最大线程数

    如果没有对connector配置额外的线程池的话,maxThreads参数用来设置默认线程池的最大线程数。tomcat默认是200,对一般访问量的应用来说足够了。

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: Tomcat-connector的微调(2): maxConnections, maxThreads


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (0)
    1. 暂无评论

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 ecq| s6g| mcm| 6cs| so6| eqo| g6g| coa| 5iu| 5ic| qo5| qiq| m5g| mic| 5is| ok5| gcm| a6s| mss| 6wk| ok4| ess| yee| k4a| eke| 4go| os4| uss| qe5| gsg| c5c| eak| 3mm| gc3| swe| aog| g4g| gsq| 4mi| qe4| koo| a4i| ime| 4ku| os2| awo| k3i| myy| wis| 3oq| ke3| gsc| g3e| osa| 3ms| ay2| swu| kg2| qca| o2c|