q4m の configure のオプションによる速度の違い
q4m の configure のオプション変更によってどの程度パフォーマンスに違いが出るのか比較してみた。
Intel(R) Xeon(TM) CPU 2.80GHz x 4 CPU
OS : Debian(Etch)
まずは、default 状態。
./configure --with-mysql=/home/kameid/mysql-5.1.30/ --prefix=/usr/local/mysql
暗黙的に、以下のオプションを指定していることになる。
--with-sync=yes commit to disk at checkpoints (default)
--with-delete=pwrite use pwrite for row deletions (default)
t/05-multireader..........................ok 1/4 Multireader benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 3.991 seconds Throughput: 1603.607 mess./sec. t/05-multireader..........................ok t/05-multirw..............................ok 1/4 Multi-reader-writer benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 10.419 seconds Throughput: 614.243 mess./sec. t/05-multirw..............................ok t/05-multiwait............................ok 1/4 Multi-reader-writer benchmark result under semi-starvation: Number of messages: 6400 Number of readers: 32 Elapsed: 19.429 seconds Throughput: 329.396 mess./sec.
with-sync=no を指定。
./configure --with-mysql=/home/ts-dkamei/mysql-5.1.30/ --prefix=/usr/local/mysql --with-sync=no
t/05-multireader..........................ok 1/4 Multireader benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 1.451 seconds Throughput: 4409.365 mess./sec. t/05-multireader..........................ok t/05-multirw..............................ok 1/4 Multi-reader-writer benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 1.620 seconds Throughput: 3950.522 mess./sec. t/05-multirw..............................ok t/05-multiwait............................ok 1/4 Multi-reader-writer benchmark result under semi-starvation: Number of messages: 6400 Number of readers: 32 Elapsed: 2.544 seconds Throughput: 2515.237 mess./sec.
delete=msync を指定。
./configure --with-mysql=/home/ts-dkamei/mysql-5.1.30/ --prefix=/usr/local/mysql --with-delete=msync
t/05-multireader..........................ok 1/4 Multireader benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 2.897 seconds Throughput: 2208.953 mess./sec. t/05-multireader..........................ok t/05-multirw..............................ok 1/4 Multi-reader-writer benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 11.628 seconds Throughput: 550.380 mess./sec. t/05-multirw..............................ok t/05-multiwait............................ok 1/4 Multi-reader-writer benchmark result under semi-starvation: Number of messages: 6400 Number of readers: 32 Elapsed: 19.676 seconds Throughput: 325.266 mess./sec.
./configure --with-mysql=/home/ts-dkamei/mysql-5.1.30/ --prefix=/usr/local/mysql --with-sync=no --with-delete=msync
t/05-multireader..........................ok 1/4 Multireader benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 1.371 seconds Throughput: 4669.161 mess./sec. t/05-multireader..........................ok t/05-multirw..............................ok 1/4 Multi-reader-writer benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 1.410 seconds Throughput: 4540.192 mess./sec. t/05-multirw..............................ok t/05-multiwait............................ok 1/4 Multi-reader-writer benchmark result under semi-starvation: Number of messages: 6400 Number of readers: 32 Elapsed: 2.486 seconds Throughput: 2574.933 mess./sec.
./configure --with-mysql=/home/ts-dkamei/mysql-5.1.30/ --prefix=/usr/local/mysql --enable-mmap-writes=yes
t/05-multireader..........................ok 1/4 Multireader benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 4.008 seconds Throughput: 1596.810 mess./sec. t/05-multireader..........................ok t/05-multirw..............................ok 1/4 Multi-reader-writer benchmark result: Number of messages: 6400 Number of readers: 32 Elapsed: 12.476 seconds Throughput: 512.998 mess./sec. t/05-multirw..............................ok t/05-multiwait............................ok 1/4 Multi-reader-writer benchmark result under semi-starvation: Number of messages: 6400 Number of readers: 32 Elapsed: 18.725 seconds Throughput: 341.785 mess./sec.
Multireader | multirw | multiwait | |
with-sync=yes,with-delete=pwrite | 1603 | 614 | 329 |
with-sync=no,with-delete=pwrite | 4409 | 3950 | 2515 |
with-sync=yes,with-delete=msync | 2208 | 550 | 325 |
with-sync=no,with-delete=msync | 4669 | 4540 | 2574 |
enable-mmap-writes=yes | 1596 | 512 | 341 |
この結果によると、とりあえず、
./configure --with-mysql=/home/ts-dkamei/mysql-5.1.30/ --prefix=/usr/local/mysql --with-sync=no --with-delete=msync
にしとけ、という感じになりそうだが、with-sync=no にすることで、コミット時にHDDに物理的にデータが書き込みされるとは限らなくなるため、大幅に速度がUPしているのである。障害発生時のことを考えると、微妙なところだろう。
delete 時 pwrite か msync か、というのはそれほど影響は無い様だが、とりあえず、msync にしとけばいいだろという数字。enable-mmap-writes=yes は意味が無いことの確認。32bit 版の OS を使用しているので。
まあ、本場環境では 64bit 版にしてもらおう。*1
ちなみに、以下の条件だともっといい数字が出ている。(C クライアントを使った場合)
# USE_C_CLIENT=1 MESSAGES=400000 CONCURRENCY=40 DBI='dbi:mysql:test;mysql_socket=/tmp/mysql.sock;user=root;password=mysql' t/05-multireader.t 1..4 ok 1 - check number of messages ok 2 - min value of received message ok 3 - max value of received message ok 4 - should have no rows in table Multireader benchmark result: Number of messages: 400000 Number of readers: 40 Elapsed: 23.972 seconds Throughput: 16686.444 mess./sec.
クライアントを C 版にするだけで3倍くらいのパフォーマンスになる模様。同じ条件で、perl 版クライアントを使った場合は、4970.574 mess./secだった。