您好,登錄后才能下訂單哦!
這幾個(gè)補(bǔ)丁能夠通過(guò)使用PMDK對(duì)存儲(chǔ)在持久化內(nèi)存PMEM上的WAL日志進(jìn)行讀寫(xiě)。PMEM是下一代存儲(chǔ)介質(zhì),具有一系列特性:快速、字節(jié)尋址、非易失。
Pgbench是PG的通用benchmark,使用benchmark進(jìn)行測(cè)試,這些補(bǔ)丁修改后的PG比原生PG性能提升5%。使用我們的insert benchmark,能夠比原生PG快90%。下面進(jìn)行詳細(xì)描述。
這個(gè)e-mail包括以下幾部分:
A)PMDK
B)補(bǔ)丁
C)測(cè)試方法及結(jié)果
PMDK提供函數(shù)使應(yīng)用能夠直接訪問(wèn)PMEM,無(wú)需通過(guò)內(nèi)核作為內(nèi)存。API包括:
1)open PMEM文件的API、create PMEM文件的API、map PMEM文件到虛擬地址的API
????PMDK利用DAX文件系統(tǒng)特性提供這些API函數(shù)。DAX文件系統(tǒng)對(duì)PMEM敏感,允許直接訪問(wèn)PMEM,而不使用內(nèi)核的page cache??梢允褂脴?biāo)準(zhǔn)的mmap函數(shù)將DAX文件系統(tǒng)中的文件映射到內(nèi)存。更進(jìn)一步說(shuō),通過(guò)將PMEM中的文件映射到虛擬地址,應(yīng)用可以使用CPU的 load/store指令替代read/write訪問(wèn)PMEM。
2)讀寫(xiě) PMEM文件的API
PMDK提供API:類似memcpy()函數(shù),通過(guò)single instruction、multiple data instruction、NT storage instruction 將數(shù)據(jù)拷貝到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: 對(duì)加載數(shù)據(jù)進(jìn)行操作的單指令。如果SIMD系統(tǒng)一次加載8字節(jié)數(shù)據(jù)到寄存器,那么到PMEM的存儲(chǔ)操作會(huì)同時(shí)對(duì)所有8字節(jié)值進(jìn)行。
[4] NT store instructions: 該指令跳過(guò)CPU cache,因此使用該指令不需要flush。
補(bǔ)丁修改:
0001-Add-configure-option-for-PMDK.patch:添加--with-libpmem配置,通過(guò)pmdk庫(kù)執(zhí)行IO
0002-Read-write-WAL-files-using-PMDK.patch:
使用PMDK函數(shù)對(duì)WAL進(jìn)行IO操作
wal_sync_method參數(shù)增加pmem-drain,用于標(biāo)明PMEM上wal sync方式。
0003-Walreceiver-WAL-IO-using-PMDK.patch:
????對(duì)于備機(jī)的walreciver進(jìn)程,使用PMDK寫(xiě)日志。
???環(huán)境:
? 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,將之作為一個(gè)塊設(shè)備
????# ndctl list
# ndctl create-namespace -f -e namespace0.0 --mode=memory -M dev
2)在pmem上創(chuàng)建一個(gè)文件系統(tǒng),以DAX方式掛載
????# mkfs.ext4 /dev/pmem0
# mount -t ext4 -o dax /dev/pmem0 /mnt/pmem0
3)設(shè)置PMEM_IS_PMEM_FORCE,表示W(wǎng)AL文件存放在PMEM上
???注意,沒(méi)有設(shè)置這個(gè)環(huán)境變量,PG的進(jìn)程啟動(dòng)不起來(lái)
???# export PMEM_IS_PMEM_FORCE=1
4)安裝PG
???安裝Pg時(shí)有3個(gè)重要注意事項(xiàng):
a. Configure時(shí)添加--with-libpmem:"./configure --with-libpmem"
b. 將WAL目錄存放到PMEM上
c. 將wal_sync_method參數(shù)由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)執(zhí)行2個(gè)benchmark,一個(gè)是pgbench,一個(gè)是my insert benchmark
??Pgbench:
??????# numactl -N 1 pgbech -c 32 -j 8 -T 120 -M prepared [DB_NAME]
??????執(zhí)行pgbench三次的平均值:
??????wal_sync_method=fdatasync: ??tps = 43,179
wal_sync_method=pmem_drain: ?tps = 45,254
??pclinet_thread:my insert benchmark
??????準(zhǔn)備:
??????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]');
執(zhí)行:
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
?
測(cè)試三次的平均值:
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
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。