32
MySQL 初めてのチューニング 2010/12/11 MySQL Casual Talks #1 id:Craftworks

MySQL 初めてのチューニング

Embed Size (px)

DESCRIPTION

MySQL Casual Talks #1 発表資料 http://atnd.org/events/9803

Citation preview

Page 1: MySQL 初めてのチューニング

MySQL初めてのチューニング

2010/12/11 MySQL Casual Talks #1

id:Craftworks

Page 2: MySQL 初めてのチューニング

自己紹介

• id:Craftworks

• Twitter: @Craftworks

• github: https://github.com/Craftworks

• Blog: http://d.hatena.ne.jp/Craftworks

• 最近は EC2で Perl書いてます

• ずっと PostgreSQLを使っていたMySQL初心者です

Page 3: MySQL 初めてのチューニング

今日はMySQLをセットアップしてから最初にするチューニングの話をします

Page 4: MySQL 初めてのチューニング

MySQLのメモリ設定

MySQLのバッファタイプは2種類

グローバルバッファ• mysqld全体で確保するメモリ

スレッドバッファ•コネクション毎に確保するメモリ

Page 5: MySQL 初めてのチューニング

グローバルバッファ

Page 6: MySQL 初めてのチューニング

innodb_buffer_pool_size– InnoDBのインデックスやレコードをキャッシュする領域

– InnoDB メインで使うなら最重要パラメータ

Page 7: MySQL 初めてのチューニング

innodb_additional_mem_pool_size– InnoDBテーブル定義情報

–足りなくなったらエラーログに警告が出る

–足りなくなった時に増やせばよい

Page 8: MySQL 初めてのチューニング

innodb_log_buffer_size– InnoDB トランザクションログを管理する領域

–トランザクション終了時もしくは一定時間毎にディスクにフラッシュされる

–他のパラメータにメモリを回した方が得策

Page 9: MySQL 初めてのチューニング

key_buffer_size–MyISAMのインデックスをキャッシュする領域

–MyISAMをあまり使わないなら他に回す

Page 10: MySQL 初めてのチューニング

query_cache_size– SELECTの実行結果をキャッシュする

–パフォーマンス的にはかなり重要

–query_cache_typeでキャッシュ動作を指定できる

Page 11: MySQL 初めてのチューニング

スレッドバッファ

Page 12: MySQL 初めてのチューニング

sort_buffer_size–ORDER BY, GROUP BY に使われる領域

–多用する場合は増やす

read_rnd_buffer_size–ソート後にレコードを読む際に使用

–ORDER BYの性能向上

Page 13: MySQL 初めてのチューニング

join_buffer_size

–インデックスを使用しないテーブル結合の際に使われる領域

–インデックスを用いないテーブル結合は避けるべきなので大きくする必要は無い

Page 14: MySQL 初めてのチューニング

read_buffer_size–テーブルスキャンのときに使われる領域

–インデックスを使わないクエリは発行するべきではないので大きくする必要は無い

Page 15: MySQL 初めてのチューニング

myisam_sort_buffer_size–MyISAMで DDL系のクエリの時にインデックスのソートに使われる領域

–通常のクエリでは使われないのでそれほど多く取る必要は無い

Page 16: MySQL 初めてのチューニング

メモリ以外の設定

Page 17: MySQL 初めてのチューニング

innodb_log_file_size– InnoDBの更新ログを記録するディスク上のファイル

– innodb_log_fileがいっぱいになったら、innodb_buffer_poolの中の更新されたデータをディスクに書き出し

– innodb_buffer_pool_sizeを大きくしたらinnodb_log_file_sizeも合わせて調整

–大きくするほどクラッシュリカバリに時間がかかる

Page 18: MySQL 初めてのチューニング

table_open_cache

–開いたテーブルのファイルポインタを格納する

–同時接続数×テーブル数が最低限必要

–1024〜2048が一般的

–MyISAMでは1テーブルにつき2つ消費

–OSが処理できる記述子数以内にする• cat /proc/sys/fs/file-max

Page 19: MySQL 初めてのチューニング

thread_cache_size

–スレッドをキャッシュして再接続のオーバーヘッドを軽減する

–稼働状況に応じて設定する

–コネクションプーリングしてる場合はあまり影響が無い?

Page 20: MySQL 初めてのチューニング

以上を考慮して実際の設定

Page 21: MySQL 初めてのチューニング

設定の目安

グローバルバッファ

+ (スレッドバッファ×最大接続数)

=搭載メモリの 8~ 9割

警告: 32-bit GNU/Linux x86 上では、メモリ使用を高く設定しすぎないように注意してください。glibcはプロセスヒープがスレッドスタックよりも大きくなる事を許容する可

能性があり、その為サーバがクラッシュしてしまうかもしれません。もし次の式の値が2GB に近い、またはそれを上回っていたら危険です:

innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB

Page 22: MySQL 初めてのチューニング

設定メモリ量の計算

• 個々の設定を計算するのは面倒臭い

–ツールがあります

– mymemcheck

– !includedirに対応したものを githubに置きました

– https://gist.github.com/733390

– mysql -e 'SHOW VARIABLES' | mymemcheck

– mymemcheck ~/my.cnf

Page 23: MySQL 初めてのチューニング

実行結果抜粋

global_buffers

key_buffer_size 16777216 16.000M

innodb_buffer_pool_size 268435456 256.000M

innodb_log_buffer_size 67108864 64.000M

innodb_additional_mem_pool_size 20971520 20.000M

net_buffer_length 16384 16.000K

---------------------------------------------------

total 356.016M

Page 24: MySQL 初めてのチューニング

運用後のチューニング

Page 25: MySQL 初めてのチューニング

key_buffer_sizeの調整

• SHOW STATUS LIKE 'Key_read%';

– Key_read_requests / Key_reads = 150 以上になるように key_buffer_sizeを調整

• SHOW STATUS LIKE 'Key_blocks%';

– Key_blocks_unusedが数百など少ない場合key_buffer_sizeを増やす必要がある。

Page 26: MySQL 初めてのチューニング

最大接続数とスレッド数の確認

• SHOW STATUS LIKE '%connection%';– Max_used_connections

• これまでに記録された同時接続数の最大値

• SHOW STATUS LIKE 'Threads%';– Threads_connected

• 現在開いている接続の数

– Threads_created• 接続を処理するために生成されたスレッド数

– Threads_running• スリープ状態になっていないスレッド数

Page 27: MySQL 初めてのチューニング

table_open_cacheの調整

• SHOW STATUS LIKE 'Open_tables';

– Open_tables

• 現在開かれているテーブル数を確認

– Opened_tables

• たとえ多くの FLUSH TABLES を実行していない場合でも、

この値が非常に大きい場合や急速に大きくなる場合は、テーブルキャッシュサイズを拡張する

Page 28: MySQL 初めてのチューニング

query_cache_sizeの調整

• SHOW STATUS LIKE 'Qcache%';– Qcache_free_memory

• query_cache_sizeで割り当てたメモリ残量

• これが小さくなって、Qcache_lowmem_prunesが増加していたら、query_cache_sizeの増量を検討

– Qcache_inserts / Qcache_hits• Qcache_insertsに対して Qcache_hitsが少ないとキャッシュのヒット率が悪い

– Qcache_free_blocks• 増加している場合→ フラグメンテーション発生

– FLUSH QUERY CACHEでデフラグする必要がある

Page 29: MySQL 初めてのチューニング

クエリキャッシュの注意点

クエリキャッシュはケースセンシティブ

SELECT … と select …は別クエリ扱い

Page 30: MySQL 初めてのチューニング

まとめ

• 最大限のパフォーマンスを発揮できるように、なるべく多くのメモリを割り当てる

• かつ、コネクションが増えた時にメモリを食い過ぎてスワップが発生しないように、安全なラインに設定する

• 運用しながら SHOW STATUSで値を確認しながらチューニングする

Page 31: MySQL 初めてのチューニング

参考

• 6.5.5. MySQLでのメモリの使用– http://dev.mysql.com/doc/refman/5.1/ja/memory-use.html

• 9.3. InnoDBスタートアップオプションとシステム変数– http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-parameters.html

• 4.13.3. クエリキャッシュの設定– http://dev.mysql.com/doc/refman/5.1/ja/query-cache-configuration.html

• 6.4.8. MySQLでのテーブルのオープンとクローズの方法– http://dev.mysql.com/doc/refman/5.1/ja/table-cache.html

• 13.5.3. InnoDB設定– http://dev.mysql.com/doc/refman/5.1/ja/innodb-configuration.html

• 5分でできる、MySQLのメモリ関係のチューニング!– http://dsas.blog.klab.org/archives/50860867.html

Page 32: MySQL 初めてのチューニング

ご清聴ありがとうございました