Contenu connexe Similaire à MySQL 5.7 トラブルシューティング 性能解析入門編 (20) Plus de Mikiya Okuno (20) MySQL 5.7 トラブルシューティング 性能解析入門編4. アジェンダ
●
MySQL の性能解析の基本
– チューニングの基本
– スロークエリログ、 SHOW GLOBAL STATUS 、 SHOW ENGINE
INNODB STATUS 、 SHOW PROCESSLIST 、 EXPLAIN
– 基本的なパラメーターチューニング
●
モダンなツールを使いこなす
– パフォーマンススキーマ( MySQL 5.5~ )
– ダイジェストサマリテーブル( MySQL 5.6~ )
– InnoDB Metrics テーブル( MySQL 5.6~ )
– sys スキーマ( MySQL 5.7~ )
– オプティマイザトレース( MySQL 5.6~ )
●
MySQL 5.7 におけるオプション設定例
6. チューニングの基本
●
パフォーマンスの概念
– レスポンス vs スループット
– レスポンス・・・どれだけ短時間で処理が完了するか
– スループット・・・単位時間あたりにどれだけ多くの処理を
実行できるか
●
基準値を知る
– 平常時の負荷を継続的に測定、監視する
– ベンチマークで限界値を把握しておく
●
あとどのぐらいで限界に達するのか
●
目標値を設定する
– どこまでのパフォーマンスなら許容範囲なのか
●
そもそもチューニングする必要があるのかどうか。
7. チューニングの対象
●
ハードウェアや OS 等の環境
– CPU 性能、ディスク性能、メモリ容量
– ファイルシステムの種類と設定、カーネルパラメーター
●
サーバーのパラメーター
– 各種バッファサイズ
– 各種ファイルサイズ
– スレッド数等
●
個々のクエリ
– 効率が悪くリソースを多く消費するクエリ
– ロックなどによって他のクエリに影響を与えるクエリ
14. スロークエリログの例
# Time: 2017-06-15T07:19:44.679820Z
# User@Host: msandbox[msandbox] @ localhost [] Id: 3
# Query_time: 0.539501 Lock_time: 0.000229 Rows_sent: 1 Rows_examined: 11351
use world;
SET timestamp=1497511184;
SELECT
COUNT(1)
FROM
CountryLanguage c1
JOIN
Country c2 ON c1.CountryCode = c2.Code
JOIN
(SELECT
City.CountryCode, MAX(Population) Population
FROM
City
GROUP BY City.CountryCode) c3
WHERE
c1.Percentage * c2.Population > c3.Population
...
24. EXPLAIN
●
表形式、あるいは JOSN 形式で実行計画を取得
– 表形式を読み解くにはやや慣れが必要
●
拙著で詳しく解説 ⇒ エキスパートのための MySQL[ 運用
+ 管理 ] トラブルシューティングガイド (2010 年 技術評
論社 )
●
書式
– EXPLAIN [EXTENDED|PARTITONS|FORMAT=JSON] SELECT …
– MySQL 5.7 では EXTENDED かつ PARTITIONS が常時有効
32. パフォーマンススキーマ
vs 情報スキーマ
パフォーマンススキーマ 情報スキーマ
主目的 パフォーマンスデータの取得 メタデータの取得
アプリケーション パフォーマンスチューニング 監視ツールや管理ツール
導入されたバージョン 5.5 5.1
SQL 標準? いいえ はい
実装方法 ストレージエンジンのひとつ 情報スキーマ API
データ収集のタイミング mysqld 内部で任意のタイミ
ングでコード実行時
情報スキーマテーブルアクセ
ス時
通常時のオーバーヘッド あり なし
表示によるオーバーヘッド 少ない 大きい
類似のツール DTrace, SystemTap SHOW コマンド
35. まだスロークエリログで
消耗してるの?
●
スロークエリログの制限事項
– 実行時間が long_query_time 未満のクエリは記録されない
●
微妙だけど大量に実行されるクエリを見過ごす恐れ
– 集計には mysqldumpslow を実行する必要あり
●
面倒!!
●
ヒューマン・リーダブル・フォーマット=加工が面倒
●
ダイジェスト・サマリテーブル登場!!
– MySQL 5.6 で追加
– クエリの種類ごとに行数や実行時間をカウント
– mysqldunpslow の結果相当をテーブルから取得
●
加工やモニタリングが容易
– performance_schema.events_statements_summary_by_digest
36. ダイジェストとは
●
クエリを識別する md5 ハッシュ
– パーサーによって構文解析の過程で生成される
– クエリをコンパクトな形式に変換してからハッシュ値を計算
●
コンパクトな形式はダイジェスストレージと呼ばれる
●
可読な形式であるダイジェストテキストに変換可能
●
ダイジェストストレージの生成
– トークン ⇒ 2 バイト
– リテラル ⇒ トークンと同じ
●
IN の中身はひとつにおまとめ
– 識別子 ⇒ 2バイトのヘッダ+識別子名
37. ダイジェスト・サマリテーブルの例
*************************** 3. row ***************************
SCHEMA_NAME: world
DIGEST: aa4f0c22e7b99148cb31e2b80aef14e1
DIGEST_TEXT: SELECT COUNT (?) FROM (以下略)
COUNT_STAR: 14
SUM_TIMER_WAIT: 7558222784000
MIN_TIMER_WAIT: 534298792000
AVG_TIMER_WAIT: 539873056000
MAX_TIMER_WAIT: 545839254000
SUM_LOCK_TIME: 3266000000
SUM_ERRORS: 0
SUM_WARNINGS: 0
SUM_ROWS_AFFECTED: 0
SUM_ROWS_SENT: 14
SUM_ROWS_EXAMINED: 158914
・・・つづく・・・
40. InnoDB の情報スキーマ
●
InnoDB Plugin 以降情報スキーマが追加された
INNODB_SYS_TABLES
INNODB_SYS_FIELDS
INNODB_CMP_PER_INDEX_RESET
INNODB_BUFFER_PAGE
INNODB_FT_DEFAULT_STOPWORD
INNODB_FT_INDEX_TABLE
INNODB_FT_INDEX_CACHE
INNODB_SYS_TABLESPACES
INNODB_METRICS
INNODB_SYS_FOREIGN_COLS
INNODB_CMPMEM
INNODB_BUFFER_POOL_STATS
INNODB_SYS_COLUMNS
INNODB_SYS_FOREIGN
INNODB_SYS_TABLESTATS
INNODB_LOCKS
INNODB_TRX
INNODB_SYS_DATAFILES
INNODB_FT_CONFIG
INNODB_SYS_VIRTUAL
INNODB_CMP
INNODB_FT_BEING_DELETED
INNODB_CMP_RESET
INNODB_CMP_PER_INDEX
INNODB_CMPMEM_RESET
INNODB_FT_DELETED
INNODB_BUFFER_PAGE_LRU
INNODB_LOCK_WAITS
INNODB_TEMP_TABLE_INFO
INNODB_SYS_INDEXES
41. InnoDB Metrics テーブル
●
information_schema.INNODB_METRICS
– InnoDB 内部の情報を採取する情報スキーマ
●
種々の統計情報を記録
– InnoDB Metrics でしか採取できないもの有り
●
ページの種類ごとの IO 統計、パージの統計など
– 採取する情報の意味は COMMENT カラムに説明あり
●
デフォルトでは一部のみが有効化
– 有効化コマンド例
– UPDATE INNODB_METRICS SET status='enabled'
WHERE SUBSYSTEM='transaction';
InnoDB で性能問題が出たら
とりあえず使ってみる価値あり!!
42. Good bye Old InnoDB Monitors!
●
InnoDB テーブルモニター
– INNODB_SYS_TABLES
●
InnoDB テーブルスペースモニター
– INNODB_SYS_TABLESPACES
●
InnoDB ロックモニター
– INNODB_LOCKS/INNODB_LOCK_WAITS
●
http://d.hatena.ne.jp/sh2/20090618
– sys.innodb_lock_waits
45. 代表的な sys スキーマのビュー
●
metrics … ステータス情報をまとめたもの
●
innodb_lock_waits … ロック解析
●
io_% … IO 統計情報
●
memory_% … メモリ割り当てに関する統計情報
●
statement_analysis … ダイジェストサマリテーブル相当
●
statements_with_temp_tables … テンポラリテーブルを使用し
たクエリの一覧
●
user_summary … ユーザーごとの統計情報
●
host_summary … ホストごとの統計情報
46. sys.diagnostics()
●
稼働中の MySQL サーバーの様々な情報を一括で採取
– サポートへデータを送るときに便利
– 週ごとなど、定期的に収集することで変化を追いかけられ
る
●
各種ステータス情報の採取
– 一定時間ごとにステータスを採取し、差分を計算
– 問題のあるときと平常時を比べるのに役立つ
mysql> CALL sys.diagnostics(1,1, 'full');
mysql> CALL sys.diagnostics(600,60,'current');
51. InnoDB
●
UNDO ログの自動縮退
– innodb_max_undo_log_size = 1G
– innodb_undo_tablespaces = 16
●
REDO ログの Read on Write 防止
– innodb_log_write_ahead_size = ファイルシステムのブロックサ
イズ(上限は innodb_page_size )
●
NUMA 対策
– innodb_numa_interleave = ON
●
パージスレッドの複数可
– innodb_purge_threads = 16
52. レプリケーション
●
マルチスレッドスレーブ
– slave_parallel_workers = 128
– slave_parallel_type = LOGICAL_CLOCK
– slave_preserve_commit_order = 1
– log_bin=mysql-log
– log_slave_updates=1
●
クラッシュセーフなスレーブ
– relay_log_info_repository=TABLE
– relay_log_recovery=ON
– relay_log_purge=ON
●
バイナリログへのグループコミットのスループット向上
– binlog_group_commit_sync_delay = 2500
– binlog_group_commit_sync_no_delay_count = 256
55. 宣伝: 「詳解 MySQL 5.7 」
●
MySQL 5.7 の新機能を網羅
– 175 もの新機能を解説
– 新機能の理解に欠かせ
ないアーキテクチャの話
も盛りだくさん
– MySQL の実装について詳
しくなれる!!