CPU数が少ない環境でPostgreSQL 9.5が9.4より微妙に遅い疑惑

今日は踊り子に乗って伊東へ向かってます。
PostgreSQL newbie hackathonなるイベントに参加するためなんですが、なにせ伊東までは横浜からでも遠い、遠い、実際遠い。
車中、ちょい暇なので、昨晩飲みながら測定したことを書いてみます。

CPU数が少ないとPostgreSQL 9.5 のほうが遅くなる疑惑

まんまタイトルのとおりですね。

測定環境

今回は以下の環境で測定。

マシン Let's note SX4(i7 * 2CPU)
ホストOS Windows 8.1
ゲストOS CentOS 7.0
PostgreSQL 9.4.6, 9.5.1
  • /sys/devices/system/cpu/cpu1/online の値を1または0に設定して、VM上でのCPU数を2または1に変更する。
    • CPU数が1になったときの挙動を見たかった。
  • PostgreSQLの設定はほぼデフォルト。
    • 9.4.6環境のcheckpoint_segmentsを3⇒125に変更したくらい。
測定方式

測定はpgbenchで実施。

  • 初期化
    • pgbenchのスケールファクタは10(pgbench_accounts=100万件)
    • --unlogged-table 指定を付けてWAL書き出しを抑止。
      • unlogged指定をすると、pgbenchの測定結果のぶれが小さくなるような気もする・・・。
    • HOTが効くようにfillfactorには90あたりをテキトーに指定しておく。
  • 実行時パラメータ
    • ベンチの実行は同時走行数のみを変更。1,2,3,4の4パターンを指定。
    • トランザクション数として10000を指定しておく。
    • 初期化⇒測定⇒測定⇒測定 で、3回の平均tpsを取る。
    • あ、レイテンシ(-r)オプション設定するの忘れた・・・。
結果

それほど、大きな差異はないけど、CPU数が少ない環境だと、9.4.6よりも9.5.1のほうがtpsが低下する傾向があるようだ。

9.4.6と9.5.1のtps比で見てみるとこうなる。


  • CPU数が1の環境だと、同時接続数が上がるにつれ、tpsの比率が低下し、同時接続数=4のとき(ほぼ過負荷状態)で5%程度のtps低下が見られる。さらに同時接続数を上げると、更に比率が低下していきそう・・・
  • CPU数が2の環境では、同時接続数=1のとき(中程度の負荷状態)で5%程度のtps低下。同時接続数が2以上のときには、それほど差異はないか。微妙に9.5.1のほうが低いかな。ただ、さらに同時接続数を上げていくと比率が低下していくのかも。

PostgreSQL 9.5のリリースノートにマルチCPU環境での性能向上に関する記載があったけど、

Improve LWLock scalability.

Improve lock scalability (Andres Freund)
This particularly addresses scalability problems when running on systems with multiple CPU sockets.

逆にCPUが低い時に、この改修が逆効果になるようなことがあるのかなー。
貧乏人はPostgreSQL 9.5を使うな!ということか・・・(違

まあ、今回のような誤差程度の性能低下があるからといって、PostgreSQL 9.5系を使わないという選択肢はないな。