閱讀676 返回首頁    go 技術社區[雲棲]


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,對一般訪問量的應用來說足夠了。

最後更新:2017-05-23 17:03:10

  上一篇:go  六招教你用Python構建好玩的深度學習應用
  下一篇:go  把可視化從業者的生存現狀可視化出來:他們是誰?