Resin 3 pro高并發,響應性與穩定性方案(轉)
以下方案我是在Intel xeon(至強) 3.2G 2個雙核物理CPU+2G內存(Ecc)上進行:resin版本為resin-pro-3.0.21,JVM為Jrockit 1.5_06, resin java 啟動參數 -Xms256m -Xmx512m
1. 以下為resin.conf配置
1 |
<!-- - Resin 3.0 configuration file. --> <resin xmlns="http://caucho.com/ns/resin" xmlns:resin="http://caucho.com/ns/resin/core"> <!-- - Logging configuration for the JDK logging API. --> <log name="" level="all" path="stdout:" timestamp="[%H:%M:%S.%s] "/> <logger name="com.caucho.java" level="config"/> <logger name="com.caucho.loader" level="config"/> <dependency-check-interval>600s</dependency-check-interval> <javac compiler="internal" args=""/> <thread-pool> <thread-max>10240</thread-max> <spare-thread-min>50</spare-thread-min> </thread-pool> <min-free-memory>5M</min-free-memory> <server> <class-loader> <tree-loader path="${resin.home}/lib"/> <tree-loader path="${server.root}/lib"/> </class-loader> <keepalive-max>1024</keepalive-max> <keepalive-timeout>60s</keepalive-timeout> <resin:if test="${resin.isProfessional()}"> <select-manager enable="true"/> </resin:if> <bind-ports-after-start/> <http server-id="" host="*" port="80"/> <cluster> <srun server-id="" host="127.0.0.1" port="6802"/> </cluster> <resin:if test="${resin.isProfessional()}"> <persistent-store type="cluster"> <init path="session"/> </persistent-store> </resin:if> <ignore-client-disconnect>true</ignore-client-disconnect> <resin:if test="${isResinProfessional}"> <cache path="cache" memory-size="20M"/> </resin:if> <web-app-default> <class-loader> <tree-loader path="${server.root}/ext-webapp"/> </class-loader> <cache-mapping url-pattern="/" expires="60s"/> <cache-mapping url-pattern="*.gif" expires="600s"/> <cache-mapping url-pattern="*.jpg" expires="600s"/> <servlet servlet-name="directory" servlet-class="com.caucho.servlets.DirectoryServlet"> <init enable="false"/> </servlet> <allow-servlet-el/> <session-config> <enable-url-rewriting>false</enable-url-rewriting> </session-config> </web-app-default> <host-default> <class-loader> <compiling-loader path="webapps/WEB-INF/classes"/> <library-loader path="webapps/WEB-INF/lib"/> </class-loader> <!--access-log path="logs/access.log" format='%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' rollover-period="1W"/--> <web-app-deploy path="webapps"/> <ear-deploy path="deploy"> <ear-default> <!-- Configure this for the ejb server - - <ejb-server> - <config-directory>WEB-INF</config-directory> - <data-source>jdbc/test</data-source> - </ejb-server> --> </ear-default> </ear-deploy> <resource-deploy path="deploy"/> <web-app-deploy path="deploy"/> </host-default> <resin:import path="${resin.home}/conf/app-default.xml"/> <host-deploy path="hosts"> <host-default> <resin:import path="host.xml" optional="true"/> </host-default> </host-deploy> <host id="" root-directory="."> <web-app id="/" document-directory="d:\website\chat"> </web-app> </host> </server> </resin> |
2. 在應用的web.xml中加入resin status查看servlet映射
1 |
<servlet-mapping servlet-class='com.caucho.servlets.ResinStatusServlet'> <url-pattern>/resin-status</url-pattern> <init enable="read"/> </servlet-mapping> |
3. 啟動resin,確認應用正常啟動。
4. 寫訪問測試程序
1 |
import java.io.InputStream; import java.net.URL; public class TestURL { public static void main(String[] args) throws Exception { long a = System.currentTimeMillis(); System.out.println("Starting request url:"); for(int i = 0; i < 10000; i++){ URL url = new URL("http://192.168.1.200/main.jsp"); InputStream is = url.openStream(); is.close(); System.out.println("Starting request url:"+i); } System.out.println("request url end.take "+(System.currentTimeMillis()-a)+"ms"); } } |
5. 在Jbuilder中執行TestURL
在執行過程中,一邊刷新http://192.168.1.200/resin-status,查看resin狀態,在http://*:80 中的 Active Threads 和 Total,會一直增長,當長到512的時候不再增長,這時再刷新resin-status頁面時,會發現打開很慢。原因是服務器已經達到最大連接數,在等待前面連接的釋放而不能接受新的連接。
于是下載Resin 3.0.21源碼,搜索 512,發現com.caucho.server.port.Port類中有以下代碼:
1 |
// default timeout private long _timeout = 65000L; private int _connectionMax = 512;//就是這行,查找resin所有源碼后,發現沒有對這個值進行設置 private int _minSpareConnection = 16; private int _keepaliveMax = -1; private int _minSpareListen = 5; private int _maxSpareListen = 10; |
將_connectionMax 改為 20480,然后重新編譯并替換resin.jar中的Port類。
6. 重新啟動Resin,再次運行TestURL進行測試,這次你會發現Threads Active 和 Total 一直變大,且可以超過512一直增大,在測試程序運行過程中刷新頁面,頁面響應性能還是不錯的.
另,測試過程中Resin會打印出 1-3次 強制執行GC的信息,屬于正常。
7.待測試完畢,Threads Active 和 Total 馬上降為1.Idle為9,總內存為536.87Meg 空閑內存為480.33M
再經多次測試,結果一致,內存回收正常,表明當前 resin 穩定性和響應性可靠。
posted on 2008-03-03 08:47 都市淘沙者 閱讀(3406) 評論(0) 編輯 收藏 所屬分類: Tomcat/Weblogic/Resin/Jboss