都市へのテレポーテーション – 「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 のパフォーマンスの最適化と運用保守管理] 著者: 趙玉強先生
私は徐珠兄弟です、また明日〜