Jitsi/SeleniumGridによる負荷テスト

更新日: 2021-06-09 (水) 22:14:55 (110d)

ビデオ会議ツールのJitsiの負荷テストの方法について記述する。

JitsiのGitHubリポジトリを見ると、jitsi-hammerとjitsi-meet-tortureというツールがある。jitsi-hammerの方は、記事執筆時点で、最新のJitsi MeetやJitsi Videobridgeとcompatibleでないとなっている。jitsi-meet-tortureについては追従していそうだ。

https://community.jitsi.org/t/tutorial-loadtesting-jitsi-with-malleusjitsificus-on-a-selenium-grid/33302

はじめに

jitsi-meet-tortuneは、Selenium Gridが必要である。コミュニティの投稿ではVMノードにSeleniumやChromeDriverをインストールする方法について説明されている。DockerコンテナでもSelenium Gridやブラウザがインストールされたインスタンスを起動することができるので、今回はDockerコンテナの方法でトライする。

なお、Javaやmavenがインストールされていなければインストールしておく。

コマンド sdkmanのインストール

$ curl -s https://get.sdkman.io | bash

コマンド javaのインストール

$ sdk install java 11.0.8.hs-adpt
$ sdk use java 11.0.8.hs-adpt
$ java -version
openjdk version "11.0.8" 2020-07-14
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.8+10)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.8+10, mixed mode)

コマンド mavenのインストール

$ sdk install maven 3.6.3
$ sdk use maven 3.6.3
$ mvn --version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/xxx/.sdkman/candidates/maven/3.6.3
Java version: 11.0.8, vendor: AdoptOpenJDK, runtime: /Users/xxx/.sdkman/candidates/java/11.0.8.hs-adpt
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.15.7", arch: "x86_64", family: "mac"

参照 sdkman

実行環境

  • mac OS Catalina
  • Docker Desktop, Docker Engine v19.03.13

Jitsiのインストール

docker-jitsi-meetでインストールする。詳細は割愛する。

Selenium Gridと構成

Selenium Grid Server(Hub)は、複数のブラウザインスタンスを管理し、テスト命令を受け付けるとHubに接続しているインスタンスを選択しテストを実行してくれる。今回は、localhost上に構築する。Seleniumノードを複数のマシンにインストールすれば、ノードを分散させてテストを走らせることができる。複数のノードにインストールする場合は、Hubとノードの接続ができるように考慮する。

なお、SeleniumドキュメントにはSelenium Grid 3はサポートされていないとある。Grid 4は、Grid 3とコンポーネント構成が異なるようである。今回は、Jitsiのコミュニティでも説明されていたGrid 3を使う。

参照 seleniumドキュメント

Jitsi-selenium-grid3.png

Selenium Gridの構築

jitsi-meet-tortureの準備

まずは、jitsi-meet-tortureと必要な資材をインストールしておく。

$ git clone https://github.com/jitsi/jitsi-meet-torture
$ cd jitsi-meet-torture/resources
# 会議でブラウザノードが流すビデオをダウンロードする
$ curl -L https://media.xiph.org/video/derf/y4m/FourPeople_1280x720_60.y4m -O

会議で各ノードが流す動画をダウンロードし、resoucesディレクトリに格納しておく。コンテナ起動時にホストからマウントさせる。

次に、動画のパスを書き換える。デフォルトでは、FourPeople_1280x720_30.y4mと存在しないファイルをポイントしている。このまま実行すると、動画は映らず黒いタイルビューのみが表示されてしまう。

$ sed -i -e "s/FourPeople_1280x720_30.y4m/FourPeople_1280x720_60.y4m/" src/test/java/org/jitsi/meet/test/MalleusJitsificus.java

Selenium Gridのdocker-compose

ファイル docker-compose.yml。

$ vi docker-compose.yml
version: "3"

services:
  chrome-0:
    image: selenium/node-chrome-debug:3.141.59-20200826
    container_name: chrome-0
    ports:
      - "15900:5900"
    volumes:
#      - /dev/shm:/dev/shm
      - ./resources:/usr/share/jitsi-meet-torture/resources:ro
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
      - HUB_PORT=4444
      # Sets slots per node
      - NODE_MAX_INSTANCES=1
      # Sets the maximum amount of tests that can run at the same time in a node.
      - NODE_MAX_SESSION=1
      # Useful if node runs on the different node from hub.
 #     - REMOTE_HOST=http://<node_ip>:<node_port>
    extra_hosts:
      - meet.example.com:192.168.3.3

  chrome-1:
    image: selenium/node-chrome-debug:3.141.59-20200826
    container_name: chrome-1
    ports:
      - "15901:5900"
    volumes:
#      - /dev/shm:/dev/shm
      - ./resources:/usr/share/jitsi-meet-torture/resources:ro
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
      - HUB_PORT=4444
      # Sets slots per node
      - NODE_MAX_INSTANCES=1
      # Sets the maximum amount of tests that can run at the same time in a node.
      - NODE_MAX_SESSION=1
      # Useful if node runs on the different node from hub.
 #     - REMOTE_HOST=http://<node_ip>:<node_port>
    extra_hosts:
      - meet.example.com:192.168.3.3


  chrome-2:
    image: selenium/node-chrome-debug:3.141.59-20200826
    container_name: chrome-2
    ports:
      - "15902:5900"
    volumes:
#      - /dev/shm:/dev/shm
      - ./resources:/usr/share/jitsi-meet-torture/resources:ro
    depends_on:
      - selenium-hub
    environment:
      - HUB_HOST=selenium-hub
      - HUB_PORT=4444
      # Sets slots per node
      - NODE_MAX_INSTANCES=1
      # Sets the maximum amount of tests that can run at the same time in a node.
      - NODE_MAX_SESSION=1
      # Useful if node runs on the different node from hub.
 #     - REMOTE_HOST=http://<node_ip>:<node_port>
    extra_hosts:
      - meet.example.com:192.168.3.3


  selenium-hub:
    image: selenium/hub:3.141.59-20200826
    container_name: selenium-hub
#    volumes:
#      - /dev/shm:/dev/shm
    ports:
      - "4444:4444"
  • 4444は、Selenium Grid Serverのためのポート。
  • 5900は、VNCのためのポート。リモートシステムの画面を表示することができる。各コンテナごとに見たいので、ホストのポートが被らないようにしている。
  • extra_hostsは、自己署名証明書でアクセスさせる目的で指定している。192.168.3.3は、jitsiが動いているホストのアドレスである。
  • HubとNodeが別のマシン上にある場合は、REMOTE_HOSTを指定する。また。その場合、HubからNodeへport 5555で接続可能なようにportsを設定する。
    # example
        ports:
          - "55555:5555"
        environment:
          - HUB_HOST=<hub ip>
          - HUB_PORT=4444
          - NODE_MAX_INSTANCES=1
          - NODE_MAX_SESSION=1
          - REMOTE_HOST=http://<node_ip>:55555
docker-compose up -d

起動するとSelenium Gridコンソールを確認できる。

http://<node_ip>:4444/grid/console

Selenium-grid-console.png

テストの実行

準備ができたらテスト実行してみる。初回は、mvnのコンパイルが走るのでしばらく待つ。

$ ./scripts/malleus.sh \
    --conferences=1 \
    --participants=2 \
    --senders=2 \
    --audio-senders=2 \
    --duration=$((60*5)) \
    --room-name-prefix=hamertesting \
    --hub-url=http://192.168.3.3:4444/wd/hub \
    --instance-url=https://meet.example.com:8443/

ブラウザでコンテナたちの会議に参加してみると、何やら会議している。画像も音声も聞こえる。

Hamertesting_0_Jitsi_Meet.png

vncでコンテナに繋いでみる。パスワードはsecret。ややもっさりしている。。(画像は、参加者2人に落としてみた場合)

Jitsi-selenium-grid3-vnc.png

自己署名証明書を使っている場合

自己署名証明書を使っている場合エラーになるかもしれない。エラー内容からは判断が難しい。

Session ID: 78eb7fbdea6971fd379d52dc6d3394cb
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
	at org.openqa.selenium.remote.RemoteWebDriver.executeScript(RemoteWebDriver.java:489)
	at org.jitsi.meet.test.web.WebParticipant.executeScript(WebParticipant.java:224)
	at org.jitsi.meet.test.web.WebParticipant.doJoinConference(WebParticipant.java:163)
	at org.jitsi.meet.test.base.Participant.joinConference(Participant.java:152)
	at org.jitsi.meet.test.MalleusJitsificus.lambda$runAsync$0(MalleusJitsificus.java:190)
	at org.jitsi.meet.test.MalleusJitsificus$Lambda$8/0000000000000000.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:823)
Exception in thread "Thread-4" org.openqa.selenium.JavascriptException: javascript error: APP is not defined

SSLが疑わしい場合は、以下のオプションを追加して再度実行してみると上手くいくかもしれない。

ファイル jitsi-meet-torture/src/test/java/org/jitsi/meet/test/web/WebParticipantFactory.java

    private WebDriver startWebDriver(
        WebParticipantOptions options)
    {
...
            ops.addArguments("ignore-certificate-errors"); // オプションを追加
...
    }

参考リンク


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
TOP | 閉じる | ダブルクリックで閉じる