コンテナ作成時に使用する低レベルランタイムの評価ツールです。
自動でベンチマークの実行、グラフとログの生成を行います。
グラフとログは実行した項目のディレクトリ下に生成されます。
合計13種類のベンチマークを用意しました。
- cpu
- memory
- file_rnd_read
- file_seq_read
- file_rnd_write
- file_seq_write
- syscall
- network
- lifecycle
- resource_cpu
- resource_memory
- resource_storage
- _cve
- syscall_collect
- AbstractResource_AttackProgram
以下の全てのコマンドが使用できることを確認して下さい。
package_install.shを実行することで以下のコマンドを使用できるようになります。
ただし、journalctlと低レベルランタイムに関しては以下の記述を読んで、各自で設定を行ってください。
リンク先を参考にDockerをインストールして下さい。
インストール後に、sudo権限なしでdockerコマンドを実行できるように変更して下さい。
$ sudo groupadd docker
$ sudo usermod -aG docker ユーザ名
$ sudo reboot
$ sudo apt install -y sysstat
$ sudo apt install -y procps
$ sudo apt install -y iperf3
$ sudo apt install -y sysdig
$ echo ""$(whoami)" ALL=NOPASSWD:/usr/bin/sysdig,/usr/bin/pkill" | sudo EDITOR='tee -a' visudo
$ sudo apt install -y python3
$ sudo apt install -y python3-pip
$ pip3 install numpy
$ pip3 install matplotlib
$ pip3 install selenium
$ curl -OL https://github.com/mozilla/geckodriver/releases/download/v0.31.0/geckodriver-v0.31.0-linux64.tar.gz
$ tar -zxvf geckodriver-v0.31.0-linux64.tar.gz
$ sudo cp geckodriver /usr/local/bin/geckodriver
resource_storageではsystem.journalのサイズが結果に影響を及ぼしかねません。
そのため、/etc/systemd/journald.confを変更し、journaldでログを収集しないように変更します。
ベンチマークが終了したら、元の設定に戻しても構いません。
ログのサイズも含めて評価する場合、設定の変更を行わず、低レベルランタイム毎にシステムを再起動してログをもとに戻して下さい。
$ sudo vi /etc/systemd/journald.conf
/etc/systemd/journald.confの一部を以下のように変更します。
[Journal]
Storage=none
変更後は、以下のコマンドで設定ファイルの内容を反映させて下さい。
$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-journald.service
githubからこのリポジトリをクローンして下さい。
$ git clone https://github.com/ertlnagoya/LowLevelRuntime_Evaluation_Tool_For_Container/
必要に応じて、評価したい低レベルランタイムをインストールして下さい。
インストール後、/etc/docker/daemon.jsonに低ベレルランタイムのリンク先を記入して下さい。
ただし、runcは/etc/docker/daemon.jsonに記入せずとも、dockerをインストールした時点で使用できます。
以下に、crunをインストールする例を載せますので参考にして下さい。
#crunに必要な依存ツールをインストールします。
$ sudo apt-get install -y make git gcc build-essential pkgconf libtool \
libsystemd-dev libprotobuf-c-dev libcap-dev libseccomp-dev libyajl-dev \
go-md2man libtool autoconf python3 automake
$ git clone https://github.com/containers/crun
#crunをインストールします。
$ cd crunのディレクトリ
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
#dockerでcrunを使用できるように、/etc/docker/daemon.jsonへ書き込みを行います。
$ sudo vi /etc/docker/daemon.json
/etc/docker/daemon.jsonの中身を以下のように変更します。
{
"runtimes": {
"crun": {
"path": "/usr/local/bin/crun"
},
},
}
cpuディレクトリのcpu.shに、評価対象とする低レベルランタイム(以下の例はcrun、runsc)を記入します。
declare -a low_level_runtime=("crun" "runsc")
引数としてcpu項目を指定し、start_bench.shを実行します。
$ source start_bench.sh cpu
syscall_collectディレクトリのsyscall_collect.shに、評価対象とする低レベルランタイム(以下の例はcrun、runsc)を記入します。
declare -a low_level_runtime=("crun" "runsc")
引数としてsyscall_collect項目とコンテナイメージ(+コマンド)を指定し、start_bench.shを実行します。
$ source start_bench.sh syscall_collect "paipoi/sysbench_"$(uname -p)" sysbench --test=cpu --cpu-max-prime=20000 --num-threads=1 run"
抽象リソース毎にディレクトリが用意されているため、各ディレクトリの中の攻撃プログラムをコンテナの中で実行します。
- x86_64のUbuntu18.04とUbuntu20.04、aarch64のUbuntu20.04において、crunとrunscを指定した際の動作を確認しました。
- dockerfileディレクトリは使用したコンテナイメージのDockerfileをまとめています。
- tmpディレクトリはツールの作成時に実験的に作成したファイルをまとめています。
- このツール本体(LowLevelRuntime_Evaluation_Tool_For_Container)はMITライセンスで公開されています。
- このツールで使用されているライブラリ・ソフト等のライセンスについては以下の通りです。
ソフトウェア・ライブラリ名 | ライセンス |
---|---|
docker engine | Apache License Version 2.0 |
sysstat | GNU General Public License v2.0 |
sysdig | Apache License Version2.0 |
sysbench(コンテナイメージ内部で使用) | GNU General Public License v2.0 |
unixbench(コンテナイメージ内部で使用) | GNU General Public License v2.0 |
iper3(コンテナイメージ内部で使用) | BSD License |
numpy | BSD License(pip-licensesにて確認) |
matplotlib | BSD License(pip-licensesにて確認) |
selenium | Apache Software License(pip-licensesにて確認) |
geckodriver | Mozilla Public License |
西村 惇(Nishimura Atsushi)
名古屋大学大学院 情報学研究科 高田研究室