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

MySQL on IaaSのインスタンスサイズチューニングについて考えてみた

yoku0825
December 03, 2020

MySQL on IaaSのインスタンスサイズチューニングについて考えてみた

2020/11/25 日本MySQLユーザ会会(MyNA会) 2020年11月 https://mysql.connpass.com/event/194600/

yoku0825

December 03, 2020
Tweet

More Decks by yoku0825

Other Decks in Technology

Transcript

  1. TL;DR 大事なことはだいたい @ts4th の資料に書いてある さいきんの InnoDB Adaptive Flushing (仮) ‐

    さいきんのMySQLに関する取り組み(仮) ‐ バッファプール大事 ピンクのおとうふの思考過程を観察するものと思って聞いていただけると幸い 2/46
  2. CPU ここ最近、CPU使用率の %user がボトルネックになった人はいますか? %wait が1桁で純粋に CPUスレッド数 < LoadAverage になってしまうようなボトルネックになり

    方 ‐ 綺麗にInnoDBの限界近くまで行っているパターンと、オンメモリでテンポラリーテーブル/ ソートバッファを使っている場合の2つに大別できる気がする ‐ 綺麗にインデックスをチューニングしていくと、あんまり当たらなくなる(と思 う) 11/46
  3. メモリー 「Linuxの free コマンドで出てくる free + cache ぶんが実質使える」は搭載メモ リーが大きい間は概ね合ってるけどギリギリを攻める場合には間違っている 1日に1回しか参照されないバッファプールのページ

    ( used ) と、毎秒更新される ib_logfile0 のページキャッシュ ( cache ) 、の2択だったらどっちが大事? ‐ swap領域はカナリアの籠、上手く使う swapin/swapout そのものが悪いのではなく、メモリーが足りない兆候を監視を通して感じ取 るためのもの ‐ 大きくしすぎて検知しそびれるとスラッシングで死ぬし ‐ 小さくしすぎて検知しそびれるとOOM Killerが仕事する ‐ 16/46
  4. バッファプールの特徴 1. バッファプールに載っているページの SELECT ではDisk I/Oは発生しない 1-1. バッファプールに載っていないページの SELECT は少なくとも読み取りを発生させる

    場合によっては Write on SELECT で書き込みが発生する ‐ つまり、ヒット率を上げれば上げるほど読み取りI/Oが節約できる 21/46
  5. バッファプールの特徴 2. INSERT, DELETE などバッファプールを使わなくても出来そうな操作も必ずバッ ファプールを介して行う 2-1. バルク操作は案外I/O以外にバッファプールを洗い替えする ‐ 2-2.

    書き込みI/Oが増えるのは分かりやすいとしても、読み取りI/Oも一緒に増えていたりする pt-ioprofile でよく見てみると、実は.ibdファイルからガリガリ読んでいたり ‐ 「バッチとユーザートラフィックがカブると大惨事」に心当たりがあれば、バッ ファプールを増やすのは有効な選択肢 22/46
  6. バッファプールの特徴 3. ダーティーページの.ibdファイルとの同期は page_cleaner_thread の仕事で バックグラウンド page_cleaner_thread をチューニングすると「同期しすぎ」を減らして Write combined

    を狙い やすくなる innodb_adaptive_flushing_lwm, innodb_log_file_size, innodb_page_cleaners, innodb_lru_scan_depth あたり ‐ 「ダーティーページ」は.ibdファイルとの同期が取れてないってだけで、(READ-COMMITTED なら)データとしてはバッファプールから返すものが正しいので、ある程度以上増えても「それ 自体が」問題ではない ‐ 書き込めば書き込むほどすり減っていくSSDとか、IO回数単位で課金されるブロッ クストレージなどでは積極的にチューニングできる 23/46
  7. バッファプールの特徴 4. 欲しいページがバッファプールミスヒット && evictするページがダーティー ページだと、 Write on SELECT が発生する

    「必ずバッファプールに載せなければいけない」 ‐ 「ダーティーページはバッファプールから消す前にflushしないといけない」 ‐ 3. で「ダーティーページそれ自体は問題ない」と言っていたやつの「それ以外」のケース ‐ 3. でチューニングしていたやつが 2. のバルク更新で洗い替えられた後に響いてく るならこれが影響しているかも 24/46
  8. MySQLにおけるメモリーの使い方 innodb_buffer_pool_size temptable_max_ram かつての MIN(heap_table_size, max_tmp_table_size) に相当するようなもの セッション単位ではなくサーバーグローバル(全セッション合算) ‐ ここからこぼれるとTempTable

    on DiskまたはInnoDB Temporaryに落ちる 想像以上にここに全部乗っかった状態(TempTable on Memory)はテンポラリーテーブルでも速い こぼれた途端地獄、とくにTempTable on DiskはI/Oをかなり食おうとする…んだけど、8.0の中でも8.0.18と 8.0.22でなんか違和感を感じてベンチマーク未了 ‐ 忘れちゃいけないページキャッシュ 27/46
  9. MySQLにおけるメモリーの使い方 innodb_buffer_pool_size temptable_max_ram 忘れちゃいけないページキャッシュ innodb_flush_method <> O_DIRECT の場合は.ibdファイルもページキャッシュに載る ‐ InnoDBログ,

    バイナリログは O_DIRECT 設定するようなパラメーターはない、基本ページ キャッシュに載る Percona Serverには innodb_flush_method= ALL_O_DIRECT あるけど 1日に1回しか参照されないバッファプールのページ ( used ) と、毎秒更新される ib_logfile0 のページキャッシュ ( cache ) 、の2択だったらどっちが大事? (再掲) ‐ 28/46
  10. MySQLにおけるメモリーの使い方 innodb_buffer_pool_size temptable_max_ram 忘れちゃいけないページキャッシュ シェルを使ってどうこうするような場合、その分も多少は考慮が必要 バックアップ用の tar, rsync, xtrabackup, ..

    mysqlbinlog でバイナリログをデコードするにも入力元も出力先もきっとページキャッシュを使う ‐ 頻度と相談ではあるけどいざという時身動きができないのも困る、1~2GBは最低欲しい ‐ 29/46
  11. MySQL vs IOPS 「テンポラリーテーブルをストレージに落としたら負け」はまだ現役 かつては tmp_table_size, max_heap_table_size の小さい方 ‐ 今は

    temptable_max_ram ‐ temptable_use_mmap のON/OFFで TempTable on Disk か InnoDB Temporaryを打ち分ける ‐ 36/46
  12. MySQLのネットワークインアウト IN(受信) クエリー本文 ‐ LODA DATA LOCAL INFILE などのデータだけ大量受信するやつ ‐

    OUT(送信) SELECTクエリーの結果セット ‐ レプリカへのバイナリログ転送 ‐ 39/46
  13. ブロックストレージ非独立 / CPU, メモリー, ネットワーク いかにマスター切り替えしながら良い感じのラインを模索していくかになる マスター切り替えの仕組みが整っていないなら、どのみち MySQL on IaaS

    より Managed な方が 良いと思う そもそも「マスター切り替えで非対称な構成」が数少ない MySQL on Iaas の Managed に対するメリット ‐ 物理マシン x NVMeとかだとあんまり気にならないInnoDBバッファプールウォームアップが重 要だったりする ‐ ギリギリの、コップの縁を表面張力で耐えてるみたいな緊張感は体に悪い ギリギリを攻めるのは楽しいけど、ジャンキーにならないように ‐ 43/46
  14. まとめ 大事なことはだいたい @ts4th の資料に書いてある さいきんの InnoDB Adaptive Flushing (仮) ‐

    さいきんのMySQLに関する取り組み(仮) ‐ バッファプール大事 45/46