はじめに
ゲームしない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)に対応している
- 最近のは対応してそう。
- Compute Capabilityが6.0以降のモデル
- SSD
- NVMeであること
- GDSの美味しいところ。
- NVMeであること
構築
公式サイトに沿う。(全て書くのが面倒(ゲフンゲフン
公式サイトとは異なる点を書き出す。
- 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オーダーのデータベースになったら真価を発揮しそうな予感。あと、平均だとか計算するクエリ。