您好,登錄后才能下訂單哦!
jmeter支持分布式測試,在分布式模式下,由一臺調度機調度所有的執行機(集群節點),執行腳本時可以自由的選擇單節點執行或者分發集群中指定或全部的機器執行。在使用調度機客戶端分發腳本時,無論是在GUI模式還是non-GUI模式,腳本日志的收集及報告的生成都無任何問題,但是如果是使用jmeter SDK在代碼中調用客戶端大并發分發腳本到執行機執行,則會存在日志無法實時獲取的問題(超大jmx腳本執行時產生的超大日志通過網絡傳輸需要時間)。
通過分析jmeter SDK的源代碼,發現日志的收集是異步執行的,而在SDK中并未提供日志收集完成的通知能力,導致根據日志生成報告時經常出錯(實際的腳本都是正常執行完的)。分析上述問題,提供的解決方案如下:
腳本執行完后,當前線程睡眠一定時間
暴力反射嘗試獲得日志的傳輸狀態
修改jmeter SDK的源代碼,在其中增加監聽機制
當前線程只負責執行腳本到結束狀態,定時收集日志并生成報告
針對以上的4種方案,分析其優缺點:
日志大小無法確定,睡眠時間無法確定,而且睡眠會導致線程等待,可能會產生ThreadInterruptException
jmeter SDK注釋寫的很差(基本無注釋),分析源代碼需要強大的技術能力和一定的時間,目前的時間排期不允許
同樣由于注釋的原因,也需要強大的技術能力和一定的時間,不過難度比第二種方式要低,也是可以產生最優結果的解決方案
技術要求最低,實現容易,但是日志和報告的生成會延遲(基于定時器的周期)
在當前產品的需求上,其實日志和報告并不是極其敏感和實時性要求高的數據,所以最終選擇第4種方案,代碼如下:
每個十分鐘拉取距今14400秒(任務執行超時時間,可配置啟動參數)還未獲取日志的任務并嘗試獲取日志。
因為是異步的拉取日志,所以在拉取日志之前加載一次jmeter的配置。
考慮到每一次停機維護的時間可能會很長(超過當前設置的任務超時時間),因此還需要提供一個啟動應用時掃描任務的能力。
CommandLineRunner接口標識應用啟動完成時執行該接口的實現類,因此需要使用@Component將類的對象加入到IOC容器中。
日志拉取完成后,再處理報告,同樣的原理每個十分鐘拉取距今14400秒(任務執行超時時間,可配置啟動參數)還未獲取日志的任務并嘗試根據日志生成報告。
同樣因為是異步生成報告,因此需要在生成報告時,加載一次jmeter的配置管理。此處也要考慮停機維護的問題,使用CommandLineRunner。
到此,jmeter日志和執行生成的問題完美解決,每一次執行完的任務可能會有10左右的延遲時間用來獲取日志和報告。
▲上圖顯示任務執行時和執行成功后,日志和報告正在生成中
作者:陳潔
企業應用運維自動化應該如何設計?
域內計算機本地管理員密碼管理
騰訊PaaS平臺 | 主機名設置錯誤怎么辦?
Redis持久化介紹
4大步驟節省30%浪費,優化企業上云成本從了解云開始!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。