LinodeでInnoDBチューニング

概要

前回(今朝)の記事で使用したmy.cnfでMySQL Benchmark Suiteのinsertに関するベンチマークをとってみました。
今回はinnodb_buffer_pool_sizeとinnodb_log_buffer_sizeを変更してみたらどれだけ数値が変わるのかを見てみる試みです。

my.cnf

前回の記事で紹介したmy.cnfです。何度も言いますが下記サイトを参考にしています。

http://d.hatena.ne.jp/sh2/20100415

[mysqld]
character_set_server = utf8
collation_server = utf8_general_ci

#transaction_isolation = READ-COMMITTED

ignore-builtin-innodb
plugin-load = innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_reset=ha_innodb_plugin.so

default_storage_engine = InnoDB
innodb_file_per_table = 1
innodb_flush_log_at_trx_commit = 1
innodb_buffer_pool_size = 4M
innodb_log_buffer_size = 1M
#innodb_log_file_size = 128M

#server_id = 1
#log_bin = mysql-bin
#binlog_format = MIXED
#binlog_cache_size = 128K
#sync_binlog = 1

slow_query_log = 1
long_query_time = 0.1

query_cache_type = 1
query_cache_size = 1M

key_buffer_size = 512K
sort_buffer_size = 512K
read_buffer_size = 128K

max_allowed_packet = 16M
max_connections = 64
thread_cache_size = 8
table_open_cache = 4096

[client]
default_character_set = utf8
port        = 3306
socket      = /var/lib/mysql/mysql.sock

これを次のようにパラメータを変更してみます。

innodb_buffer_pool_size = 4M
innodb_log_buffer_size = 1M
innodb_buffer_pool_size = 80M
innodb_log_buffer_size = 20M
innodb_buffer_pool_size = 160M
innodb_log_buffer_size = 40M

test-insert

Generating random keys
innodb_buffer_pool_size Time for insert (300000)
4M 126 wallclock secs ( 0.70 usr 15.02 sys + 0.00 cusr 0.00 csys = 15.72 CPU)
80M 113 wallclock secs ( 6.50 usr 9.75 sys + 0.00 cusr 0.00 csys = 16.25 CPU)
160M 115 wallclock secs ( 0.69 usr 15.01 sys + 0.00 cusr 0.00 csys = 15.70 CPU)
Testing insert of duplicates
innodb_buffer_pool_size Time for insert_duplicates (100000)
4M 20 wallclock secs ( 3.68 usr 1.95 sys + 0.00 cusr 0.00 csys = 5.63 CPU)
80M 16 wallclock secs ( 2.30 usr 3.38 sys + 0.00 cusr 0.00 csys = 5.68 CPU)
160M 16 wallclock secs ( 3.22 usr 2.12 sys + 0.00 cusr 0.00 csys = 5.34 CPU)
Test of prepared+execute/once prepared many execute selects
innodb_buffer_pool_size Time for prepared_select (100000)
4M 35 wallclock secs (11.74 usr 1.79 sys + 0.00 cusr 0.00 csys = 13.53 CPU)
80M 32 wallclock secs ( 9.81 usr 3.57 sys + 0.00 cusr 0.00 csys = 13.38 CPU)
160M 31 wallclock secs (11.23 usr 1.74 sys + 0.00 cusr 0.00 csys = 12.97 CPU)
innodb_buffer_pool_size Time for once_prepared_select (100000)
4M 31 wallclock secs ( 5.56 usr 3.25 sys + 0.00 cusr 0.00 csys = 8.81 CPU)
80M 26 wallclock secs ( 5.00 usr 3.49 sys + 0.00 cusr 0.00 csys = 8.49 CPU)
160M 26 wallclock secs ( 5.36 usr 3.25 sys + 0.00 cusr 0.00 csys = 8.61 CPU)
Retrieving data from the table
innodb_buffer_pool_size Time for select_big (10:3000000)
4M 12 wallclock secs (10.97 usr 0.00 sys + 0.00 cusr 0.00 csys = 10.97 CPU)
80M 12 wallclock secs (10.18 usr 0.25 sys + 0.00 cusr 0.00 csys = 10.43 CPU)
160M 11 wallclock secs (10.69 usr 0.00 sys + 0.00 cusr 0.00 csys = 10.69 CPU)
innodb_buffer_pool_size Time for order_by_big_key (10:3000000)
4M 13 wallclock secs (10.84 usr 0.00 sys + 0.00 cusr 0.00 csys = 10.84 CPU)
80M 12 wallclock secs (10.14 usr 0.28 sys + 0.00 cusr 0.00 csys = 10.42 CPU)
160M 12 wallclock secs (10.48 usr 0.00 sys + 0.00 cusr 0.00 csys = 10.48 CPU)
Insert into table with 16 keys and with a primary key with 16 parts
innodb_buffer_pool_size Time for insert_key (100000)
4M 1410 wallclock secs ( 0.00 usr 7.80 sys + 0.00 cusr 0.00 csys = 7.80 CPU)
80M 517 wallclock secs ( 0.00 usr 7.24 sys + 0.00 cusr 0.00 csys = 7.24 CPU)
160M 357 wallclock secs ( 0.00 usr 6.81 sys + 0.00 cusr 0.00 csys = 6.81 CPU)
Testing update of keys
innodb_buffer_pool_size Time for update_of_primary_key_many_keys (256)
4M 6541 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
80M 2339 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
160M 1179 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
Deleting everything from table
innodb_buffer_pool_size Time for delete_big_many_keys (128)
4M -
80M 1262 wallclock secs ( 0.00 usr 0.01 sys + 0.00 cusr 0.00 csys = 0.01 CPU)
160M 360 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
innodb_buffer_pool_size Time for delete_all_many_keys (1)
4M 4410 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
80M 1262 wallclock secs ( 0.00 usr 0.01 sys + 0.00 cusr 0.00 csys = 0.01 CPU)
160M 361 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)

まとめ

あまりにも項目が多いので途中から大きな差がついているところだけ抜き出しました。
専用DBサーバなどの場合、innodb_buffer_pool_sizeはメモリの80%を割り当てるべきだという話を聞いていましたがupdateで大変な差がついています。

ただDeleteでも大きく差がついていた事が意外でしたがこれはインデックスに対しても変更が必要になるので負荷が高いのか、innodb_buffer_pool_sizeはそれを改善する事ができるとかでしょうかね。

なんだか面白くなってきたのでしばらくパラメータをいじって遊んでみます。

宣伝

Linodeで遊んでみたくなった方はこちらをどうぞ

http://linode.jp