Tomcat-connector的微調(2): maxConnections, maxThreads
阿新 • • 發佈:2018-12-23
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,對一般訪問量的應用來說足夠了。