LinodeでInnoDBチューニング(3)

概要

innodb_log_buffer_sizeをlog fileのサイズと勘違いしていた事が発覚したので修正したら、過去の記事とは違うベンチマークがでました。

前回までのベンチはinnodb_buffer_pool_sizeを大きくしていったものでしたが、それに合わせてログファイルを大きくしてみようとしました、が

実際に大きくしてたのはinnodb_log_buffer_sizeだったという。改めてベンチを取りなおしました。

360MB(560MBのVPS)でmysqldのメモリはtopで見たところ82%ほどまで使われるようになりましたが、420MB以上にしてもメモリ使用量は向上せずに、かえって速度低下を招いてしまったようです。

ひとまずinnodb_buffer_pool_sizeは360MBにして、他のパラメータをいじってみようかと思います。

ふと思ったのは、XenなのでHDDが物理的に1個とかで複数のユーザーが同じサーバー上でサービスを使用していて、それで正しく計測できてない、とかなにか事情があるのかなー。

ただ、そうするとこんなにベンチやっててI/Oを消費するユーザーがいると他の人困るからやっぱHDDは物理的に分けてると思うんですけど、どうなんだろう。xenに詳しい人教えて下さい。

来週会社で聞くとしますか。

my.cnf

[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 = 360M ## 300MB, 360MB, 420MBを試す
innodb_log_buffer_size = 8M
#innodb_log_file_size = 128M

#innodb_flush_method=O_DIRECT

#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

MySQL Benchmark Suite実行結

負荷の高いものだけ抜粋

sudo ./test-insert --user=root --password=XXXX
Insert into table with 16 keys and with a primary key with 16 parts
innodb_buffer_pool_size Time for insert_key (100000)
300MB 273 wallclock secs ( 0.00 usr 6.75 sys + 0.00 cusr 0.00 csys = 6.75 CPU)
360MB 237 wallclock secs ( 0.00 usr 7.04 sys + 0.00 cusr 0.00 csys = 7.04 CPU)
420MB 348 wallclock secs ( 0.00 usr 7.03 sys + 0.00 cusr 0.00 csys = 7.03 CPU)
480MB 309 wallclock secs ( 0.00 usr 6.86 sys + 0.00 cusr 0.00 csys = 6.86 CPU)
Testing update of keys
innodb_buffer_pool_size Time for update_of_primary_key_many_keys (256)
300MB 861 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
360MB 837 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
420MB 1006 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
480MB 1023 wallclock secs ( 0.00 usr 0.03 sys + 0.00 cusr 0.00 csys = 0.03 CPU)
Deleting everything from table
innodb_buffer_pool_size Time for delete_big_many_keys (128)
300MB 155 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
360MB 158 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
420MB 178 wallclock secs ( 0.00 usr 0.01 sys + 0.00 cusr 0.00 csys = 0.01 CPU)
480MB 210 wallclock secs ( 0.00 usr 0.01 sys + 0.00 cusr 0.00 csys = 0.01 CPU)
innodb_buffer_pool_size Time for delete_all_many_keys (1)
300MB 156 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
360MB 160 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)
420MB 180 wallclock secs ( 0.00 usr 0.01 sys + 0.00 cusr 0.00 csys = 0.01 CPU)
480MB 211 wallclock secs ( 0.00 usr 0.02 sys + 0.00 cusr 0.00 csys = 0.02 CPU)