利用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太南了