PostgreSQLのパラレルクエリをProxmox上のコンテナでCPUのコア数を変えてやってみる話
ちょっと前でNodeJSの非同期実行を2台のPostgreSQLを使ってやってみた。
理論上は倍のパフォーマンスが出るはずなのだが、そうはうまくいかなかった。
「なぜか」ということをよくよく考えたら「そもそもDB側で並列処理してんじゃね」ということが思い立った。
自分でも書いた通り、PostgreSQLではパラレルクエリが可能。パラレルクエリはひとつのクエリを複数のCPUで並列処理するもの。当然ながらパラレルクエリ機能が発動するとパフォーマンスが上がる。
例にしたクエリは並列処理しやすいように考えたので、パラレルクエリが発動しやすくその効果も高かったものと思われる。なので、今回はパラレルクエリが発動しないようにしてやってみるわけである。
Proxmoxでコア数を1にする
さて、パラレルクエリを切るには色々と方法がある。まずはpg_hint_planを使う方法がある。クエリーに以下のようなオプティマイザへのヒントを書いて制御する。
SELECT /*+ PARALLEL(売上結果 0) */ SUM(売上) FROM 売上結果 WHERE EXTRACT(YEAR FROM 日付) = 2024 OR EXTRACT(YEAR FROM 日付) = 2025
がしかし、Proxmoxのコンテナにはpg_hint_planが入っていなかった。これは使えん。
次に、設定を変えてやる方法。
max_parallel_workers_per_gatherを0に設定変更すれば、パラレルクエリ機能を切ることができる。
まぁ、設定ファイルを変更しても良いが、もっと簡単な方法を見つけてしまった。コア数を変更して再起動する方法である。

コンテナのリソースでコアのところの数値を変更して再起動するだけ。

これならマウス操作でちょちょいとできる。
とその前に、もう一度パフォーマンス測定しておこう。コア数2で実行した結果が以下である。
$ node query1.js
query: 562.453ms
ではコア数を1に変えて再起動後やってみる。
$ node query1.js
query: 1.006s
おーパフォーマンスがた落ちじゃない。半分とはいかないものの随分と減った。
やはり、パラレルクエリで並列処理されていたわけね。じゃあ、コア数を4にしたらもっとパフォーマンス上がる?やってみよう。
$ node query1.js
query: 397.848ms
なんと速くなったじゃない。1クエリで2CPUまでしか使わないみたいな説明があったからあまり期待はしてなかったが、多少の効果はあるみたい。
物理ホストの方が4コアしかないのでこれ以上はやりません。
ということで、マスターとレプリカの両方でコア数を1にして、NodeJSで非同期実行させてみる。
まずは確認のため1クエリで集計するパターン
$ node query1.js
query: 1.009s
コア数1だから1秒かかってる。前のと同じ結果。では2クエリを非同期にマスタとレプリカに分散させてやってみる。
$ node query2.js
query2: 403.706ms
query1: 727.24ms
total-query: 727.694ms
query1.js
query2.js
速くなったんじゃない。38%ほどパフォーマンスアップ。
前回やった結果と比較すると
$ node query1.js
query: 567.87ms
$ node query2.js
query2: 305.712ms
query1: 442.992ms
total-query: 443.435ms
28%ほどの改善。なので差は10%か。うーん、どうなの?1割アップなら合格としよう。
投稿者プロフィール

-
システムエンジニア
喋れる言語:日本語、C言語、SQL、JavaScript