我刚遇到一个奇怪的问题。我在pgfourine中做了一个报告,发现我的XA事务开始工作的速度很慢。准备交易和提交准备合并了13.2s中的12.55s。但为什么呢?
##### Overall statistics #####
Number of unique normalized queries: 175
Number of queries: 268,772
Total query duration: 13m2s
##### Queries by type #####
SELECT: 116493 43.3%
INSERT: 15926 5.9%
UPDATE: 7935 3.0%
DELETE: 4923 1.8%
##### Queries that took up the most time (N) #####
1) 6m32s - 26,338 - COMMIT PREPARED ''
--
2) 6m23s - 25,972 - PREPARE TRANSACTION ''
--
3) 0.6s - 3,848 - update avatar set lfa_position=NULL where Id=0
.....
7) 0.3s - 21,514 - COMMIT
.....
我有一个理论,但没有证据..我有慢速光盘,我关闭了synchronous_commit。也许PostgreSQL必须在“准备事务”期间进行fsync,即使synchronous_commit已关闭?
fsync = on
synchronous_commit = off
有什么想法吗?
更新
与
相同的测试fsync = off
synchronous_commit = off
##### Overall statistics #####
Number of unique normalized queries: 155
Number of queries: 186,838
Total query duration: 6.6s
##### Queries by type #####
SELECT: 84367 45.2%
INSERT: 9197 4.9%
UPDATE: 5486 2.9%
DELETE: 2996 1.6%
##### Queries that took up the most time (N) #####
1) 1.8s - 16,972 - PREPARE TRANSACTION ''
--
2) 1.1s - 16,965 - COMMIT PREPARED ''
--
3) 0.4s - 2,904 - update avatar set lfa_position=NULL where Id=0
--
4) 0.2s - 16,031 - COMMIT
看起来fsync需要花费大量时间,但并不是所有时间。 16k提交 - 0.2秒,17k准备+提交2.9秒。
悲伤的故事。看起来XA commit比本地提交花费的时间多15倍,并且不考虑synchronous_commit设置。 fsync = off对于生产使用是不安全的。因此,如果我想使用XA事务,我必须小心使用它并使用具有高IOPS的良好SSD驱动器。答案 0 :(得分:1)
PREPARE TRANSACTION
立即同步的理论是正确的,并在文档中提到:
摘自http://www.postgresql.org/docs/9.1/static/wal-async-commit.html:
支持两阶段提交的命令,例如PREPARE TRANSACTION, 也总是同步的。