MySQL ストレステストツールの使い方

MySQL ストレステストツールの使い方

1. MySQL 独自のストレステストツール - Mysqlslap

mysqlslap は、mysql に付属するベンチマーク ツールです。このツールは、シンプルな構文でデータをクエリし、柔軟で使いやすいです。このツールは、複数のクライアントが同時にサーバーにクエリ更新を送信することをシミュレートし、パフォーマンス テスト データを提供し、複数のエンジンのパフォーマンス比較を提供します。 mysqlslap は、最適化の前後の MySQL パフォーマンスを直感的に検証する基盤を提供します。システム運用と保守、および DBA 担当者は、オンライン データベースがサポートするユーザー トラフィックの上限とそのストレス耐性を正確に把握するために、いくつかの一般的なストレス テスト ツールを習得する必要があります。

1. デフォルトの最大接続数を変更する

MySQL のストレス テストを実行する前に、デフォルトの最大接続数を次のように変更する必要があります。

[root@mysql ~]# vim /etc/my.cnf 
................
[mysqld]
最大接続数=1024
[root@mysql ~]# systemctl mysqldを再起動します
# 最大接続数を表示しますmysql> show variables like 'max_connections';    
+-----------------+-------+
| 変数名 | 値 |
+-----------------+-------+
| 最大接続数 | 1024 |
+-----------------+-------+
セット内の 1 行 (0.00 秒)

ストレステストを実行するには:

[root@mysql ~]# mysqlslap --defaults-file=/etc/my.cnf --concurrency=100,200 --iterations=1 --number-int-cols=20 --number-char-cols=30 --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --engine=myisam,innodb --number-of-queries=2000 -uroot -p123 --verbose

上記のコマンドテストの説明:2つの読み取りおよび書き込み同時実行テストをシミュレートします。最初の時間は100、2回目は200で、SQLスクリプトを自動的に生成します。テストテーブルには20個のinitフィールド、30個が含まれます。
char フィールドを読み取り、毎回 2000 件のクエリ要求を実行します。テスト エンジンは myisam と innodb です。 (上記オプションの多くはデフォルト値であり省略可能です。各オプションの説明を知りたい場合は、mysqlslap --help で問い合わせてください)

上記のコマンドは次の結果を返します。


テスト結果の説明: Myisam では、100 台のクライアントが同時に追加のクエリを開始したときに初めて 0.557/秒かかり、200 台のクライアントが同時に追加のクエリを開始したときに 2 回目に 0.522/秒かかります。Innodb では、100 台のクライアントが同時に追加のクエリを開始したときに初めて 0.256/秒かかり、200 台のクライアントが同時に追加のクエリを開始したときに 2 回目に 0.303/秒かかります。

実際のニーズに応じて、同時リクエストの数を少しずつ増やしてストレス テストを実行できます。

2. ストレステストにはサードパーティのsysbenchツールを使用する

1. sysbenchツールをインストールする

[root@mysql ~]# yum -y install epel-release #サードパーティのepelソースをインストールします[root@mysql ~]# yum -y install sysbench #sysbenchツールをインストールします[root@mysql ~]# sysbench --version #ツールがインストールされていることを確認します sysbench 1.0.17

Sysbench は次のテストを実行できます。

  • CPUコンピューティングパフォーマンステスト
  • ディスクIOパフォーマンステスト
  • スケジューラのパフォーマンステスト
  • メモリ割り当てと転送速度テスト
  • POSIX スレッドパフォーマンステスト
  • データベース パフォーマンス テスト (OLTP ベンチマーク テスト。読み取り専用テストを実行するための oltp_read_only.lua スクリプトなど、/usr/share/sysbench/ ディレクトリ内の Lua スクリプトを通じて実行する必要があります)
  • Sysbench では、コマンドを実行するときに独自の Lua スクリプトを指定してテストをカスタマイズすることもできます。

2. sysbenchツールのヘルプオプションを表示する

[root@mysql ~]# sysbench --help
使用法:
 sysbench [オプション]... [テスト名] [コマンド]

ほとんどのテストで実装されているコマンド: prepare run cleanup help # 使用可能なコマンドは 4 つ 一般オプション: # 一般オプション --threads=N 使用するスレッドの数。デフォルトは 1 [1]
 --events=N 許可されるイベントの最大数 [0]
 --time=N 最大合計実行時間(秒単位)[10]
 --forced-shutdown=STRING 強制シャットダウンまでの --time 制限後の待機秒数、または無効にする場合は 'off' [off]
 --thread-stack-size=SIZE 各スレッドのスタックサイズ [64K]
 --rate=N 平均転送速度。 0は制限なしを意味する[0]
 --report-interval=N 指定された間隔(秒)で定期的に中間統計を報告します 0 中間報告を無効にします [0]
 --report-checkpoints=[LIST,...] 完全な統計情報をダンプし、指定された時点ですべてのカウンターをリセットします。このパラメータは、テストの開始からこの時間(秒単位)が経過したときにレポート チェックポイントを実行する必要があることを示す値のコンマ区切りリストです。レポートのチェックポイントはデフォルトではオフになっています。 []
 --debug[=on|off] 詳細なデバッグ情報を出力します [off]
 --validate[=on|off] 可能な場合は検証チェックを実行します [off]
 --help[=on|off] ヘルプ情報を表示して終了する [off]
 --version[=on|off] バージョン情報を表示して終了する [off]
 --config-file=FILENAME コマンドラインオプションを含むファイル --tx-rate=N 非推奨、代わりに --rate [0] を使用してください
 --max-requests=N は非推奨です。代わりに --events [0] を使用してください。
 --max-time=N は非推奨です。代わりに --time [0] を使用してください。
 --num-threads=N は非推奨です。代わりに --threads を使用してください [1]

疑似乱数ジェネレーターのオプション: # 疑似乱数ジェネレーターのオプション --rand-type=STRING 乱数分布 {uniform,gaussian,special,pareto} [special]
 --rand-spec-iter=N 数値生成に使用する反復回数 [12]
 --rand-spec-pct=N '特別' として扱われる値のパーセンテージ(特別分布用)[1]
 --rand-spec-res=N 使用する「特別な」値のパーセンテージ(特別な分布用)[75]
 --rand-seed=N 乱数ジェネレータのシード。0 の場合、現在の時刻が RNG シードとして使用されます。[0]
 --rand-pareto-h=N パレート分布のパラメータh [0.2]

ログオプション: # ログオプション --verbosity=N 詳細レベル {5 - デバッグ、0 - 重要なメッセージのみ} [3]

 --percentile=N レイテンシ統計を計算するパーセンタイル(1-100)。パーセンタイル計算を無効にするには、特別な値0を使用します [95]
 --histogram[=on|off] レポートにレイテンシヒストグラムを出力する [off]

一般的なデータベース オプション: # 一般的なデータベース オプション --db-driver=STRING 使用するデータベース ドライバーを指定します (使用可能なドライバーの一覧を取得するには 'help' を使用します)
 --db-ps-mode=STRING 準備されたステートメントの使用モード {auto, disabled} [auto]
 --db-debug[=on|off] データベース固有のデバッグ情報を出力します [off]

コンパイルされたデータベース ドライバー: # 組み込みのデータベース ドライバー。デフォルトで MySQL と PostgreSQL をサポートします。
 MySQL ドライバー
 pgsql - PostgreSQL ドライバ

mysql オプション: # MySQL データベース固有のオプション --mysql-host=[LIST,...] MySQL サーバー ホスト [localhost]
 --mysql-port=[LIST,...] MySQLサーバポート[3306]
 --mysql-socket=[LIST,...] MySQLソケット
 --mysql-user=STRING MySQLユーザー [sbtest]
 --mysql-password=STRING MySQLパスワード []
 --mysql-db=STRING MySQLデータベース名 [sbtest]
 --mysql-ssl[=on|off] クライアントライブラリで利用可能な場合はSSL接続を使用する [off]
 --mysql-ssl-cipher=STRING SSL接続に特定の暗号を使用する []
 --mysql-compression[=on|off] クライアントライブラリで利用可能な場合は圧縮を使用する [off]
 --mysql-debug[=on|off] すべてのクライアントライブラリ呼び出しをトレースします [off]
 --mysql-ignore-errors=[LIST,...] 無視するエラーのリスト、または「すべて」 [1213,1020,1205]
 --mysql-dry-run[=on|off] ドライラン。すべてのMySQLクライアントAPI呼び出しを実行せずに成功したと仮定します[オフ]

pgsql オプション: # PostgreSQL データベース固有のオプション --pgsql-host=STRING PostgreSQL サーバー ホスト [localhost]
 --pgsql-port=N PostgreSQLサーバポート [5432]
 --pgsql-user=STRING PostgreSQLユーザー [sbtest]
 --pgsql-password=STRING PostgreSQLパスワード []
 --pgsql-db=STRING PostgreSQLデータベース名 [sbtest]

コンパイル済みテスト: # 組み込みテストタイプ fileio - ファイル I/O テスト
 cpu - CPU パフォーマンス テスト
 メモリ - メモリ機能の速度テスト
 スレッド - スレッドサブシステムのパフォーマンステスト
 mutex - ミューテックスパフォーマンステスト

各テストのオプションのリストについては、「sysbench <testname> help」を参照してください。

3. SysbenchはMySQLデータベースのパフォーマンスをテストします

1) テストデータの準備

#sysbench に付属する lua スクリプトの使用方法を表示します [root@mysql ~]# sysbench /usr/share/sysbench/oltp_common.lua help
#sysbench で使用されるデフォルトのライブラリ名である sbtest ライブラリを作成する必要があります [root@mysql ~]# mysqladmin -uroot -p123 create sbtest;
#次に、テストに使用するテーブルを準備します。これらのテスト テーブルは、テスト ライブラリ sbtest に配置されます。ここで使用されるluaスクリプトは/usr/share/sysbench/oltp_common.luaです。
[root@mysql ~]# sysbench --mysql-host=127.0.0.1 \
> --mysql-ポート=3306 \
> --mysql-user=root \
> --mysql-パスワード=123 \
> /usr/share/sysbench/oltp_common.lua \
> --tables=10 \
> --table_size=100000 \
> 準備する
#--tables=10 は 10 個のテスト テーブルを作成することを意味します。
#--table_size=100000 は、各テーブルに 100,000 行のデータを挿入することを意味します。
#prepare は、これが数値を準備するプロセスであることを示します。

2) テストデータが存在することを確認する

[root@mysql ~]# mysql -uroot -p123 sbtest; #sbtest ライブラリにログインmysql> show tables; #対応するテーブルを表示+------------------+
| sbtest 内のテーブル |
+------------------+
|sbtest1|
|sbtest10|
|sbテスト2|
|sbtest3|
|sbテスト4|
|sbtest5|
|sbtest6|
|sbtest7|
|sbtest8|
|sbtest9|
+------------------+
セット内の行数は 10 です (0.00 秒)

mysql> select count(*) from sbtest1; #テーブルをランダムに選択し、100,000件のレコードがあることを確認します+----------+
| カウント(*) |
+----------+
| 100000 |
+----------+
セット内の1行(0.01秒)

3) データベースのテストと結果分析

以前にデータを準備したステートメントを少し変更すると、テストに使用できます。

以前使用した Lua スクリプトは oltp_common.lua であり、これは他の Lua スクリプトによって呼び出される共通スクリプトであり、テストに直接使用できないことに注意してください。

したがって、読み取りテストと書き込みテストを実行するには、oltp_read_write.lua スクリプトを使用します。読み取り専用テスト、書き込み専用テスト、削除テスト、一括挿入テストなど、他の多くの種類のテストがあります。対応する lua スクリプトを見つけて呼び出すことができます。

#次のようにテストコマンドを実行します。
[root@mysql ~]# sysbench --threads=4 \
> --time=20 \
> --レポート間隔=5 \
> --mysql-ホスト=127.0.0.1 \
> --mysql-ポート=3306 \
> --mysql-user=root \
> --mysql-パスワード=123 \
> /usr/share/sysbench/oltp_read_write.lua \
> --tables=10 \
> --table_size=100000 \
> 実行

上記のコマンドは次の結果を返します。

[root@mysql ~]# sysbench --threads=4 --time=20 --report-interval=5 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123 /usr/share/sysbench/oltp_read_write.lua --tables=10 --table_size=100000 実行

sysbench 1.0.17 (システム LuaJIT 2.0.4 を使用)

次のオプションでテストを実行します。
スレッド数: 4
5秒ごとに中間結果を報告します
現在の時刻から乱数ジェネレータを初期化しています

ワーカー スレッドを初期化しています...

スレッドが始まりました!
# 以下は 5 秒ごとに返される結果です。統計指標には次のものが含まれます。
# スレッド数、tps(1秒あたりのトランザクション数)、qps(1秒あたりのクエリ数)、
# 1 秒あたりの読み取り/書き込み/その他の回数、遅延、1 秒あたりのエラー、1 秒あたりの再接続 [ 5 秒 ] thds: 4 tps: 1040.21 qps: 20815.65 (r/w/o: 14573.17/4161.25/2081.22) lat (ms,95%): 7.17 err/s: 0.00 reconn/s: 0.00
[ 10 秒 ] スレッド: 4 tps: 1083.34 qps: 21667.15 (r/w/o: 15165.93/4334.55/2166.68) lat (ms,95%): 6.55 エラー/秒: 0.00 偵察/秒: 0.00
[ 15 秒 ] スレッド: 4 tps: 1121.57 qps: 22429.09 (r/w/o: 15700.64/4485.30/2243.15) lat (ms,95%): 6.55 エラー/秒: 0.00 偵察/秒: 0.00
[ 20 秒 ] スレッド数: 4 tps: 1141.69 qps: 22831.98 (r/w/o: 15982.65/4566.16/2283.18) lat (ms,95%): 6.09 エラー/秒: 0.00 偵察/秒: 0.00
SQL 統計:
  実行されたクエリ:
    read: 307146 # 実行された読み取り操作の数write: 87756 # 実行された書き込み操作の数other: 43878 # 実行されたその他の操作の数total: 438780
  トランザクション: 21939 (1096.57/秒) # トランザクション実行クエリの平均レート: 438780 (21931.37/秒) # 無視されたエラーで 1 秒あたりに実行されたクエリの平均数: 0 (0.00/秒)
  再接続: 0 (0.00/秒)

一般的な統計:
  合計時間: 20.0055 秒 # 消費された合計時間 イベントの合計数: 21939 # リクエストの合計数 (読み取り、書き込み、その他)

レイテンシー(ミリ秒):
     最小: 1.39
     平均: 3.64
     最大: 192.05
     95 パーセンタイル: 6.67 # サンプリング合計で計算された平均レイテンシ: 79964.26

スレッドの公平性:
  イベント数 (平均/標準偏差): 5484.7500/15.12
  実行時間 (平均/標準偏差): 19.9911/0.00

4. CPU/IO/メモリなどのテスト

sysbench に組み込まれているいくつかのテスト インジケーターは次のとおりです。

[root@mysql ~]# sysbench --help
   .......... # 一部のコンテンツを省略 コンパイルされたテスト:
 fileio - ファイルI/Oテスト
 cpu - CPU パフォーマンス テスト
 メモリ - メモリ機能の速度テスト
 スレッド - スレッドサブシステムのパフォーマンステスト
 mutex - ミューテックスパフォーマンステスト

出力テスト メソッドを直接支援できます (例: fileio test)。

[root@mysql ~]# sysbench ファイル入出力ヘルプ
sysbench 1.0.17 (システム LuaJIT 2.0.4 を使用)

ファイル入出力オプション:
 --file-num=N 作成するファイルの数 [128]
 --file-block-size=N すべてのIO操作で使用するブロックサイズ [16384]
 --file-total-size=SIZE 作成するファイルの合計サイズ [2G]
 --file-test-mode=STRING テストモード {seqwr、seqrewr、seqrd、rndrd、rndwr、rndrw}
 --file-io-mode=STRING ファイル操作モード {sync,async,mmap} [sync]
 --file-async-backlog=N スレッドごとにキューに入れる非同期操作の数 [128]
 --file-extra-flags=[LIST,...] ファイルを開くときに使用する追加フ​​ラグのリスト {sync,dsync,direct} []
 --file-fsync-freq=N この回数のリクエスト後にfsync()を実行します(0 - fsync()を使用しない)[100]
 --file-fsync-all[=on|off] 各書き込み操作後にfsync()を実行する [オフ]
 --file-fsync-end[=on|off] テスト終了時にfsync()を実行する [on]
 --file-fsync-mode=STRING 同期に使用する方法 {fsync, fdatasync} [fsync]
 --file-merged-requests=N 可能であれば、最大でこの数の IO 要求をマージします (0 - マージしない) [0]
 --file-rw-ratio=N 複合テストの読み取り/書き込み比率 [1.5]

1) IOパフォーマンスをテストする

たとえば、合計 2G のファイルを 5 つ作成し、各ファイルのサイズが約 400M であるとします。

[root@mysql ~]# sysbench fileio --file-num=5 --file-total-size=2G を準備します
[root@mysql ~]# ll -lh テスト*
-rw------ 1 ルート ルート 410M 5月26日 16:05 test_file.0
-rw------ 1 ルート ルート 410M 5月26日 16:05 test_file.1
-rw------ 1 ルート ルート 410M 5月26日 16:05 test_file.2
-rw------ 1 ルート ルート 410M 5月26日 16:05 test_file.3
-rw------ 1 ルート ルート 410M 5月26日 16:05 test_file.4

次にテストを実行します。

[root@mysql ~]# sysbench --events=5000 \
> --スレッド=16 \
> ファイルio \
> --ファイル番号=5 \
> --ファイル合計サイズ=2G \
> --file-test-mode=rndrw \
> --file-fsync-freq=0 \
> --ファイルブロックサイズ=16384 \
> 実行

返される結果は次のとおりです。

次のオプションでテストを実行します。
スレッド数: 16
現在の時刻から乱数ジェネレータを初期化しています

追加のファイルオープンフラグ: (なし)
5 つのファイル、それぞれ 409.6MiB
合計ファイルサイズ 2GiB
ブロックサイズ 16KiB
IO リクエスト数: 5000
複合ランダムIOテストの読み取り/書き込み比: 1.50
テスト終了時に fsync() を呼び出します。有効です。
同期I/Oモードの使用
ランダム読み取り/書き込みテストを実行
ワーカー スレッドを初期化しています...

スレッドが始まりました!

ファイル操作:
  読み取り/秒: 9899.03
  書き込み数/秒: 6621.38
  fsyncs/秒: 264.33

スループット: # 読み取りスループット、MiB/s: 154.66 # 読み取り帯域幅を示します 書き込み、MiB/s: 103.46 # 書き込み帯域幅を示します 一般的な統計:
  合計時間: 0.3014秒
  イベント総数: 5000

レイテンシー(ミリ秒):
     最小: 0.00
     平均: 0.81
     最大: 53.56
     95パーセンタイル: 4.10
     合計: 4030.48

スレッドの公平性:
  イベント数 (平均/標準偏差): 312.5000/27.64
  実行時間(平均/標準偏差): 0.2519/0.02

2) CPUパフォーマンスをテストする

[root@mysql ~]# sysbench cpu --threads=40 --events=10000 --cpu-max-prime=20000 実行

MySQL ストレステストツールの使い方に関するこの記事はこれで終わりです。MySQL ストレステストツールの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL 5.7 に組み込まれているストレス テストの mysqlslap コマンドと構文の詳細な説明
  • MySQL ストレス テスト方法 mysqlslap を使用して MySQL ストレスをテストする方法は?
  • Mysqlslap MySQL ストレステストツールの簡単なチュートリアル
  • MySQL ストレステストツール mysqlslap の紹介と使用
  • mysql の sysbench ストレス テストに関する詳細なチュートリアル
  • MySQL ストレス テスト スクリプトの例
  • MySQL ストレステストツール Mysqlslap の使用

<<:  VueとElementUIを組み合わせたスキン変更ソリューション

>>:  Jenkins+tomcat の自動ホットデプロイメント/再起動と発生した問題の解決策 (推奨)

推薦する

値の転送を実現するために、2つの同じレベルのコンポーネントをVueで作成します。

Vue コンポーネントは接続されているため、コンポーネント間で値を渡す必要があるのは避けられません...

フロア効果を実現するためのJavaScript

この記事では、フロア効果を実現するためのJavaScriptの具体的なコードを参考までに紹介します。...

ドラッグ効果を実現するための js オブジェクト指向メソッド

この記事では、ドラッグアンドドロップをJSオブジェクト指向で実装するための具体的なコードを参考までに...

DockerのTLS(SSL)証明書の有効期限の問題を解決する

問題現象: [root@localhost ~]# docker イメージをプル xxx.com.c...

MySQL EXPLAIN ステートメントの使用例

目次1. 使用方法2. 出力結果1.id 2.選択タイプ3.表4.パーティション5.タイプ6.可能な...

Vue はシームレスなカルーセル効果を実現

この記事では、シームレスなカルーセル効果を実現するためのVueの具体的なコードを参考までに紹介します...

DockerコンテナのIPアドレスを表示する方法

私はずっとDockerにはIPアドレスがないと思っていました。実はDockerのネットワークテンプレ...

MySQL での r2dbc の使用に関する詳細な理解

導入MySQL は、私たちが日常業務で使用する非常に一般的なデータベースです。MySQL は現在 O...

VUEの基本を理解するのに役立つ記事

目次VUEとはVueのコアプラグインVueルーターヴュークスアクシオス要素UI Vue フロントエン...

React+axios は github 検索ユーザー機能を実装します (サンプル コード)

負荷リクエスト成功リクエストに失敗しました cmdをクリックし、ファイルパスでEnterキーを押しま...

MySQLのMERGEストレージエンジンの詳細な説明

MERGE ストレージ エンジンは、MyISAM テーブルのグループを論理ユニットとして扱い、同時に...

mysql はインデックスを無効にしますか?

mysql の IN はインデックスを無効にしますか?しませんよ! 結果をご覧ください: mysq...

MySQL マルチバージョン同時実行制御 MVCC の実装

トランザクション分離レベルの設定 グローバルトランザクション分離レベルを読み取りコミット済みに設定;...

Vueはファイルのアップロードとダウンロード機能を実装します

この記事では、ファイルのアップロードとダウンロード機能を実装するためのVueの具体的なコードを例とし...

MySQLのユーザー権限の確認と管理方法の詳細な説明

この記事では、例を使用して、MySQL ユーザー権限を確認および管理する方法を説明します。ご参考まで...