Resin3.1 優化(轉)
使用resin已經有四、五年了,但以前都是做一些小系統,resin的壓力并不大,近段時間做一個大系統,日平均ip上10萬,resin的壓力非常的大,除了對程序做優化以外,resin 的優化也小不了。
一、優化配置
修改 conf/resin.conf 文章中的 JVM參數
<jvm-arg>-Xms512m</jvm-arg>
<jvm-arg>-Xss128k</jvm-arg>
<jvm-arg>-Xmn184m</jvm-arg>
<jvm-arg>-XX:ParallelGCThreads=20</jvm-arg>
<jvm-arg>-XX:+UseConcMarkSweepGC</jvm-arg>
<jvm-arg>-XX:+UseParNewGC</jvm-arg>
<jvm-arg>-Xdebug</jvm-arg>
<jvm-arg>-Xloggc:gc.log</jvm-arg>
修改 最大thread-max為2500
<!-- Maximum number of threads. -->
<thread-max>2500</thread-max>
<!-- Configures the socket timeout -->
<socket-timeout>65s</socket-timeout>
<!-- Configures the keepalive -->
<keepalive-max>10240</keepalive-max>
<keepalive-timeout>30s</keepalive-timeout>
二、利用resin-admin監控resin運行情況。

第一行是Thread pool情況,如果發現Peak大于thread max,就應該修改conf/resin.conf 中的thread-max,相應的增大thread-max。
第二行是Threads,如果長期出現在這里而又不是SUN的方法,或者resin的方法的話,就要對這些方法進行測試、優化。
最近發現有人用黑客類工具惡意點擊網站,或發送大量垃圾包,具體是什么不清楚,但是很明顯是故意的,造成80端口無法正常訪問,或訪問速度極慢。
用netstat -an >>c:\temp\aaa.txt 命令查看了當時情況,發現某幾個ip的連接數量巨大,是不正常的。
不管是訪問量大,還是有黑客騷擾,我想還是試試看把resin優化一下。
首先要在訪問量巨大的時候進行觀察。
先將resin.conf文件中的thread-min,thread-max,thread-keepalive三個參數設置的比較大,分別寫上,1000,3000,1000,當然這是根據你的機器情況和可能同時訪問的數量決定的,如果你的網站訪問量很大的,應該再適當放大。
然后觀察任務管理器中的java線程變化情況,看看到底是線程達到多大的時候,java進程當掉的。我的是在379左右當掉。
然后將thread-min,thread-max,thread-keepalive分別寫為150,400,300;,也就是將當掉的時候的最大值稍微放大點,作為thread-max的值,因為該系統一般不會超過這個值。然后其他兩個參數根據情況設置一下。
這只是我的估計值,根據機器性能和訪問量不同,應該有所不同。
然后將accept-buffer-size值設置的較大,我設置到10000以上,這樣可以讓java能使用到更多的內存資源。
這樣的設置基本上能夠滿足resin的正常運行,當掉resin服務的情況大大減少,本設置適合于中小型網站。
Resin Threads |
Resin will automatically allocate and free threads as the load requires. Since the threads are pooled, Resin can reuse old threads without the performance penalty of creating and destroying the threads. When the load drops, Resin will slowly decrease the number of threads in the pool until is matches the load.
Most users can set
to something large (200 or greater) and then forget about the threading. Some ISPs dedicate a JVM per user and have many JVMs on the same machine. In that case, it may make sense to reduce the to throttle the requests.Since each servlet request gets its own thread,
determines the maximum number of concurrent users. So if you have a peak of 100 users with slow modems downloading a large file, you'll need a of at least 100. The number of concurrent users is unrelated to the number of active sessions. Unless the user is actively downloading, he doesn't need a thread (except for "keepalives").
Keepalives |
Keepalives make HTTP and srun requests more efficient. Connecting to a TCP server is relatively expensive. The client and server need to send several packets back and forth to establish the connection before the first data can go through. HTTP/1.1 introduced a protocol to keep the connection open for more requests. The srun protocol between Resin and the web server plugin also uses keepalives. By keeping the connection open for following requests, Resin can improve performance.
<resin ...> <thread-pool> <thread-max>250</thread-max> </thread-pool> <server> <keepalive-max>500</keepalive-max> <keepalive-timeout>120s</keepalive-timeout> ... |
Timeouts
Requests and keepalive connections can only be idle for a limited time before Resin closes them. Each connection has a read timeout,
. If the client doesn't send a request within the timeout, Resin will close the TCP socket. The timeout prevents idle clients from hogging Resin resources.
... <thread-pool> <thread-max>250</thread-max> </thread-pool> <server> <http port="8080" read-timeout="30s" write-timeout="30s"/> ... |
... <thread-max>250</thread-max> <server> <cluster> <client-live-time>20s</client-live-time> <srun id="a" port="6802" read-timeout="30s"/> </cluster> ... |
In general, the read-timeout and keepalives are less important for Resin standalone configurations than Apache/IIS/srun configurations. Very heavy traffic sites may want to reduce the timeout for Resin standalone.
Since
will close srun connections, its setting needs to take into consideration the setting for mod_caucho or isapi_srun. is the time the plugin will keep a connection open. must always be larger than , otherwise the plugin will try to reuse a closed socket.Plugin keepalives (mod_caucho/isapi_srun)
The web server plugin, mod_caucho, needs configuration for its keepalive handling because requests are handled differently in the web server. Until the web server sends a request to Resin, it can't tell if Resin has closed the other end of the socket. If the JVM has restarted or if closed the socket because of
, mod_caucho will not know about the closed socket. So mod_caucho needs to know how long to consider a connection reusable before closing it. tells the plugin how long it should consider a socket usable.Because the plugin isn't signalled when Resin closes the socket, the socket will remain half-closed until the next web server request. A
will show that as a bunch of sockets in the FIN_WAIT_2 state. With Apache, there doesn't appear to be a good way around this. If these become a problem, you can increase and so the JVM won't close the keepalive connections as fast.
unix> netstat ... localhost.32823 localhost.6802 32768 0 32768 0 CLOSE_WAIT localhost.6802 localhost.32823 32768 0 32768 0 FIN_WAIT_2 localhost.32824 localhost.6802 32768 0 32768 0 CLOSE_WAIT localhost.6802 localhost.32824 32768 0 32768 0 FIN_WAIT_2 ... |
TCP limits (TIME_WAIT)
A client and a server that open a large number of TCP connections can run into operating system/TCP limits. If mod_caucho isn't configured properly, it can use too many connections to Resin. When the limit is reached, mod_caucho will report "can't connect" errors until a timeout is reached. Load testing or benchmarking can run into the same limits, causing apparent connection failures even though the Resin process is running fine.
The TCP limit is the TIME_WAIT timeout. When the TCP socket closes, the side starting the close puts the socket into the TIME_WAIT state. A
will short the sockets in the TIME_WAIT state. The following shows an example of the TIME_WAIT sockets generated while benchmarking. Each client connection has a unique ephemeral port and the server always uses its public port:
unix> netstat ... tcp 0 0 localhost:25033 localhost:8080 TIME_WAIT tcp 0 0 localhost:25032 localhost:8080 TIME_WAIT tcp 0 0 localhost:25031 localhost:8080 TIME_WAIT tcp 0 0 localhost:25030 localhost:8080 TIME_WAIT tcp 0 0 localhost:25029 localhost:8080 TIME_WAIT tcp 0 0 localhost:25028 localhost:8080 TIME_WAIT ... |
The socket will remain in the TIME_WAIT state for a system-dependent time, generally 120 seconds, but usually configurable. Since there are less than 32k ephemeral socket available to the client, the client will eventually run out and start seeing connection failures. On some operating systems, including RedHat Linux, the default limit is only 4k sockets. The full 32k sockets with a 120 second timeout limits the number of connections to about 250 connections per second.
If mod_caucho or isapi_srun are misconfigured, they can use too many connections and run into the TIME_WAIT limits. Using keepalives effectively avoids this problem. Since keepalive connections are reused, they won't go into the TIME_WAIT state until they're finally closed. A site can maximize the keepalives by setting
large and setting and to large values. limits the maximum number of keepalive connections. and will configure how long the connection will be reused.
... <thread-pool> <thread-max>250</thread-max> </thread-pool> <server> <keepalive-max>250</keepalive-max> <keepalive-timeout>120s</keepalive-timeout> <cluster> <client-live-time>120s</client-live-time> <srun id="a" port="6802" read-timeout="120s"/> </cluster> ... |
must always be larger than . In addition, should be larger than the maximum number of Apache processes.
Apache 1.3 issues
Using Apache as a web server on Unix introduces a number of issues because Apache uses a process model instead of a threading model. The Apache processes don't share the keepalive srun connections. Each process has its own connection to Resin. In contrast, IIS uses a threaded model so it can share Resin connections between the threads. The Apache process model means Apache needs more connections to Resin than a threaded model would.
In other words, the keepalive and TIME_WAIT issues mentioned above are particularly important for Apache web servers. It's a good idea to use
to check that a loaded Apache web server isn't running out of keepalive connections and running into TIME_WAIT problems.
先將resin.conf文件中的thread-min,thread-max,thread-keepalive三個參數設置的比較大,分別寫上,1000,3000,1000,當然這是根據你的機器情況和可能同時訪問的數量決定的,如果你的網站訪問量很大的,應該再適當放大。
然后觀察任務管理器中的java線程變化情況,看看到底是線程達到多大的時候,java進程當掉的。我的是在379左右當掉。
然后將thread-min,thread-max,thread-keepalive分別寫為150,400,300;,也就是將當掉的時候的最大值稍微放大點,作為thread-max的值,因為該系統一般不會超過這個值。然后其他兩個參數根據情況設置一下。
這只是我的估計值,根據機器性能和訪問量不同,應該有所不同。
然后將accept-buffer-size值設置的較大,我設置到10000以上,這樣可以讓java能使用到更多的內存資源。
這樣的設置基本上能夠滿足resin的正常運行,當掉resin服務的情況大大減少,本設置適合于中小型網站。
Resin優化:
The allocation of memory for the JVM is specified using -X options when starting Resin
(the exact options may depend upon the JVM that you are using, the examples here are for the Sun JVM).
JVM option passed to Resin Meaning
-Xms initial java heap size
-Xmx maximum java heap size
-Xmn the size of the heap for the young generation
Resin startup with heap memory options unix> bin/httpd.sh -Xmn100M -Xms500M -Xmx500M win> bin/httpd.exe -Xmn100M -Xms500M -Xmx500M install win service> bin/httpd.exe -Xmn100M -Xms500M -Xmx500M -install
原文:http://www.caucho.com/resin-3.0/performance/jvm-tuning.xtp
JVM 優化:
java -Xms<size>
set initial Java heap size. default:Xms32m
java -Xmx<size>
set maximum Java heap size. default:Xmx128m
set it like that:
java -Xms=32m -Xmx=256m
If the problem persist, increase Xmx more than 256 ( 512m for example )
-J-mx<num>
Resin啟動時通過bin目錄下的wrapper.pl文件進行控制,我們可以修改這個文件來加一些參數,比如要加入Java的-Xms和-Xmx參數
進行
vi /usr/local/resin-2.1/bin/wrapper.pl
找到并修改以下這行為:
$JAVA_ARGS="-Xms512m -Xmx512m";
具體參數請根據自己的應用進行調節
log設置 name 是指定對各個層次應用進行debug,name 設定有幾種情況,如: level 的級別一般有:: path: 輸出文件路徑指向,可以形式如 path=’stdout:’ 注意后面有冒號;或指定絕對路徑path=’/usr/local/resin-3.0.7/log/stdout.log’ 一般設置日志文件一周輪循一次,即 rollover-period=’1M’ 或 rollover-period=’7D’ , 當滿一周,系統會自動生成新日志記錄文件,格式如: stderr.log.20041201 stderr.log.20041208 |
當不需要改動程序時,關閉java自動編譯會更快些.
<compiling-loader path="webapps/WEB-INF/classes" />
加個屬性
batch="false"
$JAVA_ARGS="-server";
據說java中的-server參數是讓本地化編譯更完全.
posted on 2008-03-03 09:51 都市淘沙者 閱讀(4155) 評論(1) 編輯 收藏 所屬分類: Tomcat/Weblogic/Resin/Jboss