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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM