ここでは、OSDL DBT-1 PostgreSQL(ODBC版)について、データサイズ指定を使用した測定を実施するための手順について記述する。
各測定には、オペレーティングシステム/ミドルウェア/負荷ツールがそれぞれ必要であり、各対象に応じてそれぞれを適宜組み合わせて、環境を構築する。
ディストリビューションのデフォルトインストールを想定している。インストールに関してはディストリビューションのインストレーション・マニュアル等に従うこと。
対象ディストリビューション: Red Hat Enterprise Linux AS4.0 Update3
注) DBT-1の測定にはssh、gcc、sysstat、libstdcが必要。PostrgreSQL用には、autoconfが必要(Red Hat Enterprise Linux AS4.0 Update3に付属されているものを使用している)。
カーネルのI/Oスケジューラのパラメータを変更する。カーネルからのI/O要求が割り当てられる期限を設定して応答性を確保、更にディスクへの読み込み要求の優先順位を引き上げてDBの性能効率を上げるため、 /boot/grub/grub.conf の 起動するカーネルの“kernel”で始まる行の最後に“elevator=deadline”を追加する。
kernel /vmlinuz-2.6.9-34.ELsmp ro root=LABEL=/1 rhgb quiet elevator=deadline |
プログラム内部では、スレッド単位にソケットを開くため、1プロセス内で、同時に開くことが出来るファイル数の上限数が少ないと、スレッドを生成してもソケットのオープンに失敗する。そのため、設定ファイル(/etc/security/limis.conf)に以下の定義を追加し、上限を引き上げておく必要がある。
* soft nofile 9216 * hard nofile 9216 |
※“nofile”の記述が無い場合は、上記2行を追加し、記述がある場合は値を修正する。
PostgreSQLが利用する共有メモリの領域を増やして効率を上げるため、カーネルパラメータの共有メモリ(/proc/sys/kernel/shmmax)の値を以下のように変更する。
今回の測定では2GBに設定している。
2147483648 |
appServerがPostgreSQLへDBへ接続する時、セマフォが足りなくなることが考えられるため、カーネルのセマフォ(/proc/sys/kernel/sem)の値を以下のように変更する。
256 32000 100 142 |
PostgreSQLは、ここではソースからインストールする。一般的なインストール方法と異ならないが、ここではPostgreSQLのスーパーユーザ名などを以下で指定している。手順は以下の通りである。
今回の測定開始時点で使用したバージョンは、8.1.3であったため、これを使用する。
入手元:http://www.postgresql.org/
rootユーザで、PostgreSQLの所有者兼実行者となるLinuxユーザとして、pgsqlユーザとpgsqlグループを作成する。
# groupadd pgsql # useradd pgsql -g pgsql |
rootユーザでPostgreSQLのソースコードアーカイブを展開するディレクトリと、PostgreSQLをインストールするディレクトリを作成して、ディレクトリの所有者をpgsqlユーザにする。
# mkdir /usr/local/src/postgresql-8.1.3 # chown pgsql /usr/local/src/postgresql-8.1.3 # mkdir /usr/local/pgsql # chown pgsql /usr/local/pgsql |
pgsqlユーザで、PostgreSQLのソースコードアーカイブを展開し、展開したディレクトリに移動する。PostgreSQLのソースコードアーカイブは、/tmpディレクトリにあるものとする。
# su - pgsql $ cd /usr/local/src $ tar zxvf /tmp/postgresql-8.1.3.tar.gz $ cd postgresql-8.1.3 |
展開したPostgreSQLのソースコードをコンパイルし、インストールする。
$ ./configure $ make all $ make install |
DBT-1 PostgreSQL(ODBC版)を使用する場合、iODBCドライバ・マネジャをインストールする必要がある。また、Linux上でODBCドライバを利用したアプリケーションを使用するためには、ODBCドライバ・マネージャと下位データアクセスドライバであるPostgreSQL用のODBCドライバをインストールする必要がある。ここでは、ODBCドライバ・マネジャーとしてiODBCを使用する。
入手元:http://www.iodbc.org/
$ su root # mkdir /usr/local/src/libiodbc-3.51.2 # chown pgsql /usr/local/src/libiodbc-3.51.2 # su - pgsql $ cd /usr/local/src $ tar zxvf /tmp/libiodbc-3.51.2.tar.gz $ cd libiodbc-3.51.2 $ ./configure $ make $ su root # make install |
本測定で使用したiODBCドライバ・マネジャは、本サイトからもダウンロードできる。
DBT-1 PostgreSQL(ODBC版)を使用する場合、PostgreSQL用ODBCドライバをiODBCドライバ・マネージャに対応するようにインストールする必要がある。但し、本測定で使用したpsqlodbcドライバは、iODBCドライバ・マネージャに対応したコンパイルオプションを設定してコンパイルを行うとエラーが発生してしまうため、デフォルトの設定であるunixODBCのオプションを使用してコンパイルを行う。psqlodbcドライバは以下のURLから入手した。
入手元:http://www.postgresql.org/ftp/odbc/versions/src/
# mkdir /usr/local/src/psqlodbc-08.00.0102 # chown pgsql /usr/local/src/psqlodbc-08.00.0102 # su - pgsql $ cd /usr/local/src $ tar zxvf /tmp/psqlodbc-08.00.0102.tar.gz $ cd psqlodbc-08.00.0102 $ ./configure $ make $ su root # make install |
DBT-1がODBCドライバ・マネージャ経由でPostgreSQLに接続を行なうための設定を行なう。pgsqlユーザで、そのホームディレクトリに下記内容の.odbc.iniファイルを作成する。
[ODBC Data Sources] DBT1 =Postgres DBT1 [DBT1] Servername = localhost Database = DBT1 Driver = /usr/local/lib/psqlodbc.so Port = 5432 ReadOnly=No |
本測定で使用したPostgreSQL用ODBCドライバは、本サイトからもダウンロードできる。
PostgreSQLでは、必ずPostgreSQLの実行者ID=pgsql、グループ=pgsql、パスワード=pgsqlで実行すること。
ログ情報の取得には、root権限が必要なコマンドがあるため、DBT-1を実行するユーザがsudoを利用できるよう、/etc/sudoersファイルを編集する。
編集方法は、rootユーザでvisudoを起動し、以下の1行を追加する。
pgsql ALL=(ALL) NOPASSWD: ALL |
pgsqlユーザでログインし、~/.bashrcファイル 内に以下の設定を追加する。
今回の測定では、ディスクへのI/Oを分散させて性能を向上させるため、ログ用とデータ用のディスクを分けて配置している。
ログを出力するディスクを/hdd/sdb/data、テーブルスペースのディスクを/hdd/sdc/dataとしている。
export PGDIR=/usr/local/pgsql export PATH=$PATH:$PGDIR:$PGDIR/bin export PGUSER=pgsql export PGDATA=/hdd/sdb/data export SID1=DBT1 export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/pgsql/lib |
pgsqlユーザでログインする。OSDL DBT-1 PostgreSQL(ODBC版)のソースをユーザのホームディレクトリにダウンロードする。今回は以下のDBT-1を用いて測定を行った。バージョンは2.1である。
ダウンロード:DBT-1ダウンロード
次のコマンドでDBT-1を展開する。
$ tar zxvf dbt1-v2.1-PostgreSQL-ODBC-1.2.2.tar.gz |
今回はデータサイズ指定でデータが作成できるように、datagenのプログラムを改変したものを用いて測定を行っている。
ここで言うデータサイズとは、データ生成プログラムであるdatagenプログラムによって生成される複数のファイルの合計容量を指す。
以下のファイルをコピーし、コンパイルする。
$ cd ~/dbt1-v2.1/datagen $ ./configure --with-postgresql-odbc --without-sapdb $ make $ make install |
Red Hat Exterprise Linuxインストール時に導入するパッケージは標準構成をベースとし、ディストリビューションに含まれるCDの内容のみ使用する。
但しDBT-1を実行するために必要なパッケージは適宜追加する。
pgsqlでログインし、データを格納するディレクトリを設定する。
$ mkdir ~/data $ chmod a+w ~/data |
$ cd ~/dbt1-v2.1/datagen $ ./datagen -d PGSQL -g 6.5 -p /home/pgsql/data |
オプションの解説
-d : データベースタイプ(PGSQLのみ)
-i : 生成するアイテム総数
-u : 生成する仮想ユーザ数
-g : 生成するデータサイズ(生成されるファイルの総容量)
-p : 実際に生成するデータディレクトリ
-T : データを生成するテーブル名
i -- item
c -- customer
a -- author
d -- address
o -- order
※-gで指定するデータサイズはGB単位で指定する。
※-pに与えるパスはフルパスで指定する。指定したディレクトリ内にデータが作成される。
※実際に生成されたデータファイルには/tmpディレクトリからシンボリックリンクが張られる。データロードには、/tmp ディレクトリからのパスが使用される。
※上記パラメータで作成されるデータの総容量は、約6.5GBとなる。
rootユーザでデータベース用のディレクトリを作成する。
# mkdir -p /hdd/sdb/data # chown -R pgsql /hdd/sdb/data # mkdir -p /hdd/sdc/data # chown -R pgsql /hdd/sdc/data |
PostgreSQLのテーブルスペース機能を使用するため、”/home/pgsql/dbt1-v2.1/scripts/pgsql/create_db.sh”ファイルの20行目を下記に変更する。
_o=`createdb $SID1 --tablespace=sdc 2>&1` |
pgsqlユーザにて、次のコマンドでPostgreSQLにデータベースを作成し、同時にテーブルスペースも作成する。 作成するデータベース名はDBT-1としている
# su - pgsql $ initdb --no-locale --encoding =EUC_JP $ createdb DBT1 $ psql DBT1 -c "create tablespace sdc location '/hdd/sdc/data' ;" $ cd ~/dbt1-v2.1/scripts/pgsql $ ./build_db.sh ' ' 0 0 |
build_db.sh 実行時は、' (シングルコーテーション)の前後に空白を必ず挿入し、実行すること。
エディタでDBT-1設定ファイル(~/dbt1-v2.1/scripts/stats/dbt1.config)を編集する。
・ホスト名をlocalhostに修正
・ディレクトリを各バイナリが存在するディレクトリに修正
・総エミュレートユーザ数を計測を行う仮想ユーザ数に修正
PostgreSQLの場合の各行は以下のとおり
図4-1 DBT-1設定ファイルの編集例
※今回の評価では、生成顧客数・総エミュレートユーザ数のみを変えて評価を実施する。(下線部)
※複数のサーバに実行を分散する場合、サーバの数だけ、全項目を":"で区切って定義を追加する。
DBT-1実行中のPostgreSQLの稼動情報は、PostgreSQLの統計情報収集機能 (statics collector)により取得できる。この機能を有効にする場合は、$PGDATA/postgresql.confの関連項目を編集し、PostgreSQLを再起動すること。
stats_start_collector = on stats_command_string = on stats_block_level = on stats_row_level = on stats_reset_on_server_start = on |
PostgreSQLを起動する。起動している場合は必要ないが、PostgreSQL内部のキャッシュなどをクリアするには、再起動することが必要である。pgsqlユーザで、以下のコマンドを実行する。
$ pg_ctl stop $ pg_ctl start |
トランザクション作業領域の容量が不足すると、DBとは関係の無い箇所で処理待ちが生じるため、以下の値はDBT-1設定ファイル(~/dbt1-v2.1/scripts/stats/dbt1.config)内の”#eu”以上の値を指定する。
#transaction_queue_szie #transaction_array_szie |
次のコマンドでDBT-1を測定する
$ cd ~/dbt1-v2.1/scripts/stats $ ./run_dbt1.sh /home/pgsql/U200 |
※今回は、DBの性能評価であるため、appCacheを使用しない。
※run_dbt1.shに引数として与えるディレクトリは事前に作成する必要はない。
※引数のディレクトリ(/home/pgsql/U200)にBTファイルが作成されており、最終行の「total errors」が0となっていれば、測定の成功となる。
以下に、BTファイルの例を示す。
図4-2 BTファイルの例
情報種別 | コマンド | 出力ファイル名 | 備考 |
---|---|---|---|
システム統計 | sar -A | run.sar.data | 10秒間隔 |
I/O情報 | iostat -d | io.txt | 10秒間隔 |
プロセス一覧 | top d 120 b | top.txt | 120秒間隔 |
接続セッション情報 | select * from pg_stat_activity | db_activity*.out | * は取得回数 |
内部キャッシュファイルシステムI/O統計 | select * from pg_stat_database where datname='DBT1'; | db_load*.out | * は取得回数 |
ユーザインデックスに関する内部キャッシュファイルシステムI/O統計 | select relid, indexrelid, relname, indexrelname idx_blks_read, idx_blks_hit from pg_statio_user_indexes | index_info*.out | * は取得回数 |
ユーザインデックス問い合わせ数の統計 | select * from pg_stat_user_indexes; | indexes_scan*.out | * は取得回数 |
ロックに関する情報 | select relname,pid, mode, granted from pg_locks, pg_class where relfilenode = relation | lockstats*.out | * は取得回数 |
ユーザテーブルに関する内部キャッシュファイルシステムI/O統計 | select relid, relname, heap_blks_read,heap_blks_hit,idx_blks_read, idx_blks_hit from pg_statio_user_tables; | table_info*.out | * は取得回数 |
ユーザテーブの問い合わせ方法の統計 | select * from pg_stat_user_tables; | table_scan*.out | * は取得回数 |
ロックに関する情報 | select * from pg_locks where transaction is not NULL; | tran_lock*.out | * は取得回数 |
ファイル名 | 説明 |
---|---|
BT | インタラクション別平均応答時間、BT/秒等OSDL DBT-1測定結果が格納される。 |
mix.log | dbdriverからappServerへのリクエストインタラクション、応答時間(msec)が記録される。BTファイルを計算するための元情報。 |