当サイトは、アフィリエイト広告を利用しています

【Docker】コンテナでsysbenchを使ってみる

作成日:2024月01月20日
更新日:2024年01月20日

プロジェクトでシステムに負荷をかけることが必要になり
その時にベンチマークツールである「sysbench」を使ったので
使い方を忘備録として残す。

sysbenchとは?

sysbenchはCPUやメモリ、diskioなどの性能を評価するための
ベンチマークテストを実行できるツール。

インストールしてコマンド実行することで
簡単にシステムに負荷をかけることができる。

sysbenchでは下記のベンチマークを実行することができる

  • cpu
  • memory
  • fileio
  • threads
  • mutex
  • oltp

実際にdockerでlinuxのubuntuコンテナを作って
sysbenchのベンチマークテストを動かしてみる

環境

下記の環境で行う

  • Windows10
  • Docker version 24.0.2(Docker for Windows)
  • sysbench 1.0.20

Docker for Windowsのインストール方法については下記記事で 紹介しています

コンテナを作る

まずはubuntuのコンテナをdocker-comopseを使って
準備する

構成

ディレクトリ構成は下記のようになる

構成
|-- Dockerfile
`-- docker-compose.yml

任意のディレクトリ内に

  • Dockerfile
  • docker-compose.yml

を作成する

docker-compose.yml

docker-composeでコンテナを作る。
buildはDockerfileを使う。

docker-compose.yml
version: "3"
# コンテナ
services:
ubuntu:
container_name: "ubuntu"
# Dockerfileをビルド
build:
context: .
dockerfile: Dockerfile
tty: true

Dockerfile

Dockerfile
# イメージ
FROM ubuntu:24.04
# sysbenchのインストール
RUN apt-get -y update
RUN apt-get -y install sysbench

build時にsysbenchもインストールする。

コンテナを作成してからインストールする場合は
コンテナ作成後、ログインして同じコマンドを実行すれば
sysbenchをインストールすることができる。

ubunu以外を使う場合は下記参照

コンテナ作成

docker compose実行

コンテナを作る

docker-compose実行
docker compose up -d

Docker for Windowsを起動しておくないと失敗するので注意

コンテナ確認

コンテナ確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
478e7932eeb3 sysbench-ubuntu "/bin/bash" 16 minutes ago Up 16 minutes ubuntu

コンテナが作成され、起動していることを確認

コンテナにログイン

ログイン
$ docker exec -it ubuntu bash
root@478e7932eeb3:/#

sysbenchのインストール確認

sysbench確認
$ docker exec -it ubuntu bash
root@478e7932eeb3:/# sysbench --version
sysbench 1.0.20

versionコマンドでversionが表示されれば
インストールできている。

sysbenchの基本

sysbenchはコマンド実行することで実行できる。

sysbenchのコマンド体系

sysbenchは下記のようにコマンドを打って実行する。

コマンド
sysbench [options]... [testname] [command]

options

テスト実行のオプションを指定する
ちょっと全部詳しくは調べきれないので下記を参照してください

testname

何のベンチマークを実行するかを指定する
例えばcpu,memory,fileioなど

command

commandにはprepare/run/cleanup のいずれかを指定し
それぞれ

  • テスト環境セットアップ
  • テスト本体の実行
  • テスト環境の掃除

の処理が実行される。

sysbenchを動かす

作成したコンテナで

  • cpu
  • memory
  • fileio

のベンチマークを実行してみる

cpu

cpuのテストでは、指定した最大探索数(未設定の場合は10000)以下の素数を数えるという
処理を行い、それにかかった時間を測定する。

cpuベンチマーク実行

cpu
sysbench cpu run

実行すると下記のようにベンチマークの結果が
コマンド出力される。

実行
root@478e7932eeb3:/# sysbench cpu run
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)
Running the test with following options:
Number of threads: 1
Initializing random number generator from current time
Prime numbers limit: 10000
Initializing worker threads...
Threads started!
CPU speed:
events per second: 2848.79
General statistics:
total time: 10.0005s
total number of events: 28500
Latency (ms):
min: 0.31
avg: 0.35
max: 9.16
95th percentile: 0.47
sum: 9984.97
Threads fairness:
events (avg/stddev): 28500.0000/0.00
execution time (avg/stddev): 9.9850/0.00

オプションをつけてみる

cpuのテストではオプションで最大素数を指定することが
できる。

この値が大きいほど、負荷が上がる

option
sysbench cpu --cpu-max-prime=1000000 --threads=4 runrun

threadsは実行するスレッド数を指定できる。
このオプションはcpu以外でも使える。

このようにオプションはtestname個別のオプションと
共通のオプションがある

memory

メモリのベンチマークテストでは
メモリに対する連続した書き込みおよび読み出しを行って
それにかかった時間を測定している。

memory
sysbench memory --memory-block-size=4G --memory-total-size=100G --threads=4 run

--memory-block-size=4G

memoryテスト時のみ指定できるオプション
このオプションは、メモリブロックのサイズを設定する
各操作でこのサイズのデータがメモリに読み書きされる。

--memory-total-size=100G

memoryテスト時のみ指定できるオプション
このオプションは、テスト全体で書き込みまたは読み出しを行うメモリの合計サイズを設定する
テストが終了するまでに合計でこのサイズのデータがメモリに読み書きされる

実行

memory
root@478e7932eeb3:/# sysbench memory --memory-block-size=4G --memory-total-size=100G --threads=4 run
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)
Running the test with following options:
Number of threads: 4
Initializing random number generator from current time
Running memory speed test with the following options:
block size: 4194304KiB
total size: 102400MiB
operation: write
scope: global
Initializing worker threads...
Threads started!
Total operations: 24 ( 5.28 per second)
98304.00 MiB transferred (21633.45 MiB/sec)
General statistics:
total time: 4.5422s
total number of events: 24
Latency (ms):
min: 445.04
avg: 753.15
max: 885.12
95th percentile: 877.61
sum: 18075.68
Threads fairness:
events (avg/stddev): 6.0000/0.00
execution time (avg/stddev): 4.5189/0.02

fileio

fileioではファイルへの読み書きを行って
それにかかった時間を測定してる。

fileioのテストは他と違い、下記の3つのコマンド
で実行する

  • sysbench fileio --file-total-size=1G prepare
  • sysbench fileio --file-total-size=1G --file-test-mode=rndrw run
  • sysbench fileio cleanup

sysbench fileio --file-total-size=1G prepare

このコマンドでテストで使うファイルを用意する。
コマンドを実行すると合計1Gのファイルが作成される。

作成されるファイルの数を指定したい場合は「--file-num=3」
で指定できる
「--file-num=3」をつけた場合、3ファイル作成され、
その合計サイズが1Gになる

sysbench fileio --file-total-size=1G --file-test-mode=rndrw run

fileioのテストを実行する
「--file-test-mode=rndrw」でテストモードを設定している

モードは下記の通り

  • seqwr シーケンシャル書き込み
  • seqrewr シーケンシャル読み書き
  • seqrd シーケンシャル読み出し
  • rndrd ランダム読み出し
  • rndwr ランダム書き込み
  • rndrw ランダム読み書き

注意としてはprepareで「--file-num」を
つけていた場合、runでも「--file-num」をつける必要がある
つけないとエラーになる

下記のような感じ

bash
sysbench fileio --file-total-size=1G --file-test-mode=rndrw run

sysbench fileio cleanup

テストで使ったファイルを削除する

実行

ファイルが大量にできるので「--file-num」
オプションはつけて実行する

実行
# 準備
root@478e7932eeb3:/# sysbench fileio --file-total-size=1G --file-num=3 prepare
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)
3 files, 349525Kb each, 1023Mb total
Creating files for the test...
Extra file open flags: (none)
Creating file test_file.0
Creating file test_file.1
Creating file test_file.2
1073774592 bytes written in 0.82 seconds (1243.49 MiB/sec).
# 実行
root@478e7932eeb3:/# sysbench fileio --file-total-size=1G --file-test-mode=rndrw --file-num=3 run
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)
Running the test with following options:
Number of threads: 1
Initializing random number generator from current time
Extra file open flags: (none)
3 files, 341.33MiB each
1024MiB total file size
Block size 16KiB
Number of IO requests: 0
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Initializing worker threads...
Threads started!
File operations:
reads/s: 10115.18
writes/s: 6743.45
fsyncs/s: 505.86
Throughput:
read, MiB/s: 158.05
written, MiB/s: 105.37
General statistics:
total time: 10.0051s
total number of events: 173759
Latency (ms):
min: 0.00
avg: 0.06
max: 83.75
95th percentile: 0.01
sum: 9933.62
Threads fairness:
events (avg/stddev): 173759.0000/0.00
execution time (avg/stddev): 9.9336/0.00
# クリーンアップ
root@478e7932eeb3:/# sysbench fileio cleanup
sysbench 1.0.20 (using system LuaJIT 2.1.0-beta3)
Removing test files...
root@478e7932eeb3:/#

注意点

キャッシュの影響でうまく性能が測定できない場合がある。
その時はrunに「--file-extra-flags=direct」オプションをつける

このオプションはsysbenchの内部ファイルキャッシュを無効にするので
実際のディスクからの読み書き操作が実行されるようになる。

まとめ

sysbenchを使ったベンチマークの実行方法を
まとめてみた。

実際には性能テストをしたい場合はsysbenchだけでなくて
システム性能を計測できるツール「Glances」などと
併用することになるかと思う。

Glancesnについては下記で紹介しています

参考

関連記事

新着記事

タグ別一覧
top