Hyper-VでAmazon Linux2を立ち上げていて、前回はそこでpgbenchを実行してみていた。
pgbenchでtwitterで検索していたら、pgbenchを実行するホストとPostgreSQLが動いているホストが同じ場合、pgbenchにCPUを使われるのでもっと正確なベンチマークが取れないという話を見て、確かになぁ…と思った次第で、ちょっととりあえずもう一台VMを作って、そこから実行してみようと思った。
Hyper-Vの仮想環境を複製する
複製するのは、特にこだわりを持たなければ簡単だった。こだわりというのは、仮想環境のハードドライブをどこに置くか、というところだ。そこさえ気にしなければ、簡単。
複製の準備
まず、複製対象のVMをオフにします。
次に、VMのイメージをエクスポートします。場所は適当に。私はOneDriveにバックアップされると面倒なので、ホームディレクトリ直下に置いた。
これで準備は完了です。
複製する
複製は、先ほどエクスポートしたイメージをインポートするだけですが、インポートウィザードで多少修正します。まずはインポートを選択します。
先ほどエクスポートしたイメージのディレクトリを選択します。
どんどん進めていき、インポートの種類のところで、「仮想マシンをコピーする(新しい一意なIDを作成する)」を選択します。
他は変更なく進めて、最後の「仮想ハードディスクを保存するフォルダを選択します」のところで、デフォルトと違うフォルダを選択します。元のままだと、複製元のVMと同じ名前のハードディスク名になってしまうため、既にあるので作れないと怒られてしまいます。このフォルダに置きたい!というこだわりがなければ、別名のフォルダを作ってしまい、そこに置きましょう。
あとは、確認画面が出るので、問題なければインポートを実行します。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
ちなみにサブネットマスクの計算は以下のサイトを使いました。
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のオプションの最適な値もわかっていないけれど、とりあえず今日はここまで。眠い。