千家信息网

应用PMDK修改WAL操作使之适配持久化内存

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,应用PMDK修改WAL操作使之适配持久化内存这几个补丁能够通过使用PMDK对存储在持久化内存PMEM上的WAL日志进行读写。PMEM是下一代存储介质,具有一系列特性:快速、字节寻址、非易失。Pgben
千家信息网最后更新 2025年11月07日应用PMDK修改WAL操作使之适配持久化内存

应用PMDK修改WAL操作使之适配持久化内存

这几个补丁能够通过使用PMDK对存储在持久化内存PMEM上的WAL日志进行读写。PMEM是下一代存储介质,具有一系列特性:快速、字节寻址、非易失。

Pgbench是PG的通用benchmark,使用benchmark进行测试,这些补丁修改后的PG比原生PG性能提升5%。使用我们的insert benchmark,能够比原生PG快90%。下面进行详细描述。

这个e-mail包括以下几部分:

A)PMDK

B)补丁

C)测试方法及结果

PMDK

PMDK提供函数使应用能够直接访问PMEM,无需通过内核作为内存。API包括:

1)open PMEM文件的API、create PMEM文件的API、map PMEM文件到虚拟地址的API

PMDK利用DAX文件系统特性提供这些API函数。DAX文件系统对PMEM敏感,允许直接访问PMEM,而不使用内核的page cache。可以使用标准的mmap函数将DAX文件系统中的文件映射到内存。更进一步说,通过将PMEM中的文件映射到虚拟地址,应用可以使用CPU的 load/store指令替代read/write访问PMEM。

2)读写 PMEM文件的API

PMDK提供API:类似memcpy()函数,通过single instruction、multiple data instruction、NT storage instruction 将数据拷贝到PMEM。这些指令能够提升拷贝性能。因此这些API比read/write更快。API参考:

[1] http://pmem.io/pmdk/

[2]https://www.usenix.org/system/files/login/articles/login_summer17_07_rudoff.pdf

[3] SIMD: 对加载数据进行操作的单指令。如果SIMD系统一次加载8字节数据到寄存器,那么到PMEM的存储操作会同时对所有8字节值进行。

[4] NT store instructions: 该指令跳过CPU cache,因此使用该指令不需要flush。

补丁

补丁修改:

0001-Add-configure-option-for-PMDK.patch:添加--with-libpmem配置,通过pmdk库执行IO

0002-Read-write-WAL-files-using-PMDK.patch:

使用PMDK函数对WAL进行IO操作

wal_sync_method参数增加pmem-drain,用于标明PMEM上wal sync方式。

0003-Walreceiver-WAL-IO-using-PMDK.patch:

对于备机的walreciver进程,使用PMDK写日志。

执行方式及结果

环境:

Server: HP ProLiant DL360 Gen9

CPU: Xeon E5-2667 v4 (3.20GHz); 2 processors(without HT)

DRAM: DDR4-2400; 32 GiB/processor

(8GiB/socket x 4 sockets/processor) x 2 processors

NVDIMM: DDR4-2133; 32 GiB/processor

(8GiB/socket x 4 sockets/processor) x 2 processors

HDD: Seagate Constellation2 2.5inch SATA 3.0. 6Gb/s 1TB 7200rpm x 1

OS: Ubuntu 16.04, linux-4.12

DAX FS: ext4

NVML: master(at)Aug 30, 2017

PostgreSQL: master

Note: I bound the postgres processes to one NUMA node, and the benchmarks to other NUMA node.

1)配置pmem,将之作为一个块设备

# ndctl list

# ndctl create-namespace -f -e namespace0.0 --mode=memory -M dev

2)在pmem上创建一个文件系统,以DAX方式挂载

# mkfs.ext4 /dev/pmem0

# mount -t ext4 -o dax /dev/pmem0 /mnt/pmem0

3)设置PMEM_IS_PMEM_FORCE,表示WAL文件存放在PMEM上

注意,没有设置这个环境变量,PG的进程启动不起来

# export PMEM_IS_PMEM_FORCE=1

4)安装PG

安装Pg时有3个重要注意事项:

a. Configure时添加--with-libpmem:"./configure --with-libpmem"

b. 将WAL目录存放到PMEM上

c. 将wal_sync_method参数由fdatasync改为pmem_drain

具体操作:

# cd /path/to/[PG_source dir]

# ./configure --with-libpmem

# make && make install

# initdb /path/to/PG_DATA -X /mnt/pmem0/path/to/[PG_WAL dir]

# cat /path/to/PG_DATA/postgresql.conf | sed -e s/#wal_sync_method\ =\

fsync/wal_sync_method\ =\ pmem_drain/ > /path/to/PG_DATA/postgresql.conf.

tmp

# mv /path/to/PG_DATA/postgresql.conf.tmp /path/to/PG_DATA/postgresql.conf

# pg_ctl start -D /path/to/PG_DATA

# created [DB_NAME]

5)执行2个benchmark,一个是pgbench,一个是my insert benchmark

Pgbench:

# numactl -N 1 pgbech -c 32 -j 8 -T 120 -M prepared [DB_NAME]

执行pgbench三次的平均值:

wal_sync_method=fdatasync: tps = 43,179

wal_sync_method=pmem_drain: tps = 45,254

pclinet_thread:my insert benchmark

准备:

CREATE TABLE [TABLE_NAME] (id int8, value text);

ALTER TABLE [TABLE_NAME] ALTER value SET STORAGE external;

PREPARE insert_sql (int8) AS INSERT INTO %s (id, value) values ($1, '

[1K_data]');

执行:

BEGIN; EXECUTE insert_sql(%lld); COMMIT;

Note: I ran this quer 5M times with 32 threads.

# ./pclient_thread

Invalid Arguments:

Usage: ./pclient_thread [The number of threads] [The number to insert

tuples] [data size(KB)]

# numactl -N 1 ./pclient_thread 32 5242880 1

测试三次的平均值:

wal_sync_method=fdatasync: tps = 67,780

wal_sync_method=pmem_drain: tps = 131,962

Attachment

Content-Type

Size

0001-Add-configure-option-for-PMDK.patch

application/octet-stream

5.1 KB

0002-Read-write-WAL-files-using-PMDK.patch

application/octet-stream

46.9 KB

0003-Walreceiver-WAL-IO-using-PMDK.patch

application/octet-stream

4.8 KB

原文

https://www.postgresql.org/message-id/C20D38E97BCB33DAD59E3A1%40lab.ntt.co.jp


文件 函数 指令 系统 补丁 内存 应用 字节 数据 方式 存储 测试 内核 参数 地址 平均值 性能 拷贝 日志 特性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 随着手机网络技术技术的发展 软件开发实训实践目的 魔兽世界 亡语者服务器 wind数据库下载官网 抵制网络安全的手抄报 江苏计算机软件开发价钱 多人访问服务器是分布计算吗 对学校校园网络安全清查机制 DNS服务器没响应怎么办 台州金控金融软件开发 mc服务器稳定有什么好处 高二网络技术说课稿 抚州高性价比服务器哪家可靠 北京通讯软件开发服务品质保障 政府类软件开发 asp 数据库值赋给变量 浪潮服务器怎么重置管理密码 关系数据库的主键外键 湖北品质软件开发设施价钱 网络安全的事例与分析 数据库管理与应用心得总结 上海瑞鹰互联网科技 查询数据库平台 软件开发商业项目 杨荣杰网络安全 西奥电梯软件开发工程师薪资 基站软件开发的跟踪岗位 守护网络安全我们应该这么做 失落的方舟欧美服怎么换服务器 我的世界跑酷服务器手机
0