物聯(lián)網(wǎng)平臺Modbus協(xié)議采樣命令下發(fā)并發(fā)性能測試方法
Part 01
采樣命令
Modbus協(xié)議同樣也是物聯(lián)網(wǎng)平臺的流行協(xié)議之一,采樣命令作為Modbus協(xié)議的主要功能,其主要流程是設(shè)備在平臺設(shè)置周期采樣命令,平臺會周期性主動對在線設(shè)備下發(fā)采樣命令。
我們在為雄安建設(shè)物聯(lián)網(wǎng)平臺時,正好平臺就有Modbus的能力,平臺交付就必須要測試Modbus的采樣命令并發(fā)。
物聯(lián)網(wǎng)平臺Modbus協(xié)議采樣命令下發(fā)流程如下:
- 創(chuàng)建設(shè)備,在平臺給設(shè)備設(shè)置采樣命令:采樣周期、功能編號、從機地址、數(shù)據(jù)長度等信息。
- 設(shè)備上線后,平臺按照采樣周期對設(shè)備進(jìn)行周期性發(fā)送采樣命令。
- 設(shè)備收到采樣命令后將寄存器數(shù)據(jù)返回結(jié)果給平臺,并保存采樣數(shù)據(jù)。
通常情況下我們做性能測試都是客戶端發(fā)起請求服務(wù)的響應(yīng)客戶端,而Modbus的采樣命令恰好相反,以往我們常用的性能測試工具就不可行了。
要如何才能測試服務(wù)的采樣命令的并發(fā)呢?
Part 02
測試方法
為了測試物聯(lián)網(wǎng)平臺Modbus協(xié)議采樣命令并發(fā)性能,我們研究出了一種高并發(fā)的采樣命令并發(fā)性能測試方法。該方法采用異步IO的方式批量模擬設(shè)備連接服務(wù)器、接收采樣命令并響應(yīng)命令,并統(tǒng)計每秒接收的命令數(shù)量。技術(shù)實現(xiàn)細(xì)節(jié)如下:
1、通過API批量創(chuàng)建Modbus設(shè)備,并給每個設(shè)備創(chuàng)建n個采樣命令。即無需提前創(chuàng)建設(shè)備和設(shè)備的采樣命令;
2、批量初始化設(shè)備的socket連接,socket設(shè)置為非阻塞,生成socket列表。采用異步IO,減少多線程線程切換帶來的資源消耗,提升CPU利用率;
3、同時啟動以下三個線程:
①批量設(shè)備注冊線程:批量上報注冊報文,設(shè)備注冊完成后線程退出;
②采樣命令條數(shù)統(tǒng)計線程:所有設(shè)備注冊成功后,每秒統(tǒng)計一次最近1秒內(nèi)收到采樣命令條數(shù);
③采樣命令接收處理線程:采用select批量管理設(shè)備socket列表,接收并立即響應(yīng)采樣命令,并實時記錄采樣命令條數(shù)。select模型為非阻塞式IO,能夠一定程度上減少服務(wù)器瞬間的并發(fā)線程數(shù),從而提高CPU執(zhí)行效率;
Python代碼示例(片段)
4、根據(jù)運行設(shè)備數(shù)量以及平均每秒接收到采樣命令數(shù)量來判斷平臺是否滿足當(dāng)前的采樣命令的處理性能。性能滿足的條件下預(yù)期結(jié)果為
預(yù)期每秒命令接收數(shù)量 ≈ 設(shè)備數(shù)量 * n
逐步增加設(shè)備數(shù)量,當(dāng)預(yù)期每秒命令接收數(shù)量 > 設(shè)備數(shù)量 * n時,即服務(wù)已達(dá)到瓶頸。則最終測試服務(wù)的采樣命令最大并發(fā)量為,滿足預(yù)期結(jié)果時的設(shè)備最大接入量 * n。
該測試方法優(yōu)點:
1、無需單獨添加創(chuàng)建設(shè)備和設(shè)備的采樣命令,簡化了Modbus協(xié)議采樣命令性能測試的準(zhǔn)備工作;
2、在設(shè)備端統(tǒng)計并發(fā)量,無需在服務(wù)端增加任何統(tǒng)計邏輯;
3、采用模擬設(shè)備,無需準(zhǔn)備大量真實設(shè)備,降低了Modbus協(xié)議采樣命令性能測試的成本;
4、通過非阻塞式IO,顯著提升Modbus協(xié)議采樣命令并發(fā)性能測試的設(shè)備響應(yīng)速度,解決Modbus協(xié)議采樣命令并發(fā)性能測試高并發(fā)狀態(tài)下的資源浪費問題;
5、設(shè)備響應(yīng)速度的提升,有效提高M(jìn)odbus協(xié)議采樣命令并發(fā)性能測試的準(zhǔn)確度。
我們采用此種方法編寫的Python代碼,單個腳本可以支撐1秒內(nèi)1萬+次的命令處理能力。在雄安物聯(lián)網(wǎng)平臺的性能測試中起到了非常好的作用,同時運行10個腳本,完成了雄安平臺Modbus協(xié)議采樣命令10萬并發(fā)的測試。