https://heterodb.github.io/swdc/
以pg10为例
https://heterodb.github.io/swdc/yum/rhel7-x86_64/nvme_strom-1.9-5.el7.x86_64.rpm
https://heterodb.github.io/swdc/yum/rhel7-x86_64/pg_strom-PG10-2.0-181227.el7.x86_64.rpm
PG-Strom安装
RPM安装
PG-Strom和相关软件包从HeteroDB软件分发中心分发。如果添加了存储库定义,则不需要很多任务。
我们为每个基础PostgreSQL版本提供PG-Strom的单独RPM包。pg_strom-PG96package是为PostgreSQL 9.6 pg_strom-PG10构建的,也是为PostgreSQL v10构建的。
$ 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!
这就是包安装的全部内容。
安装后设置
创建数据库集群
数据库集群尚未构建,运行initdb命令设置PostgreSQL的初始数据库。
RPM安装上的数据库集群的默认路径是/var/lib/pgsql/
$ 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.conf哪个是PostgreSQL的配置文件。以下参数应至少编辑为PG-Strom。根据系统使用情况和预期工作负载调查其他参数。
shared_preload_libraries
必须在启动postmaster进程时加载PG-Strom模块shared_preload_libraries。无法按需加载。因此,您必须添加以下配置。
shared_preload_libraries = '$libdir/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执行应用于处理大于系统物理RAM大小的处理。
work_mem
虽然它取决于工作负载,但初始配置work_mem太小,无法在分析查询上选择最佳查询执行计划。
一个典型的例子是,可以选择基于磁盘的合并排序,而不是内存中的快速排序。
因此,我们建议将变量扩展到一定的余量。
work_mem = 1GB
启动PostgreSQL
启动PostgreSQL服务。
如果PG-Strom设置得当,它会写出显示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函数。这些步骤使用PostgreSQL的EXTENSION功能打包。因此,您需要运行的所有操作都CREATE EXTENSION在SQL命令行上。
请注意,每个新数据库都需要此步骤。如果您希望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模块
本节还介绍了NVME-Strom Linux内核模块,它与PG-Strom的核心功能密切配合,如SSD-to-GPU直接SQL执行,即使它是一个独立的软件模块。
获取模块和安装
与其他PG-Strom相关的模块一样,NVME-Strom作为免费软件分发在(https://heterodb.github.io/swdc/)[HeteroDB软件分发中心]。换句话说,它不是一个开源软件。
如果您的系统已安装heterodb-swdc包,则yum install命令下载RPM文件并安装nvme_strom包。
$ 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
:
:
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!
许可证激活
需要许可证才能使用HeteroDB,Inc。提供的NVME-Strom模块的所有功能。您可以在没有许可证的情况下操作系统,但以下功能受到限制。 - 支持多个GPU - 在SSD-to-GPU Direct SQL上支持条带化(md-raid0)
您可以从HeteroDB,Inc获得许可文件,如下面的纯文本。
IAwPOAC44m8LPMoV7bMykhxM27LAVrktspcaMHki8pI1fXrxq0KzqPDK4LzAA9n26IRAr/4ymB6QJ3/JxZOfYTVsbWq66vEtTAIuZVmJ/I888zRATj1hoofh1WbIwd3/ix28Cy1v16KCgLrlqPsra6NJScMOOHnuYoWWmWe4ml+n6GVEIb7ChUJvZbEZSO/DiLXosFc0N+MD4JTEU/XsBUP9ufacpbosW/YG2nOib3mpvhkfn7RQy2T5CVQeuGjM9Taj7DN5xipqU/Q0hZaZKA8EsZwsB6b4c7usdmPILyIpuTrWnEbjJ6worOQWHA+nL87xkDL1XYGH6UVc291QPLwk=
----
VERSION:1
SERIAL_NR:HDB-TRIAL
ISSUED_AT:2018-08-16
EXPIRED_AT:2018-09-15
NR_GPUS:1
LICENSEE_ORG:Capybara Kingdom
LICENSEE_NAME:Herr.Wassershweine
LICENSEE_MAIL:capybara@examplecom
将许可证文件复制到/etc/heterodb.license,然后重新启动PostgreSQL。
PostgreSQL的启动日志消息转储许可证信息,它告诉我们许可证激活已成功完成。
$ pg_ctl restart
:
LOG: PG-Strom built for PostgreSQL 11
LOG: PG-Strom: GPU0 Tesla V100-PCIE-16GB (5120 CUDA cores; 1380MHz, L2 6144kB), RAM 15.78GB (4096bits, 856MHz), CC 7.0
:
:
LOG: HeteroDB License: { "version" : 1, "serial_nr" : "HDB-TRIAL", "issued_at" : "16-Aug-2018", "expired_at" : "15-Sep-2018", "nr_gpus" : 1, "licensee_org" : "Capybara Kingdom", "licensee_name" : "Herr.Wassershweine", "licensee_mail" : "capybara@examplecom" }
LOG: listening on IPv6 address "::1", port 5432
LOG: listening on IPv4 address "127.0.0.1", port 5432
LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
:
内核模块参数
NVME-Strom Linux内核模块有一些参数。
参数 类型 默认 描述
verbose int 0 启用详细的调试输出
stat_info int 1 启用性能统计信息
fast_ssd_mode int 0 快速NVME-SSD的操作模式
p2p_dma_max_depth int 48 异步P2P DMA请求的最大数量可以在NVME设备的I / O队列中排队
p2p_dma_max_unitsz int 256 以kB为单位的最大数据块长度,由一个P2P DMA请求一次读取
这是fast_ssd_mode参数的额外解释。
当NVME-Strom Linux内核模块获得SSD到GPU直接数据传输的请求时,首先,它检查所需的数据块是否是操作系统的页面缓存上的缓存。如果fast_ssd_mode是0,NVME-Strom会将所需数据块的页面缓存写回调用者的用户空间缓冲区,然后指示应用程序通过CUDA API调用正常主机 - >设备数据传输。它适用于非快速NVME-SSD,如PCIe x4等级。
另一方面,SSD-to-GPU直接数据传输可能更快,如果您使用PCIe x8级快速NVME-SSD或在条带模式下使用多个SSD,比正常主机 - >缓冲区复制后的设备数据传输。如果fast_ssd_mode不是这样0,无论页面缓存状态如何,NVME-Strom都会启动SSD到GPU的直接数据传输。
但是,如果页面缓存很脏,它将永远不会启动SSD到GPU的直接数据传输。
这是p2p_dma_max_depth参数的额外解释。
NVME-Strom Linux内核模块对SSD到GPU的直接数据传输进行DMA请求,然后将它们排入源NVME设备的I / O队列。当异步DMA请求排队的次数超过NVME设备的容量时,各个DMA请求的延迟变得非常糟糕,因为NVME-SSD控制器按到达顺序处理DMA请求。(另一方面,它最大化了吞吐量,因为NVME-SSD控制器连续接收DMA请求。)如果DMA请求的周转时间太长,可能会被错误地视为错误,那么可能导致I / O超时请求并返回错误状态。因此,将更多的DMA请求排入I / O队列比使用NVME设备的合理数量的待处理请求更有意义。
p2p_dma_max_depth参数控制每个NVME设备可以一次排队的异步P2P DMA请求的数量。如果应用程序尝试将DMA请求排队多于配置,则调用程序线程将阻塞,直到正在运行的DMA完成。因此,它可以避免无意识的高负载NVME设备。