JMeter測(cè)試TCP/IP Socket應(yīng)用的性能

本文版權(quán)歸xmeter.net 所有。歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處。

摘要

本文描述了如何利用JMeter來(lái)測(cè)試TCP/IP Socket應(yīng)用的性能。文章先對(duì)Socket作了一點(diǎn)簡(jiǎn)單介紹,然后提供并解釋了兩個(gè)樣例Socket應(yīng)用,最后介紹如何利用JMeter來(lái)對(duì)它們進(jìn)行測(cè)試。

Socket簡(jiǎn)介

基于TCP/IP協(xié)議的Socket(套接字)應(yīng)用是構(gòu)成現(xiàn)在互聯(lián)網(wǎng)的基礎(chǔ),HTTP協(xié)議就是建立在端口80上的套接字應(yīng)用。現(xiàn)在還是有很多應(yīng)用直接建立套接字,接受客戶端的請(qǐng)求并進(jìn)行相應(yīng)的業(yè)務(wù)處理,那么隨著業(yè)務(wù)量的增加,如何對(duì)基于套接字的應(yīng)用進(jìn)行性能測(cè)試呢?本文將介紹如何利用開源的JMeter對(duì)基于TCP/IP協(xié)議的套接字應(yīng)用進(jìn)行性能測(cè)試。

套接字應(yīng)用一般至少需要一對(duì)套接字,其中一個(gè)運(yùn)行于客戶端,稱為ClientSocket ,另一個(gè)運(yùn)行于服務(wù)器端,稱為ServerSocket 。

服務(wù)器和客戶端套接字之間的連接過(guò)程分為三個(gè)步驟:服務(wù)器監(jiān)聽,客戶端請(qǐng)求,連接確認(rèn)。

  1. 服務(wù)器監(jiān)聽:服務(wù)器端套接字打開后處于等待連接的狀態(tài),等待客戶端的連接請(qǐng)求
  2. 客戶端請(qǐng)求:指客戶端的套接字發(fā)出建立連接請(qǐng)求,要連接的目標(biāo)是服務(wù)器端的套接字。客戶端的套接字在連接的時(shí)候需要指定服務(wù)器端套接字的地址和端口號(hào),然后才能發(fā)出連接請(qǐng)求
  3. 連接確認(rèn):當(dāng)服務(wù)器端套接字接收到客戶端套接字的連接請(qǐng)求時(shí),就響應(yīng)客戶端套接字的請(qǐng)求,處理完客戶端發(fā)出的數(shù)據(jù)后,返回給客戶端處理結(jié)果。

服務(wù)器端一般通過(guò)多線程的方式來(lái)接受不同用戶發(fā)出的處理請(qǐng)求,因此同時(shí)可以接受多個(gè)客戶端發(fā)出的處理請(qǐng)求。套接字應(yīng)用中客戶端和服務(wù)器端之間溝通的數(shù)據(jù)格式根據(jù)應(yīng)用的設(shè)計(jì)而定,可以是可讀的文本格式,也可以是二進(jìn)制流的格式,對(duì)于這兩種不同的格式,JMeter有不同的處理方式。

測(cè)試基于文本套接字應(yīng)用

被測(cè)應(yīng)用的源碼請(qǐng)參見這里. 如果想運(yùn)行該程序,請(qǐng)點(diǎn)擊該鏈接下載socket_echo-0.0.1-SNAPSHOT.jar,并且在命令行下執(zhí)行:

java -cp socket_echo-0.0.1-SNAPSHOT.jar net.xmeter.echo.TextServer

(請(qǐng)確保您的機(jī)器上已經(jīng)安裝了Java)。 該程序會(huì)在4700端口建立一個(gè)ServerSocket,等待來(lái)自客戶端的請(qǐng)求,客戶端如果發(fā)送了一個(gè)字符串,服務(wù)器端返回“Echo: “ + 客戶端發(fā)送的字符串。如下圖所示,如果我們使用telnet連接到服務(wù)器端的套接字應(yīng)用,雙方就可以直接進(jìn)行通信了。

服務(wù)器端:接收到請(qǐng)求并返回客戶端“Echo: hello”字符串。


服務(wù)器端控制臺(tái)運(yùn)行截屏

客戶端通過(guò)telnet連接到服務(wù)器端的4700端口,并輸入hello


客戶端控制臺(tái)運(yùn)行截屏

使用JMeter對(duì)套接字進(jìn)行測(cè)試,有以下的選項(xiàng)可以做控制:
  1. TCPClient classname: 缺省的org.apache.jmeter.protocol.tcp.sampler。TCPClientImpl, TCPClient只能實(shí)現(xiàn)基于文本格式的套接字應(yīng)用的測(cè)試。隨JMeter提供的還有另外的兩個(gè)實(shí)現(xiàn),分別是BinaryTCPClientImpl和LengthPrefixedBinaryTCPClientImpl,用于處理二進(jìn)制格式的數(shù)據(jù),后文將對(duì)這兩個(gè)做詳細(xì)的介紹。
  2. ServerName or IP: 套接字服務(wù)器應(yīng)用的地址
  3. Port Number: 套接字服務(wù)器應(yīng)用的端口
  4. Re-use connection: 如果選中,連接會(huì)一直處于打開狀態(tài),否則讀取到數(shù)據(jù)之后就關(guān)閉
  5. Close connection: 如果選中,在TCP Sampler運(yùn)行完畢之后就會(huì)被關(guān)閉
  6. SO_LINGER:該配置項(xiàng)用于控制在關(guān)閉連接之前是否要等待緩沖區(qū)中的數(shù)據(jù)發(fā)送完成。如果SO_LINGER選項(xiàng)指定了值,則在得到關(guān)閉連接的請(qǐng)求之后還會(huì)等待指定的秒數(shù)以完成緩沖區(qū)中數(shù)據(jù)的發(fā)送,在指定的SO_LINGER秒數(shù)完成后,關(guān)閉連接。因此,如果你把該選項(xiàng)設(shè)置成0,那么所有連接在收到關(guān)閉連接的時(shí)候都會(huì)立即關(guān)閉,避免產(chǎn)生很多處于TIME_WAIT狀態(tài)的套接字。
  7. End of line(EOL) byte value:判斷行結(jié)束的byte值,如果你指定的值大于127或者小于-128,則會(huì)跳過(guò)EOL檢測(cè)。比如服務(wù)器端返回的字符串都是以回車符結(jié)尾,那么我們可以將該選項(xiàng)設(shè)置成10。
  8. Connect Timeout:與服務(wù)器套接字應(yīng)用連接超時(shí)時(shí)間(毫秒)。
  9. Response Timeout:響應(yīng)超時(shí)時(shí)間(毫秒),這個(gè)值的設(shè)置跟End of line(EOL) byte value有關(guān)系,如果End of line(EOL) byte value中的值設(shè)置不正確,會(huì)導(dǎo)致JMeter一直在等待無(wú)法結(jié)束,但是如果指定了Response Timeout這個(gè)值的話,在到達(dá)這個(gè)值的時(shí)候就關(guān)閉連接。
  10. Set NoDelay:是否使用Nagle算法,是否需要使用該選項(xiàng),需要跟實(shí)際的業(yè)務(wù)情況結(jié)合。
  11. Text to Send:發(fā)送的文本,跟“CSV dataset config”一起使用能夠從文件中直接讀取。
  12. Username和Password:這兩個(gè)選項(xiàng)在TCP相關(guān)的Sampler中都未使用,請(qǐng)忽略這兩個(gè)選項(xiàng)。

針對(duì)我們的樣例應(yīng)用,我們的配置如下所示,具體的含義在前面都已經(jīng)有描述,在這里不再贅述。如果想增加壓力,只需調(diào)整ThreadGroup中的數(shù)目即可。

TCP連接配置截圖

測(cè)試基于二進(jìn)制套接字應(yīng)用

被測(cè)應(yīng)用的源碼請(qǐng)參見BinaryServer.java。如果想運(yùn)行該程序,請(qǐng)點(diǎn)擊該鏈接下載socket_echo-0.0.1-SNAPSHOT.jar,并且在命令行下執(zhí)行:

java -cp socket_echo-0.0.1-SNAPSHOT.jar net.xmeter.echo.BinaryServer

該應(yīng)用場(chǎng)景是服務(wù)器端的套接字應(yīng)用在接受來(lái)自客戶端發(fā)送的物聯(lián)網(wǎng)數(shù)據(jù)的請(qǐng)求,并進(jìn)行解析及處理(處理邏輯就是在控制臺(tái)上打印客戶端發(fā)送過(guò)來(lái)的值)。客戶端發(fā)送過(guò)來(lái)的值的格式如下:

byte[0]: 開始界定符,用于標(biāo)識(shí)數(shù)據(jù)的開始,值為126,十六進(jìn)制值為7E
byte[1]: 發(fā)送的數(shù)據(jù)條數(shù),如果一次發(fā)送了溫度、光照強(qiáng)度和濕度3條數(shù)據(jù),則該值為3
byte[2]: 數(shù)據(jù)1的類型,1為溫度,2為光照強(qiáng)度,3為濕度
byte[3]: 數(shù)據(jù)1的值
byte[4]: 數(shù)據(jù)2的類型,1為溫度,2為光照強(qiáng)度,3為濕度
byte[5]: 數(shù)據(jù)2的值

byte[last]: 校驗(yàn)和

服務(wù)器套接字應(yīng)用在完成處理后,返回給客戶端如下格式的值:
byte[0]: 開始界定符,用于標(biāo)識(shí)數(shù)據(jù)的開始,值為126,十六進(jìn)制值為7E
byte[1]: 返回碼,0為成功,1為失敗
byte[3]: 校驗(yàn)和
byte[4]: 回車符作為結(jié)束符

JMeter測(cè)試腳本中與字符類型相同的在這里就不做解釋了,下面描述一下二進(jìn)制格式測(cè)試的不同點(diǎn):
1)因?yàn)楝F(xiàn)在需要發(fā)送的是二進(jìn)制的數(shù)據(jù),所以在“TCPClient classname” 字段中輸入的是 org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl
2)End of line(eol),服務(wù)器端返回的是以回車符為結(jié)束的,因此這里輸入回車符的ascii碼值10,如果你的被測(cè)應(yīng)用不是10結(jié)尾,請(qǐng)輸入別的值
3)Text to send:發(fā)送的數(shù)據(jù)7E0301010214031EC9,7E是開始界定符,03表示此次傳輸3條數(shù)據(jù),第一條數(shù)據(jù)為溫度,值是0x01;第二條數(shù)據(jù)類型是光照強(qiáng)度,值為0x14;第三條數(shù)據(jù)為濕度,值為0x1E,C9為校驗(yàn)和

二進(jìn)制TCP連接配置截圖

另外針對(duì)該Sampler,腳本里還加了一個(gè)斷言,驗(yàn)證返回的數(shù)據(jù)是否正確,可以看到對(duì)結(jié)果的驗(yàn)證期望是7e00ff0a,其中7e是開始界定符,00是返回碼,ff是校驗(yàn)和,0a是回車符。

返回結(jié)果驗(yàn)證截圖

運(yùn)行成功的話,在服務(wù)器端套接字應(yīng)用的控制臺(tái)上能看到下面的信息。

Find the start delimiter at 0.
Received data 1 for sensor temperature.
Received data 20 for sensor brightness.
Received data 30 for sensor humidity.
Correct data. Return with correct response code.

如果讀者測(cè)試的基于套接字的應(yīng)用比較復(fù)雜,JMeter本身提供的Sampler不能處理,那么可能需要自己擴(kuò)展TCP Sampler(一般可以通過(guò)繼承類org.apache.jmeter.protocol.tcp.sampler.TCPClient來(lái)實(shí)現(xiàn))。JMeter提供了靈活的插件擴(kuò)展機(jī)制,允許用戶實(shí)現(xiàn)一些比較個(gè)性化的需求。讀者可以參見我們寫的這篇文章來(lái)了解如何擴(kuò)展JMeter插件。

大規(guī)模套接字應(yīng)用的測(cè)試 - XMeter幫您提高效率,降低成本

單臺(tái)機(jī)器能夠模擬的套接字客戶端是有限的,如果針對(duì)大規(guī)模的套接字應(yīng)用的測(cè)試,可能需要準(zhǔn)備大量的測(cè)試機(jī)器對(duì)被測(cè)系統(tǒng)進(jìn)行打壓,這個(gè)過(guò)程需要大量的準(zhǔn)備機(jī)器環(huán)境,以及管理這些環(huán)境的工作,導(dǎo)致工作效率比較低、而且容易出錯(cuò)。XMeter將這些過(guò)程遷移至云端,彈性伸縮管理這些壓力機(jī),用戶只要關(guān)注測(cè)試腳本的實(shí)現(xiàn)過(guò)程,而無(wú)需關(guān)心這些測(cè)試環(huán)境的管理,從而大大降低了大規(guī)模性能測(cè)試的復(fù)雜度。另外XMeter提供了豐富的測(cè)試報(bào)告,讓性能問(wèn)題一目了然。

關(guān)于我們

XMeter成立于2016年,核心團(tuán)隊(duì)都來(lái)自于IBM,是一家領(lǐng)先技術(shù)的性能測(cè)試持續(xù)集成咨詢與服務(wù)提供商。我們致力于提供給客戶可靠,簡(jiǎn)單,低成本的性能測(cè)試解決方案。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評(píng)論 18 139
  • 轉(zhuǎn)自 TCP/IP,Http,Socket,XMPP的區(qū)別網(wǎng)絡(luò)由下往上分為 物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層、會(huì)...
    ZMJun閱讀 1,385評(píng)論 1 10
  • 看了一期關(guān)于剩男剩女該不該找個(gè)差不多對(duì)象的奇葩說(shuō)辯題。我覺得這個(gè)題目很有意思,凡是自身單著的恐怕全是不愿意將就的。...
    小沙發(fā)閱讀 393評(píng)論 0 0
  • 煙雨中,甬道邊,芳草依依,昂首乞人憐; 水繞欄桿陰晴換,倘若有心天將隨人愿。 歌千回,書萬(wàn)卷,夜身人靜,低頭盼君念...
    蜜思玉閱讀 248評(píng)論 0 2