應用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]
[2]
[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 |
|
application/octet-stream |
5.1 KB |
|
application/octet-stream |
46.9 KB |
|
application/octet-stream |
4.8 KB |
原文
%40lab.ntt.co.jp
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31493717/viewspace-2653324/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 持久記憶體指令(PMDK)簡介記憶體
- Android應用優化之記憶體概念Android優化記憶體
- Redis持久化——記憶體快照(RDB)Redis持久化記憶體
- Android學習之 記憶體管理機制與應用記憶體優化Android記憶體優化
- 修改Delphi使之適應SQL Server2000 (轉)SQLServer
- 修改oracle記憶體佔用Oracle記憶體
- android 應用記憶體優化之OnLowMemory&OnTrimMemoryAndroid記憶體優化
- 應用適配資料庫還是資料庫適配應用資料庫
- RabbitMQ持久化機制、記憶體磁碟控制(四)MQ持久化記憶體
- Android應用記憶體優化方式Android記憶體優化
- 傲騰持久記憶體如何為資料賦能,加速應用落地?記憶體
- 持久記憶體程式設計記憶體程式設計
- Redis基礎篇(四)持久化:記憶體快照(RDB)Redis持久化記憶體
- Redis系列:RDB記憶體快照提供持久化能力Redis記憶體持久化
- 分析並優化 Android 應用記憶體佔用優化Android記憶體
- Android記憶體優化之記憶體快取Android記憶體優化快取
- HarmonyOS NEXT應用開發之深色模式適配模式
- eclipse 增加記憶體的方法、修改配置檔案 記憶體優化Eclipse記憶體優化
- 4GB記憶體成標配 配備大記憶體手機推薦記憶體
- 安卓元件化應用的6.0許可權適配優化方案安卓元件化優化
- Android效能優化篇之記憶體優化--記憶體洩漏Android優化記憶體
- 如何讓NoSQL記憶體資料庫適合企業級應用SQL記憶體資料庫
- Jmeter:修改記憶體配置JMeter記憶體
- golang 切片記憶體應用技巧Golang記憶體
- Java應用程式中的記憶體洩漏及記憶體管理Java記憶體
- 關於持久記憶體(PMem)你知道多少?記憶體
- Android 效能優化之記憶體優化Android優化記憶體
- Tomcat修改記憶體配置Tomcat記憶體
- 修改/dev/shm共享記憶體dev記憶體
- android 管理應用的記憶體Android記憶體
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(上)Android優化記憶體
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(下)Android優化記憶體
- Android 效能優化之記憶體洩漏檢測以及記憶體優化(中)Android優化記憶體
- mariadb 記憶體佔用優化記憶體優化
- 學習筆記:自適應佈局,多螢幕適配筆記
- Linux 效能優化之 記憶體 篇Linux優化記憶體
- Android效能優化之記憶體篇Android優化記憶體
- Android記憶體優化之圖片優化Android記憶體優化