[24 日目] SQL 上級者向け - クエリの最適化 - Performance_schema シリーズ 演習 1: 待機イベントを使用して MySQL のパフォーマンスの問題をトラブルシューティングする (SQL Xiao Xuzhu)

都市へのテレポーテーション – 「32日間のSQL財団ビル」

ゼロ。

今日でSQLチェックインの学習24日目. 毎日、グループ メンバーが読む記事を提供します (購読料を支払う必要はありません)。

誰もが最初に自分で考え、本当にわからない場合は、次の問題解決のアイデアを読んで、もう一度自分で実装してください. Xiaoxuzhu JAVA コミュニティでは、対応する [チェックイン ステッカー] チェックイン、今日のタスクが完了し、毎日チェックインすることを学ぶ良い習慣を身につけます。

徐珠兄弟が全員で同じ記事を一緒に勉強するように編成するので、質問がある場合はグループで質問できます. グループの友達はすぐに助けてくれます.一緒に勉強し、コミュニケーションをとれる戦友がいるというのは、なんと幸運なことでしょう。

私の学習戦略は非常にシンプルで、質問海戦略 + ファインマン学習法です。これらすべての質問を真剣に実装できれば、SQLはその基盤をうまく確立したことになります。後の高度な学習のために、引き続き私についてきて、一緒に建築家の道を歩んでください。

本日の学習内容: SQL Advanced - Query Optimization - Performance_schema シリーズ Practice 1: Using Waiting Events to Troubleshoot MySQL Performance Problems

1. 背景

実稼働がオンラインになる前に、追加、削除、変更、およびチェックのためにデータベースをベンチマークし、ベンチマーク データを収集し、その後の拡張とアーキテクチャのアップグレードに備えます。
MySQL データベースのベンチマークでは、通常、sysbench、tpcc-mysql、workbench が選択されます。

以下では、sysbench ベンチマーク ツールを使用して MySQL データベースをテストする例として、performance_schema の待機イベントを使用してデータベース パフォーマンスのボトルネックをトラブルシューティングする方法を紹介します。

2. performance_schema 構成構成テーブルにより、待機中のイベントの収集と記録が可能になります。

performance_schema 構成テーブルを使用して、待機イベントの収集とロギングを有効にします。

 use performance_schema;

ここに画像の説明を挿入
setup_instruments テーブルの enabled フィールドと timed フィールドを yes に変更し、対応するインストゥルメントが有効であることを示します。

update setup_instruments set enabled='yes',timed='yes' where name like 'wait/%';

ここに画像の説明を挿入
変更結果を表示します。有効化フィールドと時間指定フィールドが YES の場合、現在のインストゥルメントが有効化されていることを意味します (ただし、この時点では、コレクターはイベント データをすぐには収集しません。これらの待機中のイベントのテーブルを保存する必要があります – 消費者) 、有効にした後に収集が開始されます)

select * from setup_instruments where name like 'wait/%';

ここに画像の説明を挿入
ここに画像の説明を挿入
イベントを待機するコンシューマーを有効にする

update setup_consumers set enabled='yes' where name like '%wait%';

ここに画像の説明を挿入
検索結果:

select * from setup_consumers where name like '%wait%';

ここに画像の説明を挿入

3. sysbench ベンチマーク ツール

mysql ベンチマーク テストは、mysql データベースのランタイムに対するストレス テストと理解できます。TPS/ QPS
: スループットを測定します。
応答時間: 平均応答時間、最小応答時間、最大応答時間、および時間パーセンテージ Zhu を含みます。
同時実行: 同時に処理されるクエリ リクエストの数。
sysbench はマルチスレッド作業をサポートし、プラットフォーム間でインストールおよびデプロイできます。

3.1 sysbench のインストールと使用

3.1.1 yum のインストール

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash

ここに画像の説明を挿入

sudo yum -y install sysbench

写真のように、インストールは成功です。
ここに画像の説明を挿入

3.1.2 バージョン情報を表示する

sysbench --version

ここに画像の説明を挿入

3.1.3 シスベンチの命令

 sysbench --help

以下の角括弧内の値はデフォルト値を表します

オプションタイプ パラメータ名 パラメータの意味
一般オプション スレッド スレッドの数を指定します [1]
一般オプション イベント リクエストの最大数を制限します。0 は制限なしを意味します[0]
一般オプション 時間 最大実行時間を制限します。0 は制限なしを意味します [10]、単位は秒です
一般オプション 強制シャットダウン 最大実行時間に達した後、どのくらい待つ必要がありますか? sysbench を閉じる off は、この機能を無効にすることを意味します [off]
一般オプション スレッドスタックサイズ 各スレッドが使用するスタック領域のサイズ [64K]
一般オプション 割合 平均トランザクション処理率、0 は無制限を意味します [0]
一般オプション レポート間隔 数秒ごとに結果をレポートします。0 は間隔レポートを無効にします[0]
一般オプション 構成ファイル ファイルからコマンド ライン オプションを読み取る
mysql 固有のオプション mysql ホスト mysql ホスト名、[localhost]
mysql 固有のオプション mysql ポート mysql ポート、[3306]
mysql 固有のオプション mysql-ソケット 接続するソケットファイルを指定
mysql 固有のオプション mysql ユーザー mysql にログインするためのユーザー名、デフォルト値: [sbtest]
mysql 固有のオプション mysql-パスワード mysql にログインするためのパスワード
mysql 固有のオプション mysql-db データベース名を指定します。デフォルト: [sbtest]
mysql 固有のオプション mysql-ssl ssl を使用して接続する
mysql 固有のオプション mysql-ssl-暗号 SSL接続時のパスワード
mysql 固有のオプション mysql-圧縮 圧縮アルゴリズムを使用する
mysql 固有のオプション mysql-デバッグ すべてのクライアントの使用状況を追跡、[オフ]
mysql 固有のオプション mysql-無視-エラー 指定されたエラー コードを無視するか、all を使用してすべてのエラーを無視します [1213,1020,1205]
  • testname : 実行するテストの名前を指定します。

  • command: 準備、実行、クリーンアップなど、sysbench によって実行されるコマンドを表します。

    • prepare : テスト用に事前にデータを準備します。
    • run : 正式なテストを実行します。
    • cleanup: テストの完了後にデータベースをクリーンアップします。

3.2 sysbench テスト サーバーの CPU パフォーマンス

sysbench cpu --cpu-max-prime=20000 --threads=2 run

cpu のテストは、素数の追加テストを実行することです
。 -cpu-max-prime: 生成される素数の数の上限。
–threads: 素数計算のスレッド数を開始します。

ここに画像の説明を挿入
説明します:

Running the test with following options:
#指定线程个数
Number of threads: 2
Initializing random number generator from current time

#每个线程产生的素数上限为2万个。
Prime numbers limit: 20000

Initializing worker threads...

Threads started!

CPU speed:
#所有线程每秒完成了839.89次event
    events per second:   839.89

General statistics:
    total time:                          10.0022s 
    total number of events:              8402	#在10.0022s秒内共完成了8402次event
    

Latency (ms):
         min:                                    2.29
         avg:                                    2.38
         max:                                   10.31
         95th percentile:                        2.61  #95%的events都在2.61毫秒内完成。
         sum:                                19997.47

Threads fairness:
# 平均每完成4201.0000次event,标准差是2
    events (avg/stddev):           4201.0000/2.00
    # 每个线程平均耗时9.9987秒。
    execution time (avg/stddev):   9.9987/0.00

3.3 Sysbench テスト ハードディスク IOPS

3.3.1 テストデータの準備

sysbench fileio --file-total-size=1G --file-test-mode=rndrw --time=30 --max-requests=0 prepare

ここに画像の説明を挿入
ここに画像の説明を挿入

3.3.2 テストの開始

 sysbench fileio --file-total-size=1G --file-test-mode=rndrw --time=30 --max-requests=0 run

実行効果:
ここに画像の説明を挿入

IOPS の計算式は次のとおりです。

IOPS=(読み取りスループット + 書き込みスループット)*1024/16KB
読み取りスループット: 1 秒あたりの入力 書き込みスループット: 1 秒
あたりの出力。

図のテスト データから、ハードディスクの現在の IOPS は次のように計算できます。

IOPS=( 12.31+8.21)*1024/16=1313.28

3.3.3 テストデータのクリア

 sysbench fileio --file-total-size=1G --file-test-mode=rndrw --time=30 --max-requests=0 cleanup

ここに画像の説明を挿入

3.4 戦闘: sysbench を使用して mysql データベースをテストする

sysbench は、データベースのパフォーマンス テスト用の lua スクリプトを提供します。これらのスクリプトは、/usr/share/sysbench/directory に配置されます。
構造をツリー形式で表示するには、最初に tree コマンドをインストールします。

sudo yum install -y tree

ここに画像の説明を挿入

lua スクリプトを一覧表示します。

tree /usr/share/sysbench/ -P *.lua

ここに画像の説明を挿入
次の実際の戦闘は、lua スクリプトを使用して mysql データベースをテストする方法を示しています。

3.4.1 テストデータの準備

テスト データベース sysbenchdemo を作成する

create database sysbenchdemo;

ここに画像の説明を挿入
テスト データを準備します。

sysbench /usr/share/sysbench/oltp_insert.lua \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-socket=/tmp/mysql.sock \
--mysql-user=root \
--mysql-password=xiaoxuzhu \
--mysql-db=sysbenchdemo \
--db-driver=mysql \
--tables=5 \
--table-size=100000 \
--time=180 prepare

ここに画像の説明を挿入

説明します:

/usr/share/sysbench/oltp_insert.lua スクリプトを使用して 5 つのテーブルを作成し、各テーブルに 100,000 個のデータを挿入します。

3.4.2 テストの開始

sysbench /usr/share/sysbench/oltp_insert.lua \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-socket=/tmp/mysql.sock \
--mysql-user=root \
--mysql-password=xiaoxuzhu \
--mysql-db=sysbenchdemo \
--db-driver=mysql \
--tables=5 \
--table-size=100000 \
--time=180 run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 1
Initializing random number generator from current time


Initializing worker threads...

Threads started!

SQL statistics:
    queries performed:
        read:                            0
        # 总的写次数
        write:                           29970
        other:                           0
        total:                           29970
        # 总的事务数和每秒事务数
    transactions:                        29970  (166.50 per sec.)
    queries:                             29970  (166.50 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
# 总的执行时间和事件数。
    total time:                          180.0018s
    total number of events:              29970
# 延时统计信息
Latency (ms):
         min:                                    3.16
         avg:                                    6.00
         max:                                  237.40
         95th percentile:                       11.24
         sum:                               179912.58

Threads fairness:
    events (avg/stddev):           29970.0000/0.00
    execution time (avg/stddev):   179.9126/0.00

3.4.3 テストデータの消去

sysbench /usr/share/sysbench/oltp_insert.lua \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-socket=/tmp/mysql.sock \
--mysql-user=root \
--mysql-password=xiaoxuzhu \
--mysql-db=sysbenchdemo \
--db-driver=mysql \
--tables=5 \
--table-size=100000 \
--time=180 cleanup

ここに画像の説明を挿入

4. Sysbench が mysql データベースに圧力をかける

スレッド数に応じて tps と qps が増加しなくなるまで、同時スレッド数を徐々に増やします。

4.1 テストデータの準備:

sysbench /usr/share/sysbench/oltp_insert.lua \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-socket=/tmp/mysql.sock \
--mysql-user=root \
--mysql-password=xiaoxuzhu \
--mysql-db=sysbenchdemo \
--db-driver=mysql \
--tables=8 \
--table-size=100000 \
--time=180 prepare

ここに画像の説明を挿入

4.2 テストを開始する

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-socket=/tmp/mysql.sock \
--mysql-user=root \
--mysql-password=xiaoxuzhu \
--mysql-db=sysbenchdemo \
--db-driver=mysql \
--oltp-table-size=5000000 \
--oltp-tables-count=8 \
--num-threads=16 \
--max-time=1800 \
--max-requests=0 \
--report-interval=1 run

sysbench の出力から、16 の同時スレッド oltp のプレッシャーの下で、tps は 600 ~ 900、qps: 約 15000、遅延は 1000ms+
ここに画像の説明を挿入
であることがわかります。 mysqlのCPU使用率が高いことがわかります。
ここに画像の説明を挿入
待機中のイベント統計のクエリを容易にするために、まず、現在待機中のイベント (非履歴データ) のリアルタイム統計のビューを作成できます。

 use performance_schema;

ここに画像の説明を挿入

create view sys.test_waits as select sum(TIMER_WAIT) as TIMER_WAIT,sum(NUMBER_OF_BYTES) as NUMBER_OF_BYTES, EVENT_NAME,OPERATION from events_waits_current where EVENT_NAME!='idle' group by EVENT_NAME,OPERATION;

ここに画像の説明を挿入

select sys.format_time(TIMER_WAIT),sys.format_bytes(NUMBER_OF_BYTES),EVENT_NAME,OPERATION from sys.test_waits where sys.format_time(TIMER_WAIT) not regexp 'ns|us' order by TIMER_WAIT desc;

ここに画像の説明を挿入
events_waits_current テーブルを直接クエリすることもできます

select THREAD_ID,EVENT_NAME,sys.format_time(TIMER_WAIT),INDEX_NAME,NESTING_EVENT_TYPE,OPERATION,NUMBER_OF_BYTES 
from events_waits_current 
where EVENT_NAME!='idle' order by TIMER_WAIT desc;

ここに画像の説明を挿入

上記の待機イベントのクエリ結果から、CPU が不足しており、wait/synch/cond/mysqlx/scheduler_dynamic_worker_pending スケジューラ動的ワーカー プログラムが中断されています。

V. まとめ

この記事では、sysbench をインストールして使用する方法を共有し、sysbench を使用して mysql データベースの圧力テストを行う方法と、待機イベントを使用して MySQL のパフォーマンスの問題をトラブルシューティングする方法を詳しく紹介します。
ははは、わかったかな~

6. 参照

応用例集 | performance_schema 総合紹介 (on)

[Mysql データベースの高度な実践 - 第 10 章 mysql のパフォーマンスの最適化と運用保守管理] 著者: 趙玉強先生

私は徐珠兄弟です、また明日〜

おすすめ

転載: blog.csdn.net/shi_hong_fei_hei/article/details/128370743