本章ではPG-Stromのインストール手順について説明します。
チェックリスト
- ハードウェア
- CUDA ToolkitのサポートするLinuxオペレーティングシステムを動作可能な x86_64 アーキテクチャのハードウェアが必要です。
- CPU、ストレージ、およびネットワークデバイスには特別な要件はありませんが、note002:HW Validation Listはハードウェア選定の上で参考になるかもしれません。
- SSD-to-GPUダイレクトSQL実行を利用するにはNVMe規格に対応したSSDが必要で、GPUと同一のPCIe Root Complex配下に接続されている必要があります。
- GPUデバイス
- PG-Stromを実行するには少なくとも一個のGPUデバイスがシステム上に必要です。これらはCUDA Toolkitでサポートされており、computing capability が6.0以降のモデル(Pascal世代以降)である必要があります。
- note001:GPU Availability Matrixにより詳細な情報が記載されています。SSD-to-GPUダイレクトSQL実行の対応状況に関してもこちらを参照してください。
- Operating System
- PG-Stromの実行には、CUDA Toolkitによりサポートされているx86_64アーキテクチャ向けのLinux OSが必要です。推奨環境はRed Hat Enterprise LinuxまたはCentOSのバージョン7.xシリーズです。
- SSD-to-GPUダイレクトSQL実行を利用するには、Red Hat Enterprise Linux または CentOS のバージョン7.3以降が必要です。
- PostgreSQL
- PG-Stromの実行にはPostgreSQLバージョン9.6以降が必要です。これは、Custom ScanインターフェースがCPU並列実行やGROUP BYに対応するため刷新され、拡張モジュールが提供するカスタム実行計画を自然な形で統合できるようになったためです。
- CUDA Toolkit
- PG-Stromの実行にはCUDA Toolkit バージョン9.2以降が必要です。
- PG-Stromが内部的に利用しているAPIの中には、これ以前のバージョンでは提供されていないものが含まれています。
OSのインストール
CUDA ToolkitのサポートするLinuxディストリビューションを選択し、個々のディストリビューションのインストールプロセスに従ってインストール作業を行ってください。 CUDA ToolkitのサポートするLinuxディストリビューションは、NVIDIA DEVELOPER ZONEにおいて紹介されています。
Red Hat Enterprise Linux 7.x系列、またはCentOS 7.x系列の場合、ベース環境として「最小限のインストール」を選択し、さらに以下のアドオンを選択してください。
- デバッグツール
- 開発ツール
OSインストール後の設定
システムへのOSのインストール後、後のステップでGPUドライバとNVMe-Stromドライバをインストールするために、いくつかの追加設定が必要です。
EPELリポジトリの設定
PG-Stromの実行に必要なソフトウェアモジュールのいくつかは、EPEL(Extra Packages for Enterprise Linux)の一部として配布されています。 これらのソフトウェアを入手するためにEPELパッケージ群のリポジトリ定義をyumシステムに追加する必要があります。
EPELリポジトリから入手するパッケージの一つがDKMS(Dynamic Kernel Module Support)です。これは動作中のLinuxカーネルに適合したLinuxカーネルモジュールをオンデマンドでビルドするためのフレームワークで、NVIDIAのGPUデバイスドライバや、SSD-to-GPUダイレクトSQL実行をサポートするカーネルモジュール(nvme_strom)が使用しています。 Linuxカーネルモジュールは、Linuxカーネルのバージョンアップに追従して再ビルドが必要であるため、DKMSなしでのシステム運用は現実的ではありません。
EPELリポジトリの定義はepel-release
パッケージにより提供されます。
これはFedora ProjectのパブリックFTPサイトから入手する事が可能で、epel-release-<distribution version>.noarch.rpm
をダウンロードし、これをインストールしてください。
epel-release
パッケージがインストールされると、EPELリポジトリからソフトウェアを入手するための設定がyumシステムへ追加されます。
- Fedora Project Public FTP Site
Tip
上記URLからPackages
→e
へとディレクトリ階層を下ります。
以下のようにepel-releaseパッケージをインストールします。
$ sudo yum install https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
:
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
epel-release noarch 7-11 /epel-release-7-11.noarch 24 k
Transaction Summary
================================================================================
Install 1 Package
:
Installed:
epel-release.noarch 0:7-11
Complete!
HeteroDB-SWDCのインストール
PG-Stromほか関連パッケージはHeteroDB Software Distribution Centerから配布されています。 これらのソフトウェアを入手するために、HeteroDB-SWDCのリポジトリ定義をyumシステムに追加する必要があります。
HeteroDB-SWDCリポジトリの定義はheterodb-swdcパッケージにより提供されます。
WebブラウザなどでHeteroDB Software Distribution Centerへアクセスし、ページの先頭にリンクの記載されているheterodb-swdc-1.0-1.el7.noarch.rpm
をダウンロードしてインストールしてください。
heterodb-swdcパッケージがインストールされると、HeteroDB-SWDCからソフトウェアを入手するためのyumシステムへの設定が追加されます。
以下のようにheterodb-swdcパッケージをインストールします。
$ sudo yum install https://heterodb.github.io/swdc/yum/rhel7-x86_64/heterodb-swdc-1.0-1.el7.noarch.rpm
:
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
heterodb-swdc noarch 1.0-1.el7 /heterodb-swdc-1.0-1.el7.noarch 2.4 k
Transaction Summary
================================================================================
Install 1 Package
:
Installed:
heterodb-swdc.noarch 0:1.0-1.el7
Complete!
CUDA Toolkitのインストール
本節ではCUDA Toolkitのインストールについて説明します。 既に最新のCUDA Toolkitをインストール済みであれば、本節の内容は読み飛ばして構いません
NVIDIAはCUDA Toolkitのインストールに2通りの方法を提供しています。一つは自己実行型アーカイブ(runfileと呼ばれる)によるもの。もう一つはRPMパッケージによるものです。 ソフトウェアの更新が容易である事から、後者のRPMパッケージによるインストールが推奨です。
CUDA Toolkitのインストール用パッケージはNVIDIA DEVELOPER ZONEからダウンロードする事ができます。 適切なOS、アーキテクチャ、ディストリビューション、バージョンを指定し、『rpm(network)』版を選択してください。
『rpm(network)』パッケージにはCUDA Toolkitを配布するyumリポジトリの定義情報が含まれているだけです。これは OSのインストール においてシステムにEPELリポジトリの定義を追加したのと同様の方法です。 したがって、cudaリポジトリを登録した後、関連したRPMパッケージをネットワークインストールする必要があります。 下記のコマンドを実行してください。
$ sudo rpm -i cuda-repo-<distribution>-<version>.x86_64.rpm
$ sudo yum clean all
$ sudo yum install cuda --enablerepo=rhel-7-server-e4s-optional-rpms
or
$ sudo yum install cuda
正常にインストールが完了すると、/usr/local/cuda
配下にCUDA Toolkitが導入されています。
Tip
RHEL7の場合、CUDA Toolkitのインストールに必要なvulkan-filesystem
パッケージを配布するrhel-7-server-e4s-optional-rpms
リポジトリは、デフォルトで有効化されていません。CUDA Toolkitをインストールする際には、/etc/yum.repos.d/redhat.repo
を編集して当該リポジトリを有効化するか、yumコマンドの--enablerepo
オプションを用いて当該リポジトリを一時的に有効化してください。
$ ls /usr/local/cuda
bin include libnsight nvml samples tools
doc jre libnvvp nvvm share version.txt
extras lib64 nsightee_plugins pkgconfig src
インストールが完了したら、GPUが正しく認識されている事を確認してください。nvidia-smi
コマンドを実行すると、以下の出力例のように、システムに搭載されているGPUの情報が表示されます。
$ nvidia-smi
Wed Feb 14 09:43:48 2018
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 387.26 Driver Version: 387.26 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla V100-PCIE... Off | 00000000:02:00.0 Off | 0 |
| N/A 41C P0 37W / 250W | 0MiB / 16152MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
Tip
nvidiaドライバと競合するnouveauドライバがロードされている場合、直ちにnvidiaドライバをロードする事ができません。 この場合は、nouveauドライバの無効化設定を行った上でシステムを一度再起動してください。 runfileによるインストールの場合、CUDA Toolkitのインストーラがnouveauドライバの無効化設定も行います。RPMによるインストールの場合は、以下の設定を行ってください。
nouveauドライバを無効化するには、以下の設定を/etc/modprobe.d/disable-nouveau.conf
という名前で保存し、dracut
コマンドを実行してLinux kernelのブートイメージに反映します。
# cat > /etc/modprobe.d/disable-nouveau.conf <<EOF
blacklist nouveau
options nouveau modeset=0
EOF
# dracut -f
PostgreSQLのインストール
本節ではRPMによるPostgreSQLのインストールについて紹介します。
ソースからのインストールに関しては既にドキュメントが数多く存在し、./configure
スクリプトのオプションが多岐にわたる事から、ここでは紹介しません。
Linuxディストリビューションの配布するパッケージにもPostgreSQLは含まれていますが、必ずしも最新ではなく、PG-Stromの対応バージョンよりも古いものである事が多々あります。例えば、Red Hat Enterprise Linux 7.xやCentOS 7.xで配布されているPostgreSQLはv9.2.xですが、これはPostgreSQLコミュニティとして既にEOLとなっているバージョンです。
PostgreSQL Global Development Groupは、最新のPostgreSQLおよび関連ソフトウェアの配布のためにyumリポジトリを提供しています。 EPELの設定のように、yumリポジトリの設定を行うだけの小さなパッケージをインストールし、その後、PostgreSQLやその他のソフトウェアをインストールします。
yumリポジトリ定義の一覧は http://yum.postgresql.org/repopackages.php です。
PostgreSQLメジャーバージョンとLinuxディストリビューションごとに多くのリポジトリ定義がありますが、あなたのLinuxディストリビューション向けのPostgreSQL 9.6以降のものを選択する必要があります。
以下のように、yumリポジトリの定義をインストールし、次いで、PostgreSQLパッケージをインストールすれば完了です。 PostgreSQL v10を使用する場合、PG-Stromのインストールには以下のパッケージが必要です。
- postgresql10-devel
- postgresql10-server
$ sudo yum install -y https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-redhat10-10-2.noarch.rpm
$ sudo yum install -y postgresql10-server postgresql10-devel
:
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
postgresql10-devel x86_64 10.2-1PGDG.rhel7 pgdg10 2.0 M
postgresql10-server x86_64 10.2-1PGDG.rhel7 pgdg10 4.4 M
Installing for dependencies:
postgresql10 x86_64 10.2-1PGDG.rhel7 pgdg10 1.5 M
postgresql10-libs x86_64 10.2-1PGDG.rhel7 pgdg10 354 k
Transaction Summary
================================================================================
Install 2 Packages (+2 Dependent packages)
:
Installed:
postgresql10-devel.x86_64 0:10.2-1PGDG.rhel7
postgresql10-server.x86_64 0:10.2-1PGDG.rhel7
Dependency Installed:
postgresql10.x86_64 0:10.2-1PGDG.rhel7
postgresql10-libs.x86_64 0:10.2-1PGDG.rhel7
Complete!
PostgreSQL Global Development Groupの提供するRPMパッケージは/usr/pgsql-<version>
という少々変則的なディレクトリにソフトウェアをインストールするため、psql
等の各種コマンドを実行する際にはパスが通っているかどうか注意する必要があります。
postgresql-alternatives
パッケージをインストールしておくと、各種コマンドへのシンボリックリンクを/usr/local/bin
以下に作成するため各種オペレーションが便利です。また、複数バージョンのPostgreSQLをインストールした場合でも、alternatives
コマンドによってターゲットとなるPostgreSQLバージョンを切り替える事が可能です。
$ sudo yum install postgresql-alternatives
:
Resolving Dependencies
--> Running transaction check
---> Package postgresql-alternatives.noarch 0:1.0-1.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
:
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
postgresql-alternatives noarch 1.0-1.el7 heterodb 9.2 k
Transaction Summary
================================================================================
:
Installed:
postgresql-alternatives.noarch 0:1.0-1.el7
Complete!
PG-Stromのインストール
本節ではPG-Stromのインストール方法について説明します。 推奨はRPMによるインストールですが、開発者向けにソースコードからのビルド方法についても紹介します。
RPMによるインストール
PG-Stromおよび関連パッケージはHeteroDB Software Distribution Centerより配布されています。 既にyumシステムへリポジトリを追加済みであれば、それほど作業は多くありません。
基盤となるPostgreSQLのバージョンごとに別個のPG-StromのRPMパッケージが準備されており、PostgreSQL v9.6用であればpg_strom-PG96
パッケージを、PostgreSQL v10用であればpg_strom-PG10
パッケージをインストールします。
$ sudo yum install pg_strom-PG10
:
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
pg_strom-PG10 x86_64 1.9-180301.el7 heterodb 320 k
Transaction Summary
================================================================================
:
Installed:
pg_strom-PG10.x86_64 0:1.9-180301.el7
Complete!
以上でパッケージのインストールは完了です。
ソースからのインストール
開発者向けに、ソースコードからPG-Stromをビルドする方法についても紹介します。
ソースコードの入手
RPMパッケージと同様に、ソースコードのtarballをHeteroDB Software Distribution Centerから入手する事ができます。
ただ、tarballのリリースにはある程度のタイムラグが生じてしまうため、最新の開発版を使いたい場合にはPG-StromのGitHubリポジトリのmaster
ブランチをチェックアウトする方法の方が好まれるかもしれません。
$ git clone https://github.com/heterodb/pg-strom.git
Cloning into 'pg-strom'...
remote: Counting objects: 13797, done.
remote: Compressing objects: 100% (215/215), done.
remote: Total 13797 (delta 208), reused 339 (delta 167), pack-reused 13400
Receiving objects: 100% (13797/13797), 11.81 MiB | 1.76 MiB/s, done.
Resolving deltas: 100% (10504/10504), done.
PG-Stromのビルド
PG-Stromをビルドする時のコンフィグは、インストール先のPostgreSQLと厳密に一致していなければいけません。例えば、同じ構造体がビルド時のコンフィグによりPostgreSQLとPG-Stromで異なったレイアウトを持ってしまったとすれば、非常に発見の難しいバグを生み出してしまうかもしれません。 したがって、(一貫性のない状態を避けるため)PG-Stromは独自にconfigureスクリプトを走らせたりはせず、pg_config
を使ってPostgreSQLのビルド時設定を参照します。
pg_config
にパスが通っており、それがインストール先のPostgreSQLのものであれば、そのままmake
、make install
を実行します。
直接パスが通っていない場合は、make
コマンドにPG_CONFIG=...
パラメータを与え、pg_config
のフルパスを渡します。
$ cd pg-strom
$ make PG_CONFIG=/usr/pgsql-10/bin/pg_config
$ sudo make install PG_CONFIG=/usr/pgsql-10/bin/pg_config
インストール後の設定
データベースクラスタの作成
データベースクラスタの作成が済んでいない場合は、initdb
コマンドを実行してPostgreSQLの初期データベースを作成します。
RPMインストールにおけるデフォルトのデータベースクラスタのパスは/var/lib/pgsql/<version number>/data
です。
postgresql-alternatives
パッケージをインストールしている場合は、PostgreSQLのバージョンに拠らず/var/lib/pgdata
で参照する事ができます。
$ sudo su - postgres
$ initdb -D /var/lib/pgdata/
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
fixing permissions on existing directory /var/lib/pgdata ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
pg_ctl -D /var/lib/pgdata/ -l logfile start
postgresql.confの編集
続いて、PostgreSQLの設定ファイルである postgresql.conf
を編集します。
PG-Stromを動作させるためには、最低限、以下のパラメータの設定が必要です。 これ以外のパラメータについても、システムの用途や想定ワークロードを踏まえて検討してください。
- shared_preload_libraries
- PG-Stromモジュールは
shared_preload_libraries
パラメータによりpostmasterプロセスの起動時にロードされる必要があります。オンデマンドでの拡張モジュールのロードはサポート対象外です。したがって、以下の設定項目は必須です。 shared_preload_libraries = '$libdir/pg_strom'
- PG-Stromモジュールは
- max_worker_processes
- PG-Stromは数個のバックグラウンドワーカーを内部的に使用します。そのため、デフォルト値である 8 では、それ以外の処理に利用できるバックグラウンドワーカープロセス数があまりにも少なすぎてしまいます。
- 以下のように、ある程度の余裕を持った値を設定すべきです。
max_worker_processes = 100
- shared_buffers
- ワークロードによりますが、
shared_buffers
の初期設定は非常に小さいため、PG-Stromが有効に機能する水準のデータサイズに対しては、ストレージへの読み書きが律速要因となってしまい、GPUの並列計算機能を有効に利用できない可能性があります。 - 以下のように、ある程度の余裕を持った値を設定すべきです。
shared_buffers = 10GB
- 明らかにメモリサイズよりも大きなデータを処理する必要がある場合は、SSD-to-GPUダイレクトSQL実行の利用を検討してください。
- ワークロードによりますが、
- work_mem
- ワークロードによりますが、
work_mem
の初期設定は非常に小さいため、解析系クエリで最適なクエリ実行計画が選択されない可能性があります。 - 典型的な例は、ソート処理にオンメモリのクイックソートではなく、ディスクベースのマージソートを選択するといったものです。
- 以下のように、ある程度の余裕を持った値を設定すべきです。
work_mem = 1GB
- ワークロードによりますが、
OSのリソース制限の拡張
SSD-to-GPUダイレクトSQLを使用する場合は特に、同時に大量のファイルをオープンする事があるため、プロセスあたりファイルディスクリプタ数の上限を拡大しておく必要があります。
また、PostgreSQLのクラッシュ時に確実にコアダンプを生成できるよう、コアファイルのサイズ上限を制限しないことを推奨します。
PostgreSQLをsystemd経由で起動する場合、リソース制限に関する設定は/etc/systemd/system/postgresql-XX.service.d/pg_strom.conf
に記述します。
RPMによるインストールの場合、デフォルトで以下の内容が設定されます。
環境変数 CUDA_ENABLE_COREDUMP_ON_EXCEPTION
に関する設定がコメントアウトされています。これは開発者向けのオプションで、これを有効にして起動すると、GPU側でエラーが発生した場合にGPUのコアダンプを生成させる事ができます。詳しくはCUDA-GDB:GPU core dump supportをご覧ください。
[Service]
LimitNOFILE=65536
LimitCORE=infinity
#Environment=CUDA_ENABLE_COREDUMP_ON_EXCEPTION=1
PostgreSQLの起動
PostgreSQLを起動します。
正常にセットアップが完了していれば、ログにPG-StromがGPUを認識した事を示すメッセージが記録されているはずです。 以下の例では、Tesla V100(PCIe; 16GB版)を認識しています。
# systemctl start postgresql-10
# systemctl status -l postgresql-10
* postgresql-10.service - PostgreSQL 10 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-10.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2018-03-03 15:45:23 JST; 2min 21s ago
Docs: https://www.postgresql.org/docs/10/static/
Process: 24851 ExecStartPre=/usr/pgsql-10/bin/postgresql-10-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 24858 (postmaster)
CGroup: /system.slice/postgresql-10.service
|-24858 /usr/pgsql-10/bin/postmaster -D /var/lib/pgsql/10/data/
|-24890 postgres: logger process
|-24892 postgres: bgworker: PG-Strom GPU memory keeper
|-24896 postgres: checkpointer process
|-24897 postgres: writer process
|-24898 postgres: wal writer process
|-24899 postgres: autovacuum launcher process
|-24900 postgres: stats collector process
|-24901 postgres: bgworker: PG-Strom ccache-builder2
|-24902 postgres: bgworker: PG-Strom ccache-builder1
`-24903 postgres: bgworker: logical replication launcher
Mar 03 15:45:19 saba.heterodb.com postmaster[24858]: 2018-03-03 15:45:19.195 JST [24858] HINT: Run 'nvidia-cuda-mps-control -d', then start server process. Check 'man nvidia-cuda-mps-control' for more details.
Mar 03 15:45:20 saba.heterodb.com postmaster[24858]: 2018-03-03 15:45:20.509 JST [24858] LOG: PG-Strom: GPU0 Tesla V100-PCIE-16GB (5120 CUDA cores; 1380MHz, L2 6144kB), RAM 15.78GB (4096bits, 856MHz), CC 7.0
Mar 03 15:45:20 saba.heterodb.com postmaster[24858]: 2018-03-03 15:45:20.510 JST [24858] LOG: NVRTC - CUDA Runtime Compilation vertion 9.1
Mar 03 15:45:23 saba.heterodb.com postmaster[24858]: 2018-03-03 15:45:23.378 JST [24858] LOG: listening on IPv6 address "::1", port 5432
Mar 03 15:45:23 saba.heterodb.com postmaster[24858]: 2018-03-03 15:45:23.378 JST [24858] LOG: listening on IPv4 address "127.0.0.1", port 5432
Mar 03 15:45:23 saba.heterodb.com postmaster[24858]: 2018-03-03 15:45:23.442 JST [24858] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
Mar 03 15:45:23 saba.heterodb.com postmaster[24858]: 2018-03-03 15:45:23.492 JST [24858] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
Mar 03 15:45:23 saba.heterodb.com postmaster[24858]: 2018-03-03 15:45:23.527 JST [24858] LOG: redirecting log output to logging collector process
Mar 03 15:45:23 saba.heterodb.com postmaster[24858]: 2018-03-03 15:45:23.527 JST [24858] HINT: Future log output will appear in directory "log".
Mar 03 15:45:23 saba.heterodb.com systemd[1]: Started PostgreSQL 10 database server.
PG-Strom関連オブジェクトの作成
最後に、PG-Stromに関連するSQL関数などのDBオブジェクトを作成します。
この手順はPostgreSQLのEXTENSION機能を用いてパッケージ化されており、SQLコマンドラインでCREATE EXTENSION
コマンドを実行するだけです。
なお、この手順は新しいデータベースを作成するたびに必要になる事に注意してください。
新しいデータベースを作成した時点で既にPG-Strom関連オブジェクトが作成されていてほしい場合は、予めtemplate1
データベースでPG-Stromエクステンションを作成しておけば、CREATE DATABASE
コマンドの実行時に新しいデータベースへ設定がコピーされます。
$ psql postgres -U postgres
psql (10.2)
Type "help" for help.
postgres=# CREATE EXTENSION pg_strom ;
CREATE EXTENSION
以上でインストール作業は完了です。
NVME-Stromモジュール
PG-Stromとは独立した別個のソフトウェアモジュールではありますが、SSD-to-GPUダイレクトSQL実行など、PG-Stromの中核機能と密接に関係しているNVME-Stromカーネルモジュールについても本節で説明します。
モジュールの入手とインストール
他のPG-Strom関連モジュールと同様、NVME-Stromは(https://heterodb.github.io/swdc/)[HeteroDB Software Distribution Center]からフリーソフトウェアとして配布されています。すなわち、オープンソースソフトウェアではありません。
heterodb-swdc
パッケージを導入済みであれば、yum install
コマンドを用いてRPMパッケージをダウンロード、インストールする事ができます。
$ sudo yum install nvme_strom
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.cat.net
* epel: ftp.iij.ad.jp
* extras: mirrors.cat.net
* ius: mirrors.kernel.org
* updates: mirrors.cat.net
Resolving Dependencies
--> Running transaction check
---> Package nvme_strom.x86_64 0:1.3-1.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
nvme_strom x86_64 1.3-1.el7 heterodb 273 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 273 k
Installed size: 1.5 M
Is this ok [y/d/N]: y
Downloading packages:
No Presto metadata available for heterodb
nvme_strom-1.3-1.el7.x86_64.rpm | 273 kB 00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : nvme_strom-1.3-1.el7.x86_64 1/1
:
<snip>
:
DKMS: install completed.
Verifying : nvme_strom-1.3-1.el7.x86_64 1/1
Installed:
nvme_strom.x86_64 0:1.3-1.el7
Complete!
ライセンスの有効化
NVME-Stromモジュールの全ての機能を利用するには、HeteroDB社が提供するライセンスの有効化が必要です。ライセンスなしで運用する事も可能ですが、その場合、下記の機能が制限を受けます。
- 複数個のGPUの利用
- SSD-to-GPUダイレクトSQL実行におけるストライピング(md-raid0)対応
ライセンスファイルは以下のような形式でHeteroDB社から入手する事ができます。
IAgIVdKxhe+BSer3Y67jQW0+uTzYh00K6WOSH7xQ26Qcw8aeUNYqJB9YcKJTJb+QQhjmUeQpUnboNxVwLCd3HFuLXeBWMKp11/BgG0FSrkUWu/ZCtDtw0F1hEIUY7m767zAGV8y+i7BuNXGJFvRlAkxdVO3/K47ocIgoVkuzBfLvN/h9LffOydUnHPzrFHfLc0r3nNNgtyTrfvoZiXegkGM9GBTAKyq8uWu/OGonh9ybzVKOgofhDLk0rVbLohOXDhMlwDl2oMGIr83tIpCWG+BGE+TDwsJ4n71Sv6n4bi/ZBXBS498qShNHDGrbz6cNcDVBa+EuZc6HzZoF6UrljEcl=
----
VERSION:2
SERIAL_NR:HDB-TRIAL
ISSUED_AT:2019-05-09
EXPIRED_AT:2019-06-08
GPU_UUID:GPU-a137b1df-53c9-197f-2801-f2dccaf9d42f
これを /etc/heterodb.license
にコピーし、PostgreSQLを再起動します。
以下のようにPostgreSQLの起動ログにライセンス情報が出力され、ライセンスの有効化が行われた事が分かります。
$ pg_ctl restart
:
LOG: PG-Strom version 2.2 built for PostgreSQL 11
LOG: PG-Strom: GPU0 Tesla P40 (3840 CUDA cores; 1531MHz, L2 3072kB), RAM 22.38GB (384bits, 3.45GHz), CC 6.1
:
LOG: HeteroDB License: { "version" : 2, "serial_nr" : "HDB-TRIAL", "issued_at" : "9-May-2019", "expired_at" : "8-Jun-2019", "gpus" : [ { "uuid" : "GPU-a137b1df-53c9-197f-2801-f2dccaf9d42f", "pci_id" : "0000:02:00.0" } ] }
LOG: listening on IPv6 address "::1", port 5432
LOG: listening on IPv4 address "127.0.0.1", port 5432
:
カーネルモジュールパラメータ
NVME-Stromカーネルモジュールにはパラメータがあります。
パラメータ名 | 型 | 初期値 | 説明 |
---|---|---|---|
verbose |
int |
0 |
詳細なデバッグ出力を行います。 |
fast_ssd_mode |
int |
0 |
高速なNVME-SSDに適した動作モードです。 |
p2p_dma_max_depth |
int |
1024 |
NVMEデバイスのI/Oキューに同時に送出する事のできる非同期DMA要求の最大数です。 |
p2p_dma_max_unitsz |
int |
256 |
P2P DMA要求で一度に読み出すデータブロックの最大長(kB単位)です。 |
fast_ssd_mode
パラメータについての補足説明を付記します。
NVME-StromモジュールがSSD-to-GPU間のダイレクトデータ転送の要求を受け取ると、まず該当するデータブロックがOSのページキャッシュに載っているかどうかを調べます。
fast_ssd_mode
が0
の場合、データブロックが既にページキャッシュに載っていれば、その内容を呼び出し元のユーザ空間バッファに書き戻し、アプリケーションにCUDA APIを用いたHost->Device間のデータ転送を行うよう促します。これはPCIe x4接続のNVME-SSDなど比較的低速なデバイス向きの動作です。
一方、PCIe x8接続の高速SSDを使用したり、複数のSSDをストライピング構成で使用する場合は、バッファ間コピーの後で改めてHost->Device間のデータ転送を行うよりも、SSD-to-GPUのダイレクトデータ転送を行った方が効率的である事もあります。fast_ssd_mode
が0
以外の場合、NVME-StromドライバはOSのページキャッシュの状態に関わらず、SSD-to-GPUダイレクトのデータ転送を行います。
ただし、いかなる場合においてもOSのページキャッシュが dirty である場合にはSSD-to-GPUダイレクトでのデータ転送は行われません。
p2p_dma_max_depth
パラメータに関する補足説明を付記します。
NVME-Stromモジュールは、SSD-to-GPU間のダイレクトデータ転送のDMA要求を作成し、それをNVMEデバイスのI/Oキューに送出します。 NVMEデバイスの能力を越えるペースで非同期DMA要求が投入されると、NVME-SSDコントローラはDMA要求を順に処理する事になるため、DMA要求のレイテンシは極めて悪化します。(一方、NVME-SSDコントローラには切れ目なくDMA要求が来るため、スループットは最大になります) DMA要求の発行から処理結果が返ってくるまでの時間があまりにも長いと、場合によっては、これが何らかのエラーと誤認され、I/O要求のタイムアウトとエラーを引き起こす可能性があります。そのため、NVMEデバイスが遊ばない程度にDMA要求をI/Oキューに詰めておけば、それ以上のDMA要求を一度にキューに投入するのは有害無益という事になります。
p2p_dma_max_depth
パラメータは、NVMEデバイス毎に、一度にI/Oキューに投入する事のできる非同期P2P DMA要求の数を制御します。設定値以上のDMA要求を投入しようとすると、スレッドは現在実行中のDMAが完了するまでブロックされ、それによってNVMEデバイスの高負荷を避ける事が可能となります。