【コラム】

Yet Another 仕事のツール

51 PostgreSQLとMySQLのベンチマークテスト(1) - pgbench

    鶴田展之  [2005/01/25]

    今回と次回は、データベースを導入する上で、誰しも気になるであろう性能の評価について考えてみたい。つまり、意外と知られていない「ベンチマークテスト」のやり方である。対象とするデータベースは、先頃晴れて8.0がリリースされたPostgreSQLと、世界のデファクトスタンダードにならんとするMySQLの2つ。商用データベースの場合、ベンチマーク結果の公表がライセンス上認められていなかったりするようだが、上記2つのオープンソース・ソフトウェアではそんな心配も要らない。まず今回は、石井達夫氏作のベンチマークツール「pgbench」を使って、PostgreSQL8.0の性能を計測してみよう。なお、例によって使用する環境はメモリ128MBの低速なCeleronマシン。OSはFedora Core 3である。

    データベースのベンチマークテストといっても、その手法は様々だ。一般的に有名なのは「TPC(Transaction Processing Performance Council)」が定義している「TPC-x」というベンチマークだろう。頻繁に目にするのは、物流業務のOLTPを模した「TPC-C」や、大規模な意志決定支援シミュレーションによる性能評価を行う「TPC-H」といったものだが、pgbenchはオフラインバッチ処理的なストレステストを指向する「TPC-B」ベンチマークを参考に開発されたものだ。TPC-B自体は既に"obsolete"、つまり"廃止"扱いになっているが、pgbenchはPostgreSQLの性能を測る際に必ずといっていい程使われている定番のプログラムだ。

    では、早速導入して動かしてみよう。pgbenchはPostgreSQLのソースコードと一緒に配布されているので、あらためて入手する必要はない。ソースツリーのcontrib/pgbenchディレクトリに移動し、データベース管理者(一般的には"postgres"アカウント)の権限でコンパイル、インストールを行うだけで導入できる。

    # su - postgres
    $ cd /usr/local/src/postgresql-x.x.x/contrib/pgbench
    $ make
    $ make install

    導入が済んだら、ベンチマーク用のデータベースを用意しよう。通常通りデータベースを作成し、pgbenchに"-i"オプションを渡して初期化処理を行う。

    $ createdb bench
    $ pgbench -i bench

    これでbenchデータベースにはテストデータが作成され、ベンチマークテストの準備が整った。テストの実行は非常に簡単。pgbenchにデータベース名を渡すだけだ。

    $ pgbench bench

    pgbenchのデフォルトは、クライアント数が1、実行トランザクション数が10に設定されている。つまり、簡単に言えば「1つのクライアントから10個の処理を実行する」ことをシミュレートしてくれるわけだ。そして、結果は以下のように表示される。

    starting vacuum...end.
    transaction type: TPC-B (sort of)
    scaling factor: 1
    number of clients: 1
    number of transactions per client: 10
    number of transactions actually processed: 10/10
    tps = 66.781085 (including connections establishing)
    tps = 72.145908 (excluding connections establishing)

    最後の2行に注目しよう。「tps」は「Transaction Per Second」の頭文字で、1秒あたりに処理可能なトランザクション数を表す。この数値が大きければそれだけ高い性能が発揮できている、ということだ。ついでに一応念のため説明すると、2行あるのは接続の確立に要した時間を含める/含めないの違いである。

    pgbenchは複数クライアントからの接続をシミュレートしたり、処理するトランザクションの数を増やして、より大きな負荷をかけたりといったこともできる。クライアント数は"-c"オプション、各クライアント毎のトランザクション数は"-t"オプションで指定可能だ。以下の例は、10クライアントが50ずつのトランザクションを発行することを想定したテストである。

    $ pgbench -c 10 -t 50 bench
    starting vacuum...end.
    transaction type: TPC-B (sort of)
    scaling factor: 1
    number of clients: 10
    number of transactions per client: 50
    number of transactions actually processed: 500/500
    tps = 98.014827 (including connections establishing)
    tps = 100.302130 (excluding connections establishing)

    TPC-B(というかpgbenchのデフォルト)では、SELECT、INSERT、UPDATEを発行しているが、"-S"オプションを指定することでSELECTのみのテストを行うことも可能だ。PostgreSQLを検索系中心の用途で利用する場合なら、こちらのテスト結果の方が有益だろう。

    $ pgbench -S -c 10 -t 50 bench
    starting vacuum...end.
    transaction type: SELECT only
    scaling factor: 1
    number of clients: 10
    number of transactions per client: 50
    number of transactions actually processed: 500/500
    tps = 501.099412 (including connections establishing)
    tps = 568.546851 (excluding connections establishing)

    次回は同様のテストをMySQLでもやってみることにする。

    新着記事

    特設サイトの情報

      人気記事

      一覧

        イチオシ記事

        新着記事

        特別企画

        マイナビニュースマガジン