這幾個補丁能夠通過使用pmdk對儲存在持久化記憶體pmem上的wal日誌進行讀寫。pmem是下一代儲存介質,具有一系列特性:快速、位元組定址、非易失。
pgbench是pg的通用benchmark,使用benchmark進行測試,這些補丁修改後的pg比原生pg效能提公升5%。使用我們的insert benchmark,能夠比原生pg快90%。下面進行詳細描述。
這個e-mail包括以下幾部分:
a)pmdk
b)補丁
c)測試方法及結果
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
0001-add-configure-option-for-pmdk.patch
5.1 kb
0002-read-write-wal-files-using-pmdk.patch
46.9 kb
0003-walreceiver-wal-io-using-pmdk.patch
4.8 kb
修改Eclipse專案使之支援JPA工具
修改eclipse專案使之支援jpa工具 用eclipse建立了乙個web專案,想通過eclipse的jpa tools為專案生成資料庫實體bean,但右鍵選單裡看不到jpa tools選項。於是招到乙個類似的專案 能夠右鍵看到jpa tools 檢視其工程路徑下.setting org.eclip...
修改Eclipse專案使之支援JPA工具
修改eclipse專案使之支援jpa工具 用eclipse建立了乙個web專案,想通過eclipse的jpa tools為專案生成資料庫實體bean,但右鍵選單裡看不到jpa tools選項。於是招到乙個類似的專案 能夠右鍵看到jpa tools 檢視其工程路徑下.setting org.eclip...
mysql修改指定記錄 sql操作之修改記錄值
mysql修改 刪除資料記錄 用update修改記錄 update tbl name set 要更改的列 where 要更新的記錄 這裡的 where 子句是可選的,因此如果不指定的話,表中的每個記錄都被更新。例如,在pet表中,我們發現寵物whistler的性別沒有指定,因此我們可以這樣修改這個記...