LoginSignup
1
0

More than 1 year has passed since last update.

LD_PRELOADを使ってpgbenchの初期データロードの挙動を変更してみる

Posted at

pgbenchは、ベンチマーク対象のPostgreSQLのバージョンが14以降の場合、デフォルトではCOPY FREEZEコマンドを使用して、pgbench_accountsテーブルの初期データをロードします。しかし、LD_PRELOADを使用することで、pgbenchの挙動を変更し、(FREEZEオプションが指定されていない)COPYコマンドを使用して、pgbench_accountsテーブルの初期データをロードすることができます。

具体的には、pgbenchはPQserverVersion()関数を使用して、PostgreSQLのバージョンを取得し、バージョンが14以上であればCOPY FREEZEコマンドを使用します。そのため、PQserverVersion()関数をフックして、常にバージョン13を返すようにすることで、pgbenchはCOPYコマンドを使用することができます。

まず、以下のようにPQserverVersion()と同じ関数定義で、常にバージョン13を返す関数を作成します。このプログラムのファイル名はmyPQserverVersion.cとします。

#include "libpq-fe.h"

int PQserverVersion(const PGconn *conn) {
    return 130000;
}

次に、この関数を共有ライブラリとしてコンパイルします。

$ gcc -shared -fPIC myPQserverVersion.c -o myPQserverVersion.so -I/path/to/pgsql/include

最後に、LD_PRELOAD環境変数を使用して、先程作成した共有ライブラリを指定してpgbenchを実行します。

LD_PRELOAD=./myPQserverVersion.so pgbench -i

これで、pgbenchはPostgreSQL14以降であっても、COPYコマンドを使用してpgbench_accountsテーブルの初期データをロードするようになります。確認のために、log_statementをallに設定して、FREEZEが指定されていたかどうかを確認することができます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0