Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MySQLパフォーマンスチューニングの基本ー実際のトラブルシュートから my.cnf までー/MySQL_Performance_Tuning_Basics_in_OSC_Niigata

mamy1326
November 10, 2018

MySQLパフォーマンスチューニングの基本ー実際のトラブルシュートから my.cnf までー/MySQL_Performance_Tuning_Basics_in_OSC_Niigata

2018年11月10日(土) にOSC新潟でお話しする
MySQLパフォーマンスチューニングの基本
 ー実際のトラブルシュートから my.cnf までー
の登壇資料です

mamy1326

November 10, 2018
Tweet

More Decks by mamy1326

Other Decks in Programming

Transcript

  1. 自己紹介 Name :まみやなおき Twitter:@mamy1326(まみー)  ✔ 普段は PHPer  ✔ 2017年 MySQL

    が趣味  ✔ 2018年 DNSとネットワーク が趣味  ✔ 奥さまの旦那、娘のおとーちゃん u2
  2. 前提条件 MySQL 5.5 系 (お話は5.7準拠) メモリ 8 GB ストレージ 20

    GB サーバ MySQL on EC2 (AWS) 時期 2017年1月 u4
  3. 承:状況把握、診断 診断:MySQL Tuner を使う ・ チューニングポイントの 診断   →my.cnfに何が不足かを抽出 ・ GNU

    GPL なので無償利用可能   →Perlのアプリケーション ・ インストールして すぐ使える   →設定不要!(GitHubから取得) u17
  4. 承:状況把握、診断 MySQL Tuner 利用方法 $ wget -O mysqltuner.zip https://github.com/ rackerhacker/MySQLTuner-perl/archive/

    master.zip $ unzip mysqltuner.zip $ cd MySQLTuner-perl-master $ chmod 755 mysqltuner.pl $ perl mysqltuner.pl --user root — pass='mamy1326' u18
  5. 承:状況把握、診断 MySQL Tuner 診断結果 (全体) -------- Recommendations ----------------------------- General recommendations:

    Enable the slow query log to troubleshoot badqueries Set thread_cache_size to 4 as a starting value Variables to adjust: query_cache_size (>= 8M) thread_cache_size (start at 4) innodb_file_per_table=ON innodb_buffer_pool_size (>= 12G) if possible. innodb_log_file_size should be equals to 1/4 of buffer pool size (=128M) if possible. u19
  6. 承:状況把握、診断 MySQL Tuner 診断結果 ① Enable the slow query log

    to troubleshoot bad queries ✔ スロークエリ出力設定を有効にして… ✔ クエリのトラブルシュートをしよう u20
  7. MySQL Tuner 診断結果 ④ innodb_buffer_pool_size (>= 12G) if possible. ✔

    データとindexを キャッシュ に載せよう ✔ 物理メモリの 7〜8割 が基準 u23 承:状況把握、診断
  8. MySQL Tuner 診断結果 ⑤ innodb_log_file_size should be equals to 1/4

    of buffer pool ✔ InnoDBログファイルのサイズ ✔ バッファプールの 4分の1 に設定しよう u24 承:状況把握、診断
  9. 転:my.cnf 設定と解説 共有領域とは ・ 実データ を 1ファイル で扱う   →/var/lib/mysql/ibdata1 ・

    ファイルサイズが増え続ける   →削除領域は減らず、再利用される u30
  10. 承:状況把握、仮説、診断 ・ ファイルディスクリプタ使用増加   →HDD -> SSD で性能向上   →問題あれば他の技術を検討 ・ 大きな削除はロックの可能性

      →DROP TABLE, TRUNCATEに限る   →計画的に削除すべき ・ 5.6.6 からデフォルトである テーブル個別領域のデメリット u36
  11. u40

  12. 転:my.cnf 設定と解説 SELECT の動き ・ バッファプール を見る   →メモリから取ろうとする ・ なければ

    実データ を読む   →ディスクI/Oが発生する ・ その後バッファプールに載せる   →データから吸い上げてくれる u43
  13. 転:my.cnf 設定と解説 INSERT, UPDATE, DELETE の動き ・ バッファプール に書く   →空きがなければ、古いページを押し出す

    ・ その後、ログファイル に書く   →commit反映待ちのログへ ・ 実データファイルへ書く   →実データ+ログで完全なデータ u44
  14. 転:my.cnf 設定と解説 DROP TABLE の動き ・ バッファプール から削除   →テーブル全てのページ ・

    その後、ログファイル に書く   →commit反映待ちのログへ ・ 実データファイルを削除   →順番は更新系と同じ u45
  15. バッファプール ・設定内容 設定のポイント ・ メモリ 8G の 75% = 6G

    ・ mysql再起動 で反映される ・ 割り当て状況を監視して運用を [mysqld] innodb_buffer_pool_size=6G u48
  16. 転:my.cnf 設定と解説 大まかな commit時 の動き バッファ プールへ 書き込み InnoDB ログへ

    書き込み 実ファイル へ 書き込み u53 プロセスの処理はここまで 非同期書き込み
  17. my.cnf 設定・反映手順 ① DBへのアクセスを停止 ② dump取得 ③ 更新後の my.cnf に差し替え

    ④ MySQL 再起動 ⑤ バックアップからリストア ⑥ 動作検証・経過観察 u61
  18. 結:設定結果のパフォーマンス ✔ 秒間 1000 アクセス 達成 ✔ ストレージ 圧迫解消 ✔

    バッファプールとログで 高速化 ✔ スロークエリ 可視化・撲滅 ✔ サービスと事業が 軌道に my.cnf チューニング 総評 u63
  19. u74