LoaRunner性能測試系統(tǒng)學習教程:鏈接器配置(6)

上期我們講到LoaRunner性能測試Tomcat配置,這期我們講LoaRunner性能測試鏈接器配置。

連接器配置

接連器元素是Tomcat用于連接外部程序的,其允許Catalina接受請求,傳送到Web應用程序,將生成的動態(tài)信息通過連接器返回到Tomcat服務器。Tomcat的連接器包括兩種:HTTP和AJP。??

每個連接器元素都有一個端口,Tomcat會通過這個端口來監(jiān)聽請求,并且會為服務器和引擎中的連接器元素設置等級,這樣管理員可以通過創(chuàng)建邏輯結構來管理這些數(shù)據(jù)流。此外,用戶的請求通過路由器可以找到相應的服務器,連接器通過連接可以將Tomcat與其它web技術進行連接(如Apache服務器),這樣可以有效平衡負載。??

連接器元素只有一件事,就是監(jiān)聽請求,并通過引擎獲得指定端口上返回的結果。就它本身來說,這個連接器自身沒什么功效,這個元素包含的唯一信息是輸入和輸出的端口,以及一些告訴它如何準確輸入和輸出的特性。??

那么如何通過嵌套連接器來實現(xiàn)我們需要的功能呢?下面是一個例子:??

<Server>??

<Service>??

<Connectorport="8443"/>??

<Connectorport="8444"/>??

<Engine>??

<Hostname="yourhostname">??

<Contextpath="/webapp1"/>??

<Contextpath="/webapp2"/>??

</Host>??

</Engine>??

</Service>??

</Server>??

上例中定義了兩個連接元素,監(jiān)聽的兩個端口號為8443和8444,但需要注意的是每個操作系統(tǒng)每個連接器只允許一個端口,所以每個編輯器需要為自己定義一個指定的端口。并且這兩個連接器元素都嵌套在一個服務器元素中,這樣可以告訴連接器如何監(jiān)聽指定的端口,并且通過服務器的引擎連接器可以處理這些請求并將處理后的結果返回到連接器。??

根據(jù)該例設置,這兩個連接器都是使用相同的引擎發(fā)送請求,同樣反過來,也是通過這個引擎來獲得Web應用程序返回的結果。??

如果現(xiàn)在想修改當前配置,不需要每個連接器返回的請求有兩個響應,只需要每個連接器返回其指定的端口信息,要實現(xiàn)該功能,只要對配置進行如下修改即可:??

<Server>??

<Servicename="Catalina">??

<Connectorport="8443"/>??

<Engine>??

<Hostname="yourhostname">??

<Contextpath="/webapp1"/>??

</Host>??

</Engine>??

</Service>??

<Servicename="Catalina8444">??

<Connectorport="8444"/>??

<Engine>??

<Hostname="yourhostname">??

<Contextpath="/webapp2"/>??

</Host>??

</Engine>??

</Service>??

</Server>??

該例中使用了兩個不同的服務,使用兩個不同的連接器,通過連接器中兩個不同端口和引擎連接到同一臺服務器,雖然變的復雜了,但是層次結構更簡單。??

HTTP連接器??

雖然Tomcat設計了一個servlet容器,但其它功能只能適用于一個獨立的Web服務器,而servlet容器的這些功能HTTP連接器也可以實現(xiàn)。HTTP連接器使用HTTP/1.1協(xié)議,它代表一個單獨的連接器組件,監(jiān)聽一個給定的服務器上指定的TCP端口的連接。??

連接器有很多屬性,通過修改一些屬性可以精確的指定它的功能,并且可以對功能進行授權,如代理和重定向。其兩個最重要的屬性是“協(xié)議”和“SSLEnabled”。??

“協(xié)議”屬性主要定義連接器使用的通信協(xié)議,默認的通信協(xié)議為HTTP/1.1,但可以對通信協(xié)議進行修改,并且允許設置更多的其它的協(xié)議。

例如,希望調(diào)整socket的性能,可以將“協(xié)議”屬性項設置為NIO(JavaNewIO簡稱)協(xié)議。如果將“SSLEnabled”屬性設置為“True”連接器會使用SSL握手、SSL加密和SSL解密。??

HTTP連接器也可以作用為負載均衡的一種解決方案,配合HTTP負載平衡器可以支持粘性會話,如mod_proxy方法,但是如果處理代理的情況AJP連接器比HTTP連接器效果更好。??

AJP連接器??

AJP連接器的工作方式與HTTP連接器的方式一樣

但其使用的協(xié)議為AJP協(xié)議,ApacheJServ協(xié)議或AJP協(xié)議

AJP協(xié)議是一個優(yōu)化的二進制版本的協(xié)議

通常用于Tomcat服務器與ApacheWeb應用程序進行通訊。??

AJP連接器通常使用在Tomcat的插件技術mod_jk中,也可以重新已無效的mod_jserv插件,并且通常JK庫函數(shù)可以支持更多的協(xié)議和Tomcat的指定功能。AJP連接器功能通常需要一個高流量的系統(tǒng)支持,通常是集群的web系統(tǒng)。其允許Apache服務器提供靜態(tài)內(nèi)容和代理請求,目的是讓整個網(wǎng)絡負載更平均,這樣可以讓Tomcat服務器更專注于處理動態(tài)內(nèi)容。??

Connerctor參數(shù)配置??

以下代碼是連接器配置的一個實例:??

<Connectorexecutor="tomcatThreadPool"??

port="80"protocol="HTTP/1.1"??

connectionTimeout="50000"??

keepAliveTimeout="20000"??

maxKeepAliveRequests="1"??

redirectPort="444"??

maxHttpHeaderSize="8192"URIEncoding="UTF-8"enableLookups="false"acceptCount="100"disableUploadTimeout="true"/>??

常見連接器參數(shù)如下:??

connectionTimeout:網(wǎng)絡連接超時時間,單位為毫秒,如果設置為“0”則表示永不超時,不建議這樣設置;??

keepAliveTimeout:保持連接的最長時間,單位為毫秒;??

maxKeepAliveRequests:最大的連接數(shù)(“1”表示禁用該設置,“-1”表示不限制個數(shù),缺省值為100);??

maxHttpHeaderSize:表示允許的HTTP請求頭的最大值,超過此大小的請求將不予受理;??

URIEncoding:設置Tomcat容器的URL編碼格式;??

acceptCount:指定當所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊列中的請求數(shù),超過這個數(shù)的請求將不予處理,默認為10個;??

disableUploadTimeout:上傳文件時是否使用超時機制;??

enableLookups:是否啟動反查域名機制(取值為true或false),為了提高處理能力,應設置為false;??

bufferSize:定義連接器所提供的輸入流中緩存區(qū)大小,缺省值為2048個字節(jié);??

maxSpareThreads:最大空閑連接數(shù),如果創(chuàng)建的線程超過這個值,Tomcat就會關閉不再需要的線程數(shù),缺省值為50;??

maxThreads:最多同時處理的連接數(shù),Tomcat使用線程來處理接收的每個請求,這個值表示Tomcat可創(chuàng)建的最大的線程數(shù);??

minSpareThreads:最小空閑線程數(shù),Tomcat初始化時創(chuàng)建的線程數(shù),該值應該少于maxThreads,缺省值為4;??

minProcessors:最小空閑連接線程數(shù),缺省值為10;??

maxProcessors:最大連接線程數(shù),默認值為75;??

下面詳細介紹

maxThreads

connectionTimeout

acceptCount這個參數(shù):??

maxThreads配置??

maxThreads代表Tomcat的HTTP連接器所創(chuàng)建的請求處理線程的最大數(shù)目

如以下代碼:??

<Executorname="tomcatThreadPool"namePrefix="catalina-exec-"??

maxThreads="250"minSpareThreads="20"maxIdleTime="60000"/>??

<Connectorexecutor="tomcatThreadPool"??

port="80"protocol="HTTP/1.1"??

connectionTimeout="60000"??

keepAliveTimeout="15000"??

maxKeepAliveRequests="1"??

redirectPort="443"??

....../>??

如上例表示Tomcat服務器最大榀以處理250個請求,如果不設置該值,那缺省值為200。?


maxThreads處理過程如下:??

1)當服務器啟動時,HTTP連接器將創(chuàng)建一個基礎線程數(shù)

這個值為minSpareThreads(最小空閑連接數(shù));??

2)每個傳入的請求都需要一個持續(xù)時間,允許的最大時間為keepAliveTimeout所設置的值;??

3)如果需要同時處理的請求數(shù)超過

minSpareThreads設置的值,

那么額外的線程數(shù)將以最大配置數(shù)為準,即maxThreads的值;??

4)如果同時處理的請求數(shù)超過最大配置值,即超過maxThreads所設置的值,那么這么請求將會排成隊列,隊列最大值由acceptCount確定;??

5)如果隊列長度超過acceptCount所設置的值,那么請求連接時將會被拒絕,直到有可用資源時才建立連接;??

maxThreads是一個很重要的參數(shù),那么在配置過程它應該遵守什么原則呢???

org.apache.tomcat.util.threads.ThreadPoollogFullSEVERE:Allthreads(150)arecurrentlybusy,waiting.IncreasemaxThreads(150)orchecktheservletstatus??

如果出現(xiàn)上述的錯誤,那么首先需要調(diào)查請求所花費的時間

并檢查它是否返回線程池,例如,數(shù)據(jù)庫連接一直不釋放,那么線程需要等獲得數(shù)據(jù)庫連接后才能運行,這樣導致其它的請求不能被處理

如果此時增大maxThreads值,可以會導致以下后果:??

消耗大量內(nèi)存;??

在切換上下文內(nèi)容時所花費的時間將會進一步增多;??

這些元素使用Catalina直接處理設備的請求。??

所以,如果在優(yōu)化系統(tǒng)性能過程中,將該設置高達500-750了,那么這樣將帶來上述兩個問題,所以maxThreads的值大于750,那么則需要使用Tomcat服務器集群來解決這個問題,如需要將maxThreads的值設置為1000,那么需要使用兩個Tomcat服務器,各自設置為500,而不是將一個Tomcat服務器設置為500。?


connectionTimeout配置??

connectionTimeout用于設置網(wǎng)絡連接超時時間。設置通訊的超時時間對于改善通訊過程非常重要,它可以幫助發(fā)現(xiàn)問題和穩(wěn)定分布系統(tǒng),JK有幾種不同的超時類型,按屬性分,通常包括:CPing/CPong、低級別TCP超時、連接池和空閑超時、防火墻連接和回復超時,通常在httpd.conf、workers.properties和server.xml三個文件中進行設置,也可以分別對這些選項進行設置。但這些選項默認情況是禁用狀態(tài),一般不設置超時的極端值,否則可能適得其反。??

1)CPing/CPong??

CPing/CPong用于測試后端小數(shù)據(jù)包的狀態(tài),在建立連接后和請求返回數(shù)據(jù)包之前JK可以直接測試數(shù)據(jù)包,可以通常配置來設置CPong與CPing之間最大空閑時間。??

在ping_mode模塊中可以設置不種連接方式的超時時間:??

連接模式(connectmode):

使用connect_timeout屬性設置超時時間;??

前崗模式(prepostmode):

使用prepost_timeout屬性設置超時時間;??

間隔模式(intervalmode):

使用connection_ping_interval屬性設置空閑間隔時間;??

2)低級別TCP超時??

一些平臺允許設置TCP套接字操作超時,這種情況只允許在Linux和Windows操作系統(tǒng)中使用,其它的平臺不支持,如果平臺TCP發(fā)送和接受超時,那么可以通過socket_timeout屬性進行設置,該屬性在文件workers.properties中。如果平臺不支持套接字操作超時,JK也會接受這個屬性,但這種情況下,該屬性沒有任何效果,缺省值為“0”,表示禁用超時,該屬性的單位為秒,而非毫秒,這個超時是一個低層次的,用于套接字中每個讀與寫的操作。??

使用此屬性JK可以很快的反應關于網(wǎng)絡類型的問題,但這也有一些負影響,因為平臺太多,如果真的是由于網(wǎng)絡問題引起的超時,或者沒有收到后端返回的數(shù)據(jù)包,那么JK不可能很快的恢復,故不可能將這個值設置的太小。??

一般情況下當建立連接后

可以使用socket_connect_timeout來測試超時時間,其單位為毫秒

因為一些平臺不支持socket_timeout

超時時間一般設置為1000至5000毫秒。??

3)連接池和空閑超時??

JK會處理每個Web服務器連接池中的每個連接,會連接被用于持久模式,當一個請求處理完成后,連接會處于斷開狀態(tài),等待下一個發(fā)送過來的請求,連接池希望增加并行請求的數(shù)量。??

大多數(shù)應用程序每個時間段所承受的負載是有所不同的,所以當連接數(shù)在不斷的增加時,連接會被臨時保存在后端,這樣導致前端越來越擁擠,所以后端可能會使用一個線程來處理提交的新的連接,所以如果當系統(tǒng)負載減少時可以將連接池縮小。??

JK允許在連接池的一些連接在一些空閑時間后被關閉

使用connection_pool_timeout屬性可以設置最大空閑時間,單位為秒,其缺省值為“0”,表示禁止關閉空閑連接。一般建議設置為10分鐘,即600秒。如果需要設置此屬性,那么在Tomcat服務器中server.xml配置文件中的AJP連接器中修改connectionTimeout選項,單位為毫秒。??

JK并不會立即關閉那些超時的連接,而是先運行一些內(nèi)部自動維護的任務,每隔60秒自動檢查所有空閑狀態(tài)的連接

60秒的時間間隔可以使用全局屬性

(worker.maintain)進行重新設置

但不建議修改該值。


4)防火墻連接??

空閑連接來自于防火墻,這往往是在網(wǎng)絡服務器和后端之間,如果連接長時間處于閑置狀態(tài),那么連接的狀態(tài)表將會丟失,TCP是一個可靠的協(xié)議

它會檢測TCPACKs是否丟失,并且會重新發(fā)送那些時間相對較長的包,當然這一般需要幾分鐘的時間。因此JK配置時常常需要配置

connection_pool_timeount

connection_pool_minsize兩個屬性

Tomcat測試需要配置connectionTimeout屬性來防止空閑連接下降。??

另外,使用可以配置socket_keepalive標準套接字選項,這樣當連接處于空閑狀態(tài)時,會自動向每個連接發(fā)送TCPkeepalive包,缺省值為“False”,如果懷疑是防火墻引用的空閑連接,那么可以將該選項設置為“True”。

但是對于不同的平臺,默認的時間間隔和算法是不一致的,所以要調(diào)整TCP的設置項來測試其控制TCPkeepalive的效果。?


5)回復超時??

對于請求的響應JK也可能出現(xiàn)超時的情況,出現(xiàn)超時的響應不能被處理,反之一樣,連接響應的數(shù)據(jù)包需要多長時間才能完成,這是我們關注的問題,例如一個長時間的下載,無法設置一個全局的回復超時的時間,因為無法確定最后下載的時間。??

通過設置replay_timeout屬性可以設置超時時間,單位為毫秒,缺省值為“0”,表示不禁用超時,如以下配置:??

worker.worker1.port=8888??

worker.worker1.reply_timeout=120000??

worker.worker1.socket_timeout=150000??

該配置在workers.properties文件中設置。??

配合Apache一起使用時,可以通過設置http的環(huán)境變量reply_timeout來設置超時時間,這樣更靈活。??

acceptCount配置??

acceptCount是指當所有可以使用的處理請求的線程數(shù)都被使用時,可以放到處理隊列中的請求數(shù),超過這個數(shù)的請求將不予處理,默認為10個,即允許請求隊列的最大長度,如果客戶端提交的請求不能被同時并發(fā)處理完成,即客戶端請求數(shù)超過maxThreads的值,那么其余的請求將會以隊列的方式存儲著,如果這個隊列的長度大于acceptCount所設置的值,那么客戶端提交的請求就不會被處理,即被服務器拒絕,導致連接失敗。??

在設置該值時應該注意,這個值不能設置的太小也不能設置的太大,如果設置的太小會出現(xiàn)大量請求可能被直接拒絕的情況,但其它此時這些請求可能根本沒有超時;如果將該值設置的過大,則會出現(xiàn)請求被超時的情況,因為如果排的隊列過長,這樣后面的隊列很可能出現(xiàn)超時的情況。

keepAliveTimeout和connectionTimeout兩個屬性值會影響決定連接是否超時,如果隊列過長后面的請求就會出現(xiàn)超時,這樣請求同樣也無法被正確的處理,所以在設置該值時,需要以服務器訪問的峰值或平均值來衡量,但實際測試過程中可以通過配置該值來測試性能的表現(xiàn)。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容