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

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

摘要

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

Socket簡介

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

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

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

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

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

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

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

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

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

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


服務(wù)器端控制臺運行截屏

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


客戶端控制臺運行截屏

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

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

TCP連接配置截圖

測試基于二進制套接字應(yīng)用

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

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

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

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

byte[last]: 校驗和

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

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

二進制TCP連接配置截圖

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

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

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

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.

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

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

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

關(guān)于我們

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

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

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

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

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