patorashのブログ

方向性はまだない

もう一つ仮想環境を作って、そこからpgbenchを実行してみた

Hyper-VAmazon Linux2を立ち上げていて、前回はそこでpgbenchを実行してみていた。

patorash.hatenablog.com

pgbenchでtwitterで検索していたら、pgbenchを実行するホストとPostgreSQLが動いているホストが同じ場合、pgbenchにCPUを使われるのでもっと正確なベンチマークが取れないという話を見て、確かになぁ…と思った次第で、ちょっととりあえずもう一台VMを作って、そこから実行してみようと思った。

Hyper-Vの仮想環境を複製する

複製するのは、特にこだわりを持たなければ簡単だった。こだわりというのは、仮想環境のハードドライブをどこに置くか、というところだ。そこさえ気にしなければ、簡単。

複製の準備

まず、複製対象のVMをオフにします。

f:id:patorash:20200813024059p:plain
VMをオフにする。

次に、VMのイメージをエクスポートします。場所は適当に。私はOneDriveにバックアップされると面倒なので、ホームディレクトリ直下に置いた。

f:id:patorash:20200813024703p:plain

これで準備は完了です。

複製する

複製は、先ほどエクスポートしたイメージをインポートするだけですが、インポートウィザードで多少修正します。まずはインポートを選択します。

f:id:patorash:20200813024841p:plain

先ほどエクスポートしたイメージのディレクトリを選択します。

f:id:patorash:20200813025101p:plain

どんどん進めていき、インポートの種類のところで、「仮想マシンをコピーする(新しい一意なIDを作成する)」を選択します。

f:id:patorash:20200813025258p:plain

他は変更なく進めて、最後の「仮想ハードディスクを保存するフォルダを選択します」のところで、デフォルトと違うフォルダを選択します。元のままだと、複製元のVMと同じ名前のハードディスク名になってしまうため、既にあるので作れないと怒られてしまいます。このフォルダに置きたい!というこだわりがなければ、別名のフォルダを作ってしまい、そこに置きましょう。

f:id:patorash:20200813025822p:plain

あとは、確認画面が出るので、問題なければインポートを実行します。VMのインポートなので、そこそこ時間はかかります。

コピーが終わっていれば、終了です。

両方とも立ち上げてみましょう。複製元のVMに固定IPを振っていなければ、問題なく動くかと思いますが、振っている場合は、複製先のVMは他のIPを振りましょう。

もう一台のVMからPostgreSQLに接続する

複製元をプライマリ、複製先をセカンダリと呼ぶことにします。(まだレプリケーションとかしてないけど)

postgresql.confとpg_hba.confを修正していないため、セカンダリからプライマリに接続することができません。以下のようにエラーになります。

[ec2-user@postgres ~]$ psql -h 172.23.59.9 -p 5432 -U postgres benchdb
psql: could not connect to server: Connection refused
        Is the server running on host "172.23.59.9" and accepting
        TCP/IP connections on port 5432?

postgresql.confを修正して、TCP/IP接続可能にする

プライマリ側のpostgresql.confを修正します。場所は/var/lib/pgsql/data/postgresql.confでした。listen_addressesの行のコメントアウトを外し、全てのIPを許可するために*に、portの行のコメントアウトを外しました。

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*'          # what IP address(es) to listen on;
                                        # comma-separated list of addresses;
                                        # defaults to 'localhost'; use '*' for all
                                        # (change requires restart)
port = 5432                             # (change requires restart)

change requires restartと書いてあるので、postgresqlを再起動します。

sudo systemctl restart postgresql

pg_hba.confを修正する

ホストベース認証の設定ファイルであるpg_hba.confを修正します。デフォルトだとlocalhostしか許可していません。 今回は、同一サブネットからの接続は全てtrustにしました(勉強用なので!) 最後の行を追加しています。

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust
host    all             all             172.23.48.0/20          trust

ちなみにサブネットマスクの計算は以下のサイトを使いました。

note.cman.jp

pg_hba.confの修正に関しては、再起動は不要なので設定を再読み込みさせます。

pg_ctl reload

接続してみます。

[ec2-user@postgres ~]$ psql -h 172.23.59.9 -p 5432 -U postgres benchdb
psql (11.5)
Type "help" for help.

benchdb=#

できました!

セカンダリからpgbenchを実行する

では、実行してみましょう。

[ec2-user@postgres ~]$ pgbench -h 172.23.59.9 -p 5432 -U postgres benchdb
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
number of transactions per client: 10
number of transactions actually processed: 10/10
latency average = 6.123 ms
tps = 163.323153 (including connections establishing)
tps = 179.586074 (excluding connections establishing)

特にまだチューニングもしていないし、pgbench側のオプションも付けていないのですが、TPSが163という結果になりました。

ちなみにプライマリで実行してみた結果はというと…

-bash-4.2$ pgbench -h 127.0.0.1 -p 5432 -U postgres benchdb
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
number of transactions per client: 10
number of transactions actually processed: 10/10
latency average = 3.132 ms
tps = 319.238007 (including connections establishing)
tps = 388.040694 (excluding connections establishing)

TPSが319なので、流石に違うホストからのベンチマークよりは速いのかなというところ。とはいえ、これがCPUを食い合ってる状態なので、微妙!

まだ全然チューニングもしていない状態だし、pgbenchのオプションの最適な値もわかっていないけれど、とりあえず今日はここまで。眠い。