2012年10月13日土曜日

MySQLチューニング(MySQLTuner)

MySQLTunerというMySQLをチューニングのアドバイスをしてくれるものがあるらしいので使ってみました!
■gitからのダウンロード用
https://github.com/rackerhacker/MySQLTuner-perl/ mysqltuner.pl を実行するだけ。
# git clone git://github.com/rackerhacker/MySQLTuner-perl.git
# cd MySQLTuner-perl
# perl mysqltuner.pl
■直接ダウンロード用
# wget https://raw.github.com/rackerhacker/MySQLTuner-perl/master/mysqltuner.pl
# chmod +x mysqltuner.pl
# ./mysqltuner.pl
■実行結果
-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    MySQL started within last 24 hours - recommendations may be inaccurate
    Enable the slow query log to troubleshoot bad queries
    Your applications are not closing MySQL connections properly
Variables to adjust:
    query_cache_limit (> 1M, or use smaller result sets)
MySQL started within last 24 hours - recommendations may be inaccurate
MySQLを起動して24時間を経過していいないから正確な判断が出来ない!っていう意味らしいです。

なので、別サーバーのMySQLで試してみると 実行してみる。
./mysqltuner.pl
General recommendations:
    Add skip-innodb to MySQL configuration to disable InnoDB
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
Variables to adjust:
    query_cache_limit (> 2M, or use smaller result sets)
    query_cache_size (> 64M)
    tmp_table_size (> 64M)
    max_heap_table_size (> 64M)
■query_cache_limitの変更
#グローバル変数のquery_cache_limitを確認
mysql> SELECT @@global.query_cache_limit;
+---------------------+
| @@query_cache_limit |
+---------------------+
|             2097152 |
+---------------------+
#6MBに設定
SET GLOBAL query_cache_limit = 6 * 1024 * 1024;
mysql> SELECT @@global.query_cache_limit;
+----------------------------+
| @@global.query_cache_limit |
+----------------------------+
|                    6291456 |
+----------------------------+
■query_cache_sizeの変更
mysql> SELECT @@global.query_cache_size;
+---------------------------+
| @@global.query_cache_size |
+---------------------------+
|                  67108864 |
+---------------------------+

#128MBに設定
mysql> SET GLOBAL query_cache_size = 128 * 1024 * 1024;

mysql> SELECT @@global.query_cache_size;
+---------------------------+
| @@global.query_cache_size |
+---------------------------+
|                 134217728 |
+---------------------------+
■tmp_table_sizeの変更
mysql> SELECT @@global.tmp_table_size;
+-------------------------+
| @@global.tmp_table_size |
+-------------------------+
|                67108864 |
+-------------------------+

#128MBに設定
mysql> SET GLOBAL tmp_table_size = 128 * 1024 * 1024;

mysql> SELECT @@global.tmp_table_size;
+-------------------------+
| @@global.tmp_table_size |
+-------------------------+
|               134217728 |
+-------------------------+
■max_heap_table_sizeの変更
mysql> SELECT @@global.max_heap_table_size;
+------------------------------+
| @@global.max_heap_table_size |
+------------------------------+
|                     67108864 |
+------------------------------+

#128MBに設定
mysql> SET GLOBAL max_heap_table_size = 128 * 1024 * 1024;

mysql> SELECT @@global.max_heap_table_size;
+------------------------------+
| @@global.max_heap_table_size |
+------------------------------+
|                    134217728 |
+------------------------------+
./mysqltuner.pl
-------- Recommendations -----------------------------------------------------
General recommendations:
    Add skip-innodb to MySQL configuration to disable InnoDB
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
Variables to adjust:
    query_cache_limit (> 6M, or use smaller result sets)
    query_cache_size (> 128M)
    tmp_table_size (> 128M)
    max_heap_table_size (> 128M)
面倒になったので・・・一気に次の値に増やしてみる!
mysql> SET GLOBAL query_cache_limit = 32 * 1024 * 1024;
mysql> SET GLOBAL query_cache_size = 256 * 1024 * 1024;
mysql> SET GLOBAL max_heap_table_size = 256 * 1024 * 1024;
mysql> SET GLOBAL tmp_table_size = 256 * 1024 * 1024;
-------- Recommendations -----------------------------------------------------
General recommendations:
    Add skip-innodb to MySQL configuration to disable InnoDB
    Increasing the query_cache size over 128M may reduce performance
    Temporary table size is already large - reduce result set size
    Reduce your SELECT DISTINCT queries without LIMIT clauses
Variables to adjust:
    query_cache_limit (> 32M, or use smaller result sets)
    query_cache_size (> 256M) [see warning above]
max_heap_table_size、tmp_table_sizeは消えたけど、
query_cache_sizeが怒られている・・・?
Increasing the query_cache size over 128M may reduce performance
128Mの上query_cacheサイズを大きくすると、パフォーマンスが低下する場合があります
みたいな事を言われているので、とりあえず、128MBに戻して完了!(`・ω・´)ゞビシッ!!

今までは、グローバル変数として変更しただけなので、
MySQLが再起動されるとリセットされてしまいます。
そのため、my.cnfの方も修正しておくこと。
query_cache_limit = 32M
query_cache_size = 128M
max_heap_table_size = 256M
tmp_table_size = 256M
また、経過を見て確認する! [!!]で始まっているものが修正した方が良いものらしいです。
※結果に「Reduce your overall MySQL memory footprint for system stability 」があったら注意!
「システムの安定化のためには、MySQLが必要とする全メモリを少なくした方がいい」
という意味らしいです。Σ(゚д゚lll)ガーン

他にも色々教えてくれるらしいです!
・Run OPTIMIZE TABLE to defragment tables for better performance
テーブルを最適化をする
mysqlcheck -u root -p --auto-repair --check --optimize --all-databases
参考URL

0 件のコメント:

コメントを投稿