1. 程式人生 > 實用技巧 >利用jmeter對WebRTC應用進行壓力測試(java)

利用jmeter對WebRTC應用進行壓力測試(java)

利用jmeter對WebRTC應用進行壓力測試(java)

說明:WebRTC是一款開源的多人即時視訊API,與一般的http請求不同,webrtc應用實際壓力主要是碼流

最近負責了一個WebRTC的視訊會議效能測試,也蠻有意思的,因此將壓測方案、思路記錄下來

一、測試思路

  1. WebRTC多人會議的簡單架構(自己畫,意思到就行)

    • WebRTC視訊會議應用主要的壓力是碼流、線上人數,所以我們希望的是連線能保持,同時也能輸入視、音訊流

    • 上圖可以看到,一個瀏覽器就是一個使用者,最直觀的做法就是同時多臺電腦瀏覽器接入視訊會議,然後開啟攝像頭和麥克風輸入視、音訊流

  2. 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	#截圖
      

      遠端除錯

二、WebRTC壓力端實現

  1. 選擇庫

    • 控制瀏覽器行為就想到Puppeteer,這是一個Node庫,提供了一個高階 API 來通過 DevTools協議控制 Chrome

    • 由於希望使用Jmeter產生併發,所以我用了另外一個庫jvppeteer,簡單理解就是用java封裝一次的Puppeteer

  2. 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();
    	} 
    }
    
  3. 整合到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太南了