利用jmeter對WebRTC應用進行壓力測試(java)
阿新 • • 發佈:2020-09-09
利用jmeter對WebRTC應用進行壓力測試(java)
說明:WebRTC是一款開源的多人即時視訊API,與一般的http請求不同,webrtc應用實際壓力主要是碼流
最近負責了一個WebRTC的視訊會議效能測試,也蠻有意思的,因此將壓測方案、思路記錄下來
一、測試思路
-
WebRTC多人會議的簡單架構(自己畫,意思到就行)
-
WebRTC視訊會議應用主要的壓力是碼流、線上人數,所以我們希望的是連線能保持,同時也能輸入視、音訊流
-
上圖可以看到,一個瀏覽器就是一個使用者,最直觀的做法就是同時多臺電腦瀏覽器接入視訊會議,然後開啟攝像頭和麥克風輸入視、音訊流
-
-
Chrome Headless模式
-
那麼我們能否模擬出這種場景呢,答案肯定是可以的,就是使用chrome headless模式,並讀取本地檔案作為音視訊輸入。
-
什麼是瀏覽器的headless模式,有做過自動化的同學肯定不陌生
- 在無介面的環境中執行 Chrome
- 通過命令列或者程式語言操作 Chrome
- 無需人的干預,執行更穩定
- 在命令列啟動 Chrome 時新增引數 --headless,便可以 headless 模式啟動 Chrome
chrome --headless --remote-debugging-port=9222 --disable-gpu #開啟遠端除錯 chrome --headless --disable-gpu --dump-dom https://www.baidu.com #獲取頁面 DOM chrome --headless --disable-gpu --screenshot http://www.baidu.com #截圖
遠端除錯
- 更多headless模式啟動引數
-
二、WebRTC壓力端實現
-
選擇庫
-
WebRTC測試客戶端程式碼
- 先新增依賴:
<dependency> <groupId>io.github.fanyong920</groupId> <artifactId>jvppeteer</artifactId> <version>1.0.7</version> </dependency>
- 直接貼關鍵程式碼,註釋都應該比較清晰的了
public void webRtcConnect() { String chromePath = "D:\\Google\\Chrome\\chrome.exe"; String fakeVideoPath = "E:\\media\\test.y4m"; String fakeAudioPath = "E:\\media\\test.wav"; try { String path = new String(chromePath.getBytes(), "UTF-8"); ArrayList<String> argList = new ArrayList<String>(); argList.add("--no-sandbox"); //**禁用沙箱 argList.add("--disable-setuid-sandbox"); argList.add("--ignore-certificate-errors"); //**忽略所有網站的證書報錯 argList.add("--use-fake-ui-for-media-stream"); //**不彈音視訊許可權請求對話方塊 argList.add("--use-fake-device-for-media-stream"); //**使用chrome預設的虛擬音視訊資料 //**使用本地的音視訊 // argList.add("--use-file-for-fake-video-capture=" + fakeVideoPath); // argList.add("--use-file-for-fake-audio-capture=" + fakeAudioPath); //**指定chrome無頭啟動 LaunchOptions options = new LaunchOptionsBuilder().withArgs(argList).withHeadless(true).withExecutablePath(path).build(); Browser browser = Puppeteer.launch(options); Page page = browser.newPage(); page.goTo("https://yourURL"); //**會議URL } catch (Exception e) { e.printStackTrace(); } }
-
整合到jmeter
實際就是利用Jmeter的java請求元件,引用jmeter的庫先將我們的程式碼打成jar,然後放在指定路徑給Jmeter呼叫
- 在我們原有的專案中新增jmeter依賴:
<dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_core</artifactId> <version>${jemter-version}</version> </dependency> <dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_java</artifactId> <version>${jemter-version}</version> </dependency>
- 在我們的測試類中繼承JavaSamplerClient介面類,並實現該父類的4個方法
- 最後打成jar包並放到jmeter的
/lib/ext/
目錄下
- 這樣我們就可以利用Jmeter併發機制,產生多個瀏覽器的連線加入會議了
至此,我們就可以愉快地對WebRTC應用進行效能測試了,如果有更好的方案,歡迎交流
-
效果圖(預設的媒體流就是一直轉圈圈+滴滴聲)
補充:
- 本地視訊、音訊格式好像只能是.y4m和wav,其他格式我沒有嘗試,有同學驗證了告訴我下,這裡可以下載y4m格式的視訊
- Linux下安裝Chrome建議在CentOs7以上版本,CentOs6太南了