Tomcat6.18版本:apache-tomcat-6.0.18
Why
每個web客戶端請求對於服務器端來說就一個單獨的線程,客戶端的請求數量增多將會導致線程數就上去了,CPU就忙着跟線程切換。
而NIO則是使用單線程(單個CPU)或者只使用少量的多線程(多CPU)來接受Socket,而由線程池來處理堵塞在pipe或者隊列里的請求.這樣的話,只要OS可以接受TCP的連接,web服務器就可以處理該請求。大大提高了web服務器的可伸縮性。
大家都聽說了在Apache Tomcat6 中支持了Java語言的特性 NIO( New I/O),不管你對NIO的技術是否熟悉,但你肯定能想象的到NIO是一個好東西。的確,使用NIO在服務器端會有更好的性能,加強服務器端對並發處理的性能。 請注意:很抱歉,在tomcat6在默認的配置選項中是沒有把NIO功能打開。所以很多正在使用Tomcat6的朋友們本以為能快活的使用上NIO。
不信,你可以試試,從Apache Tomcat 站點下載 的Tomct6 壓縮包中 conf/server.xml的 配置文件第69行,內容如下:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
進行測試,可以在控制台的啟動信息里看見,默認狀態下沒有被打開nio配置,啟動時的信息,如下:
2010-2-1 12:59:40 org.apache.coyote.http11.Http11Protocol init
信息: Initializing Coyote HTTP/1.1 on http-8080
2010-2-1 12:59:40 org.apache.catalina.startup.Catalina load
修改成支持NIO的類型,配置如下:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
進行測試,被打開nio配置,啟動時的信息,如下:
2010-2-1 13:01:01 org.apache.tomcat.util.net.NioSelectorPool getSharedSelector
信息: Using a shared selector for servlet write/read
2010-2-1 13:01:01 org.apache.coyote.http11.Http11NioProtocol init
信息: Initializing Coyote HTTP/1.1 on http-8080
這樣才能讓你真正體驗到Tomcat6下NIO給你的系統帶來的快感。
–end–
黃海的配置:
<Connector port="8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
executor="tomcatThreadPool"
compression="on"
compressionMinSize="2048"
maxThreads="30000"
minSpareThreads="512"
maxSpareThreads="2048"
enableLookups="false"
redirectPort="8443"
acceptCount="35000"
debug="0"
connectionTimeout="40000"
disableUploadTimeout="true" URIEncoding="UTF-8" useBodyEncodingForURI="true" />
連接器使用的線程池的名子:executor="tomcatThreadPool"
連接器端口 :port="8090"
連接器使用的傳輸方式 :protocol="org.apache.coyote.http11.Http11NioProtocol"
傳輸時是否支持壓縮 :compression="on"
壓縮的大小 :compressionMinSize="2048"
3.設置Tomcat連接器池。
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="350" />
黃海在配置文件中添加了如下配置:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="350" />
線程池名: name="tomcatThreadPool"
線程前綴: namePrefix="catalina-exec-"
最大產生線程數:maxThreads="1000"
最小初始現程數:minSpareThreads="350"
問題描述:
系統環境(在 Tomcat Server Status 中直接復制過來)
Tomcat Version | JVM Version | JVM Vendor | OS Name | OS Version | OS Architecture |
Apache Tomcat/6.0.32 | 1.6.0_20-b02 | Sun Microsystems Inc. | Windows XP | 5.1 | x86 |
在 Tomcat 的 $CATALINA_HOME/bin 目錄下加了 tcnative-1.dll ,結果關閉服務時出現如下錯誤。
- 2011-8-2 9:03:53 org.apache.tomcat.util.net.AprEndpoint$Acceptor run
- 嚴重: Socket accept failed
- org.apache.tomcat.jni.Error: A blocking operation was interrupted by a call to WSACancelBlockingCall.
- at org.apache.tomcat.jni.Socket.accept(Native Method)
- at org.apache.tomcat.util.net.AprEndpoint$Acceptor.run(AprEndpoint.java:1109)
- at java.lang.Thread.run(Thread.java:595)
- 2011-8-2 9:03:53 org.apache.coyote.ajp.AjpAprProtocol destroy
- 信息: Stopping Coyote AJP/1.3 on ajp-8009
解決:
問題根源 :你下載的 tcnative-1.dll 文件不是 Tomcat 原始使用的那個版本文件
在 $CATALINA_HOME/webapps/docs/apr.html 打開其官方 Apache Portable Runtime (APR) 文檔 描述,其 APR 包的源碼在 bin/tomcat-native.tar.gz 歸檔文件中。所以,打開該文件就可以知道該 Tomcat native 的版本是多少,然后就到 Tomcat native 下載中心 下載相同版本的 tcnative-1.dll 和 openssl.exe 即可。問題搞定了, 就 這么簡單!如果版本不一樣,就可能會出現上面這個問題,這就是引起該問題的根源所在。
Ok,就說這么多了!^_^