0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PG-Stromを使ってみる

Last updated at Posted at 2025-04-17

はじめに

ゲームしないAIやらない人にとってのGPUのアドバンテージってなんやに引リツされた、SQLが早くなるというのをTwitter(現X)で見た。
HeteroDB社が開発しているPostgreSQLの処理を早くするというソフトウェア、PG-Stromだそうで。
面白そうだからやってみようの巻。

環境

  • CPU: AMD Ryzen Threadripper 1950X
  • RAM: DDR4 32GB
  • GPU: NVIDIA Quadro RTX 4000
  • SSD: Patriot Viper 256GB
  • OS : AlmaLinux 9.5

ハードウェア選定の注意点
GPUとSSDは条件がある。

  • GPU
    • Compute Capabilityが6.0以降のモデル
      • PG-Stromの条件。
    • ここに載っているGPUモデル
      • 理由:当初RTX 4070 Superでやっていたが、うまく動かなかった。
    • GPUDirect Storage(以降GDS)に対応している
      • 最近のは対応してそう。
  • SSD
    • NVMeであること
      • GDSの美味しいところ。

構築

公式サイトに沿う。(全て書くのが面倒(ゲフンゲフン
公式サイトとは異なる点を書き出す。

  • MOFEDドライバのインストール
    • インストールスクリプト実行時のオプション
      • ./mlnxofedinstall --with-nvmf --with-nfsrdma --enable-gds --add-kernel-support
      • --enable-gdsオプションをつけないと、サーバ再起動時にGDSが使えない。(なんで)
  • OSのリソース制限の拡張
    • /usr/lib/systemd/system/postgresql-16.service.d/pg_strom.conf
    • 公式サイトでは/etc配下だが、実際は/usr配下だった。OSによる?

実験

計測してみよう。

テーブル

すごく適当。
なんかのサービスの登録管理みたいな。
インデックス張っているのといないのと2種類作った。

=# CREATE TABLE test_table_user (number SERIAL, name TEXT NOT NULL, uniqueid TEXT NOT NULL);
=# CREATE TABLE test_table_user_info (uniqueid TEXT NOT NULL, location TEXT NOT NULL, sex TEXT NOT NULL, age SMALLINT NOT NULL);

レコードはPythonで2000万件ほど突っ込んだ。

計測SQL

  • WHERE句
    • EXPLAIN ANALYZE SELECT * FROM test_table_user_info WHERE sex = 'Female';
  • GROUOP BY句
    • EXPLAIN ANALYZE SELECT location, AVG(age) FROM test_table_user_info GROUP BY location;
  • JOIN句
    • EXPLAIN ANALYZE SELECT * FROM test_table_user JOIN test_table_user_info ON test_table_user.uniqueid = test_table_user_info.uniqueid;
  • 複合
    • EXPLAIN ANALYZE SELECT location, AVG(age) FROM test_table_user JOIN test_table_user_info ON test_table_user.uniqueid = test_table_user_info.uniqueid WHERE sex = 'Male' GROUP BY location;
  • おまけ(重複抽出)
    • EXPLAIN ANALYZE SELECT uniqueid FROM test_table_user GROUP BY uniqueid HAVING COUNT(uniqueid) > 1;

データベース初心者なのでツッコミどころ満載だと思う。生暖かい目で見ていてほしい。()

実験結果

WHERE句

indexなし[ms] indexあり[ms] indexによる速度向上率[%]
CPU 1806 1244 145
PG-Strom 1202 1094 109
PG-Stromによる速度向上率[%] 150 114

GROUP BY句

indexなし[ms] indexあり[ms] indexによる速度向上率[%]
CPU 1498 1485 101
PG-Strom 405 422 96
PG-Stromによる速度向上率[%] 370 352

JOIN句

indexなし[ms] indexあり[ms] indexによる速度向上率[%]
CPU 15631 15517 101
PG-Strom 11826 11697 101
PG-Stromによる速度向上率[%] 132 133

複合

indexなし[ms] indexあり[ms] indexによる速度向上率[%]
CPU 6333 6334 100
PG-Strom 3290 3187 103
PG-Stromによる速度向上率[%] 192 199

おまけ(重複抽出)

indexなし[ms] indexあり[ms] indexによる速度向上率[%]
CPU 10333 10326 100
PG-Strom 10558 10533 100
PG-Stromによる速度向上率[%] 98 98

感想のような何か

index貼る方が労力も時間も節約になるな。。。
デカいデータベースの時はハードで殴るよりもindexやパーティションなどでチューニングするのが良さげ。
PG-StomはTBオーダーのデータベースになったら真価を発揮しそうな予感。あと、平均だとか計算するクエリ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?