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だった。

*1:q4m は 64bit 環境を前提に作られている