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系を使わないという選択肢はないな。