每個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給你的系統帶來的快感。
2
tomcat6 1000并發量配置 tomcat6配置優化 2009-11-23 20:21 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="400" />
<Connector executor="tomcatThreadPool"
port="80" protocol="HTTP/1.1"
connectionTimeout="20000" enableLookups="false"
redirectPort="8443" URIEncoding="UTF-8" acceptCount="1000" />
修改tomcat/conf/server.xml配置檔案為以上。
修改apache-tomcat-6.0.18/bin/catalina.bat配置檔案為以下。
set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m
這一句加在
rem ---------------------------------------------------------------------------
rem Guess CATALINA_HOME if not defined
之間的位置,不要加到那些if裡面去了,否則不一定會生效.
如果有疑問.可以用
echo %JAVA_OPTS%>d:/JAVA_OPTS.log
來檢視是否正确的設定了.
同時告訴大家如果是安裝服務版的Tomcat,或者自己手動注入到window的管理-->服務 裡去的話,那用這個方式是不行的,需要修改系統資料庫,網上已經有很多内容說明了.大家自己去查吧.
以上配置都是經過loadrun下的反複壓力測試得來的。對一般的jsp頁面(類似于靜态頁面了)響應速度已經是非常快了。
但是對不同的業務邏輯一塊,還是需要不同的處理方法才能達到最優。
伺服器配置:
Intel(R) Xeon(R) CPU 3065 @ 2.33GHz
3.99GB記憶體
3
在Tomcat和應用程式進行了壓力測試後,如果您對應用程式的性能結果不太滿意,就可以采取一些性能調整措施了,當然了前提是應用程式沒有問題,我們這 裡隻講Tomcat的調整。由于Tomcat的運作依賴于JVM,是以在這裡我們把Tomcat的調整可以分為兩類來較長的描述:
外部環境調整
調整非Tomcat元件,例如Tomcat運作的作業系統和運作Tomcat的java虛拟機。
自身調整
修改Tomcat自身的參數,調整Tomcat配置檔案中的參數。
下面我們将詳細講解外部環境調整的有關内容,Tomcat自身調整的内容将在第2部分中闡述。
1.JAVA虛拟機性能優化
Tomcat本身不能直接在計算機上運作,需要依賴于硬體基礎之上的作業系統和一個java虛拟機。您可以選擇自己的需要選擇不同的作業系統 和對應的JDK的版本(隻要是符合Sun釋出的Java規範的),但我們推薦您使用Sun公司釋出的JDK。確定您所使用的版本是最新的,因為Sun公司 和其它一些公司一直在為提高性能而對java虛拟機做一些更新改進。一些報告顯示JDK1.4在性能上比JDK1.3提高了将近10%到20%。
可以給Java虛拟機設定使用的記憶體,但是如果你的選擇不對的話,虛拟機不會補償。可通過指令行的方式改變虛拟機使用記憶體的大小。如下表所示有兩個參數用來設定虛拟機使用記憶體的大小。
參數
描述
-Xms<size>
JVM初始化堆的大小
-Xmx<size>
JVM堆的最大值
這兩個值的大小一般根據需要進行設定。初始化堆的大小執行了虛拟機在啟動時向系統申請的記憶體的大小。一般而言,這個參數不重要。但是有的應用 程式在大負載的情況下會急劇地占用更多的記憶體,此時這個參數就是顯得非常重要,如果虛拟機啟動時設定使用的記憶體比較小而在這種情況下有許多對象進行初始 化,虛拟機就必須重複地增加記憶體來滿足使用。由于這種原因,我們一般把-Xms和-Xmx設為一樣大,而堆的最大值受限于系統使用的實體記憶體。一般使用數 據量較大的應用程式會使用持久對象,記憶體使用有可能迅速地增長。當應用程式需要的記憶體超出堆的最大值時虛拟機就會提示記憶體溢出,并且導緻應用服務崩潰。 因 此一般建議堆的最大值設定為可用記憶體的最大值的80%。
Tomcat預設可以使用的記憶體為128MB,在較大型的應用項目中,這點記憶體是不夠的,需要調大。
Windows下,在檔案{tomcat_home}/bin/catalina.bat,Unix下,在檔案{tomcat_home}/bin/catalina.sh的前面,增加如下設定:
JAVA_OPTS='-Xms【初始化記憶體大小】 -Xmx【可以使用的最大記憶體】'
需要把這個兩個參數值調大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化記憶體為256MB,可以使用的最大記憶體為512MB。
另外需要考慮的是 Java提供的垃圾回收機制 。虛拟機的堆大小決定了虛拟機花費在收集垃圾上的時間和頻度。收集垃圾可以接受的速度與應用有 關,應該通過分析實際的垃圾收集的時間和頻率來調整。如果堆的大小很大,那麼完全垃圾收集就會很慢,但是頻度會降低。如果你把堆的大小和記憶體的需要一緻, 完全收集就很快,但是會更加頻繁。調整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間内最大化處理客戶的請求。在基準測試的時候,為保證最好的性 能,要把堆的大小設大,保證垃圾收集不在整個基準測試的過程中出現。
如果系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過 3-5 秒。如果垃圾收內建為瓶頸,那麼需要指定代的大小,檢查垃圾收集的詳細輸出,研究 垃圾收集參數對性能的影響。一般說來,你應該使用實體記憶體的 80% 作為堆大小。當增加處理器時,記得增加記憶體,因為配置設定可以并行進行,而垃圾收集不是并行的。
2.作業系統性能優化
這裡說的作業系統是指運作web伺服器的系統軟體,當然,不同的作業系統是為不同的目的而設計的。比如OpenBSD是面向安全的,是以在它 的核心中有許多的限制來防止不同形式的服務攻擊(OpenBSD的一句座右銘是“預設是最安全的”)。這些限制或許更多地用來運作活躍的web伺服器。
而我們常用的Linux作業系統的目标是易用使用,是以它有着更高的限制。使用BSD核心的系統都帶有一個名為“Generic”的核心,表 明所有的驅動器都靜态地與之相連。這樣就使系統易于使用,但是如果你要建立一個自定義的核心來加強其中某些限制,那就需要排除不需要的裝置。Linux内 核中的許多驅動都是動态地加載的。但是換而言之,記憶體現在變得越來越便宜,是以因為加載額外的裝置驅動就顯得不是很重要的。重要的是要有更多的記憶體,并且 在伺服器上騰出更多的可用記憶體。
小提示:雖然現在記憶體已經相當的便宜,但還是盡量不要購買便宜的記憶體。那些有牌子的記憶體雖然是貴一點,但是從可靠性上來說,成本效益會更高一些。
如果是在Windows作業系統上使用Tomcat,那麼最好選擇伺服器版本。因為在非伺服器版本上,最終使用者授權數或者作業系統本身所能承受的使用者數、可用的網絡連接配接數或其它方面的一些方面都是有限制的。并且基于安全性的考慮,必須經常給作業系統打上最新的更新檔。
3.Tomcat與其它web伺服器整合使用
雖然tomcat也可以作web伺服器,但其處理靜态html的速度比不上apache,且其作為web伺服器的功能遠不如apache,因 此我們想把apache和tomcat內建起來,将html與jsp的功能部分進行明确分工,讓tomcat隻處理jsp部分,其它的由apache, IIS等這些web伺服器處理,由此大大節省了tomcat有限的工作“線程”。
4.負載均衡
在負載均衡的思路下,多台伺服器為對稱方式, 每台伺服器都具有同等的地位,可以單獨對外提供服務而無須其他伺服器的輔助 。通過負載分擔技術,将外部發送來的請求按一定規則配置設定到對稱結構中的某一台伺服器上,而接收到請求的伺服器都獨立回應客戶機的請求。
提供服務的一組伺服器組成了一個應用伺服器叢集(cluster),并對外提供一個統一的位址。當一個服務請求被發至該叢集時,根據一定規則選擇一台伺服器,并将服務轉定向給該伺服器承擔,即将負載進行均衡分攤。
通過應用負載均衡技術,使應用服務超過了一台伺服器隻能為有限使用者提供服務的限制,可以利用多台伺服器同時為大量使用者提供服務。當某台伺服器 出現故障時,負載均衡伺服器會自動進行檢測并停止将服務請求分發至該伺服器,而由其他工作正常的伺服器繼續提供服務,進而保證了服務的可靠性。
負載均衡實作的方式大概有四種:第一是通過DNS,但隻能實作簡單的輪流配置設定,不能處理故障,第二如果是基于MS IIS, Windows 2003 server本身就帶了負載均衡服務,第三是硬體方式,通過交換機的功能或專門的負載均衡裝置可以實作,第四種是軟體方式,通過一台負載均衡伺服器進行, 上面安裝軟體。使用Apache Httpd Server做負載平衡器,Tomcat叢集節點使用Tomcat就可以做到以上第四種方式。這種方式比較靈活,成本相對也較低。另外一個很大的優點就是 可以根據應用的情況和伺服器的情況采取一些政策。
大家都知道,JAVA程式啟動時都會JVM都會配置設定一個初始記憶體和最大記憶體給這個應用程式。這個初始記憶體和最大記憶體在一定程度都會影響程式的性能。比如說在應用程式用到最大記憶體的時候,JVM是要先去做垃圾回收的動作,釋放被占用的一些記憶體。
是以想調整Tomcat的啟動時初始記憶體和最大記憶體就需要向JVM聲明,一般的JAVA程式在運作都可以通過中-Xms -Xmx來調整應用程式的初始記憶體和最大記憶體:
如:java -Xms64m -Xmx128m a.jar.
tomcat的啟動程式是包裝過的,不能直接使用java -X..... tomcat.*來改變記憶體的設定。在Tomcat在改變這個設定
有兩種方法:
1. 就需要在環境變量中加上TOMCAT_OPTS, CATALINA_OPTS兩個屬性,
如 SET CATALINA_OPTS= -Xms64m -Xmx512m;
ms是最小的,mx是最大,64m, 512m分别是指記憶體的容量.
2. 修改Catalina.bat檔案
在166行“rem Execute Java with the applicable properties ”以下每行
%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs ="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE %" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% 中的%CATALINA_OPTS% 替換成-Xms64m - Xmx512m
Tomcat性能優化
1.停用DNS查詢
server.xml裡
<Connector
port="8887" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
加上enableLookups="false";這樣就不使用DNS查詢,也不會有延遲了
除非需要所有連接配接到伺服器的HTTP用戶端的完整主機名稱
注:Connector的enableLookups性屬的意義是:調用request.getRemoteHost()是否會通過DNS查詢來取得遠處用戶端的真正主機名稱。true表示會查詢,false表示以字元串格式傳回用戶端的IP位址。預設值是:true
2,調整線程的數目
Tomcat使用線程池以便對傳入的請求提供快速的響應。
通過更改Connector的minProcessors與maxProcessors的值,可以控制所配置設定的線程數目
将這兩個參數設為最佳值的最好方式是對各個參數嘗試許多不同的設定值,然後以仿真的網絡流量進行測試,同時并觀察響應時間與記憶體的使用量。每一種 機器、作業系統與JVM的組合都可能有不同的表現,而且并非所有人的網站流量都會相同,是以沒有現成的規則來決定最小與最大的線程數
3.加快jsp的編譯速度,預先編譯jsp
4.容量規劃:經驗式的容量規劃,企業容量規劃
經驗式的容量規劃與企業容量規劃最大的差異就是深度。經驗式容量規劃使用經驗法則,是以比較像是經驗預測,而企業容量規劃則是深度地研究需求與性能,其目标是盡可能産生最精确的數字
apache+tomcat+mysql
Apache+Tomcat+Mysql網站配置
前言:
公司開發了一個網站,估計最高線上人數是3萬,并發人數最多100人。開發的網站是否能否承受這個壓力,如何確定網站的負荷沒有問題,經過研究決定如下:
(1) 采用負載平衡和叢集技術,初步機構采用Apache+Tomcat的機群技術。
(2) 采用壓力測試工具,測試壓力。工具是Loadrunner。
硬體環境搭建:
為了能夠進行壓力測試,需要搭建一個環境。剛開始時,測試在公司區域網路内進行,但很快發現了一個問題,即一個腳本的壓力測試結果每次都不一樣,并且差别很大。原來是受公司網絡的影響,于是決定搭建一個完全隔離的區域網路測試。搭建後的區域網路配置如下:
(1) 網絡速度:100M
(2) 三台伺服器:
負載伺服器 :作業系統windows2003,
Tomcat伺服器:作業系統windows2000 Professional
資料庫伺服器:作業系統windows2000 Professional
三台機器的cpu 2.4 G, 記憶體 1G。
軟體環境搭建:
軟體的版本如下:
Apache 版本:2.054,
Tomcat5.0.30,
mysql :4.1.14.
JDK1.5
壓力測試工具:Loadrunner7.8。
負載平衡方案如下:
一台機器(作業系統2003)安裝apache,作為負載伺服器,并安裝tomcat作為一個worker;一個單獨安裝tomcat,作為第二個worker;剩下的一台單獨作為資料庫伺服器。
Apache和tomcat的負載平衡采用JK1.2.14(沒有采用2.0,主要是2.0不再維護了)。
叢集方案:
采用Tomcat本身的叢集方案。在server.xml配置。
壓力測試問題:
壓力測試後,發現了一些問題,現一一列出來:
(1)采用Tocmat叢集後,速度變得很慢。因為叢集後,要進行session複制,導緻速度較慢。Tomcatd的複制,目前不支援 application 複制。複制的作用,主要用來容錯的,即一台機器有故障後,apache可以把請求自動轉發到另外一個機器。在容錯和速度的考慮上,我們最終選擇速度,去掉 了Tomcat叢集。
(2) 作業系統最大并發使用者的限制:
為了采用網站的壓力,我們開始的時候,僅測試Tomcat的最大負載數。 Tomcat伺服器安裝的作業系統是windows2000 Professional。當我們用壓力測試工具,并發測試時,發現隻要超過15個并發使用者,會經常出現無法連接配接伺服器的情況。經過研究,發現是作業系統 的問題:windows2000 Professional 支援的并發通路使用者有限,預設的好像是15個。于是我們把作業系統全部采用windows2003 server版本。
(3) 資料庫連接配接池的問題:
測試資料庫連接配接性能時,發現資料庫連接配接速度很慢。每增加一些使用者,連接配接性能就差了很多。我們采用的資料庫連接配接池是DBCP,預設的初始化為50 個,應該不會很慢吧。查詢資料庫的連接配接數,發現初始化,隻初始化一個連接配接。并發增加一個使用者時,程式就會重新建立一個連接配接,導緻連接配接很慢。原因就在這裡 了。如何解決呢?偶爾在 JDK1.4下的Tomcat5.0.30下執行資料庫連接配接壓力測試,發現速度很快,程式建立資料庫連接配接的速度也是很快的。看來JDK1.5的JDBC驅 動程式有問題。于是我們修改 JDK的版本為1.4.
(4) C3P0和DBCP
C3P0是Hibernate3.0預設的自帶資料庫連接配接池,DBCP是Apache開發的資料庫連接配接池。我們對這兩種連接配接池進行壓力測試對比,發現在并發300個使用者以下時,DBCP比C3P0平均時間快1秒左右。但在并發400個使用者時,兩者差不多。
速度上雖然DBCP比C3P0快些,但是有BUG:當DBCP建立的資料庫連接配接,因為某種原因斷掉後,DBCP将不會再重新建立新的連接配接,導緻必須重新啟動Tomcat才能解決問題。DBCP的BUG使我們決定采用C3P0作為資料庫連接配接池。
調整後的方案:
作業系統Windows2003 server版本
JDK1.4
Tomcat 5.0.30
資料庫連接配接池C3P0
僅采用負載平衡,不采用叢集。
軟體的配置:
Apache配置:主要配置httpd.conf和新增加的檔案workers.properties
Httpd.conf:
#一個連接配接的最大請求數量
MaxKeepAliveRequests 10000
#NT環境,隻能配置這個參數來提供性能
<IfModule mpm_winnt.c>
#每個程序的線程數,最大1920。NT隻啟動父子兩個程序,不能設定啟動多個程序
ThreadsPerChild 1900
每個子程序能夠處理的最大請求數
MaxRequestsPerChild 10000
</IfModule>
# 加載mod_jk
#
LoadModule jk_module modules/mod_jk.so
#
# 配置mod_jk
#
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel info
#請求分發,對jsp檔案,.do等動态請求交由tomcat處理
DocumentRoot "C:/Apache/htdocs"
JkMount /*.jsp loadbalancer
JkMount /*.do loadbalancer
JkMount /servlet/* loadbalancer
#關掉主機Lookup,如果為on,很影響性能,可以有10多秒鐘的延遲。
HostnameLookups Off
#緩存配置
LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so
<IfModule mod_cache.c>
CacheForceCompletion 100
CacheDefaultExpire 3600
CacheMaxExpire 86400
CacheLastModifiedFactor 0.1
<IfModule mod_disk_cache.c>
CacheEnable disk /
CacheRoot c:/cacheroot
CacheSize 327680
CacheDirLength 4
CacheDirLevels 5
CacheGcInterval 4
</IfModule>
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 8192
MCacheMaxObjectCount 10000
MCacheMinObjectSize 1
MCacheMaxObjectSize 51200
</IfModule>
</IfModule>
worker. Properties檔案
#
# workers.properties ,可以參考
::URL::http://jakarta.apache.org/tomcat/connectors-doc/config/workers.html
# In Unix, we use forward slashes:
ps=/
# list the workers by name
worker.list=tomcat1, tomcat2, loadbalancer
# ------------------------
# First tomcat server
# ------------------------
worker.tomcat1.port=8009
worker.tomcat1.host=localhost
worker.tomcat1.type=ajp13
# Specify the size of the open connection cache.
#worker.tomcat1.cachesize
#
# Specifies the load balance factor when used with
# a load balancing worker.
# Note:
# ----> lbfactor must be > 0
# ----> Low lbfactor means less work done by the worker.
worker.tomcat1.lbfactor=900
# ------------------------
# Second tomcat server
# ------------------------
worker.tomcat1.port=8009
worker.tomcat1.host=202.88.8.101
worker.tomcat1.type=ajp13
# Specify the size of the open connection cache.
#worker.tomcat1.cachesize
#
# Specifies the load balance factor when used with
# a load balancing worker.
# Note:
# ----> lbfactor must be > 0
# ----> Low lbfactor means less work done by the worker.
worker.tomcat1.lbfactor=2000
# ------------------------
# Load Balancer worker
# ------------------------
#
# The loadbalancer (type lb) worker performs weighted round-robin
# load balancing with sticky sessions.
# Note:
# ----> If a worker dies, the load balancer will check its state
# once in a while. Until then all work is redirected to peer
# worker.
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1,tomcat2
#
# END workers.properties
#
Tomcat1配置:
<!--配置server.xml
去掉8080端口,即注釋掉如下代碼:-->
<Connector
port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" />
<!--配置8009端口如下:-->
<Connector port="8009"
maxThreads="500" minSpareThreads="400" maxSpareThreads="450"
enableLookups="false" redirectPort="8443" debug="0"
protocol="AJP/1.3" />
<!--配置引擎-->
<Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="tomcat1">
啟動記憶體配置,開發configure tomcat程式即可配置:
Initial memory pool: 200 M
Maxinum memory pool:300M
Tomcat2配置:
配置和tomcat1差不多,需要改動的地方如下:
<!--配置引擎-->
<Engine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="tomcat2">
啟動記憶體配置,開發configure tomcat程式即可配置:
Initial memory pool: 512 M
Maxinum memory pool:768M
Mysql配置:
Server類型:Dedicated MySQL Server Machine
Database usage:Transational Database Only
并發連接配接數量:Online Transaction Processing(OLTP)
字元集:UTF8
資料庫連接配接池的配置:
我們采用的是spring 架構,配置如下:
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.connection.url">jdbc:mysql://202.88.1.103/db</prop>
<prop key="hibernate.connection.username">sa</prop>
<prop key="hibernate.connection.password"></prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.use_sql_comments">false</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
<prop key="hibernate.max_fetch_depth">2</prop>
<prop key="hibernate.c3p0.max_size">200</prop>
<prop key="hibernate.c3p0.min_size">5</prop>
<prop key="hibernate.c3p0.timeout">12000</prop>
<prop key="hibernate.c3p0.max_statements">50</prop>
<prop key="hibernate.c3p0.acquire_increment">1</prop>
</props>
</property>
其他的沒有額外配置。
LoadRunner 常見問題:
(1)sofeware caused connction:這種情況,一般是腳本有問題,或者loadrunner有問題。解決方法:重新啟動機器,或者重新錄制腳本,估計是loadrunner的bug。
(2)cannot connect to server:無法連接配接到伺服器。這種情況是伺服器的配置有問題,伺服器無法承受過多的并發連接配接了。需要優化伺服器的配置,
如作業系統采用windows 2003 server,
優化tomcat配置:maxThreads="500" minSpareThreads="400" maxSpareThreads="450"。但是tomcat 最多支援500個并發通路
優化apache配置:
ThreadsPerChild 1900
MaxRequestsPerChild 10000
其他的錯誤如:
Action.c(10): Error -27791: Server has shut down the connection prematurely
HTTP Status-Code=503 (Service Temporarily Unavailable)
一般都是由于伺服器配置不夠好引起的,按照問題(2)處理,如果仍舊不行,需要優化硬體和調整程式了。
Apache問題:
(1) File does not exist: C:/Apache/htdocs/favicon.ico:
這個問題是apache,htdocs目錄沒有favicon.ico檔案引起的,該檔案是網站的圖示,僅在firefox,myIE等浏覽器出現。
(2) 圖檔無法顯示:
配置apache後,卻無法顯示圖檔。
解決方法:把程式的圖檔,按照程式結構copy到apache的htdocs目錄下。
(3) 無法處理請求:
當我們輸入 ***.do 指令後,apache确傳回錯誤資訊,而連接配接tomcat卻沒有問題。原因是沒有把.do指令轉發給tomcat處理。解決方法如下:
在apache配置檔案中配置如下内容:
DocumentRoot "C:/Apache/htdocs"
JkMount /*.jsp loadbalancer
JkMount /*.do loadbalancer
總結:
網站的壓力測試,涉及的知識面挺廣的,不僅要熟悉壓力測試工具,還要知道如何配置和優化應用伺服器和資料庫,并且需要知道如何優化網絡、作業系統、硬體系統。
測試中不僅要善于發現問題,要知道如何解決。最重要的一點,要有良好的測試方法。剛開始測試時,可以從最簡單的測試腳本入手,不需要太複雜的腳 本,這樣便于發現問題。如我們剛開始時,就從一個簡單的下載下傳登陸界面的腳本入手,測試一個tomcat的壓力負載。一個簡單的擷取登陸的腳本,幫助我們優 化了 tomcat的配置;後來再測試資料庫連接配接,也是一個簡單的資料庫連接配接腳本,幫助我們優化了資料庫連接配接池;然後利用這些簡單的腳本,測試apache的負 載平衡,優化了apache配置。最後運作複雜的腳本,模拟多種角色的使用者在不同時間下的處理,以測試網站壓力負載。
4
1.Tomcat預設可以使用的java記憶體為128MB,在較大型的應用項目中,這點記憶體是不夠的,需要調大。
Windows下,在檔案{tomcat_home}/bin/catalina.bat,Unix下,在檔案{tomcat_home}/bin/catalina.sh的前面,增加如下設定:
JAVA_OPTS='-Xms【初始化記憶體大小】 -Xmx【可以使用的最大記憶體】'
需要把這個兩個參數值調大。例如:
JAVA_OPTS='-Xms256m -Xmx512m'
表示初始化記憶體為256MB,可以使用的最大記憶體為512MB。
2. 作業系統 性能優化
預設windows下打開檔案數是2000;在linux下是1024;
vi /etc/profile 加入ulimit -n 4096就把linux改成打開檔案最大數為4096
3. 禁用DNS查詢
當web應用程式向要記錄用戶端的資訊時,它也會記錄用戶端的IP位址或者通過域名伺服器查找機器名轉換為IP位址。DNS查詢需要占用網絡,并且包 括可能從很多很遠的伺服器或者不起作用的伺服器上去擷取對應的IP的過程,這樣會消耗一定的時間。為了消除DNS查詢對性能的影響我們可以關閉DNS查 詢,方式是修改server.xml檔案中的enableLookups參數值:
4. 在Tomcat5對這些參數進行了調整,請看下表:
屬性名 | 描述 |
maxThreads | Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可建立的最大的線程數。 |
acceptCount | 指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求将不予處理。 |
connnectionTimeout | 網絡連接配接逾時,機關:毫秒。設定為0表示永不逾時,這樣設定有隐患的。通常可設定為30000毫秒。 |
minSpareThreads | Tomcat初始化時建立的線程數。 |
maxSpareThreads | 一旦建立的線程超過這個值,Tomcat就會關閉不再需要的socket線程。 |
5.在web下不顯示目錄清單
在web.xml中把listings改成false就行了