Re: PATCH: logical_work_mem and logical streaming of large in-progress transactions
Alexey Kondratov <a.kondratov@postgrespro.ru>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Tighten the concurrent abort check during decoding.
- 2ce353fc1902 14.0 landed
-
Improve hash_create()'s API for some added robustness.
- b3817f5f7746 14.0 landed
-
Use HASH_BLOBS for xidhash.
- a1b8aa1e4eec 14.0 landed
-
Fix initialization of RelationSyncEntry for streaming transactions.
- 69bd60672af6 14.0 landed
-
Remove unused function declaration in logicalproto.h.
- ddd5f6d2609b 14.0 landed
-
Add additional tests to test streaming of in-progress transactions.
- 58b5ae9d62bd 14.0 landed
-
Fix inline marking introduced in commit 464824323e.
- ac15b499f7f9 14.0 landed
-
Add support for streaming to built-in logical replication.
- 464824323e57 14.0 landed
-
Fix the SharedFileSetUnregister API.
- 4ab77697f67a 14.0 landed
-
Fix comment in procarray.c
- 77c7267c37f7 14.0 cited
-
Suppress compiler warning in non-cassert builds.
- e942af7b8261 14.0 cited
-
Extend the BufFile interface.
- 808e13b282ef 14.0 landed
-
Mark a few logical decoding related variables with PGDLLIMPORT.
- b48cac3b10a0 14.0 landed
-
Implement streaming mode in ReorderBuffer.
- 7259736a6e5b 14.0 landed
-
Extend the logical decoding output plugin API with stream methods.
- 45fdc9738b36 14.0 landed
-
WAL Log invalidations at command end with wal_level=logical.
- c55040ccd017 14.0 landed
-
Immediately WAL-log subtransaction and top-level XID association.
- 0bead9af484c 14.0 landed
-
Allow logical replication to transfer data in binary format.
- 9de77b545313 14.0 cited
-
Only superuser can set sslcert/sslkey in postgres_fdw user mappings
- cebf9d6e6ee1 13.0 cited
-
Track statistics for spilling of changes from ReorderBuffer.
- 9290ad198b15 13.0 landed
-
Add logical_decoding_work_mem to limit ReorderBuffer memory usage.
- cec2edfa7859 13.0 landed
-
logical decoding: process ASSIGNMENT during snapshot build
- bac2fae05c77 13.0 cited
-
Emit invalidations to standby for transactions without xid.
- c6ff84b06a68 9.6.0 cited
On 22.10.2019 20:22, Tomas Vondra wrote: > On Tue, Oct 22, 2019 at 11:01:48AM +0530, Dilip Kumar wrote: >> On Tue, Oct 22, 2019 at 10:46 AM Amit Kapila >> <amit.kapila16@gmail.com> wrote: >> In general, yours and Alexy's test results >>> show that there is merit by having workers applying such transactions. >>> OTOH, as noted above [1], we are also worried about the performance >>> of Rollbacks if we follow that approach. I am not sure how much we >>> need to worry about Rollabcks if commits are faster, but can we think >>> of recording the changes in memory and only write to a file if the >>> changes are above a certain threshold? I think that might help saving >>> I/O in many cases. I am not very sure if we do that how much >>> additional workers can help, but they might still help. I think we >>> need to do some tests and experiments to figure out what is the best >>> approach? What do you think? >> I agree with the point. I think we might need to do some small >> changes and test to see what could be the best method to handle the >> streamed changes at the subscriber end. >> >>> >>> Tomas, Alexey, do you have any thoughts on this matter? I think it is >>> important that we figure out the way to proceed in this patch. >>> >>> [1] - >>> https://www.postgresql.org/message-id/b25ce80e-f536-78c8-d5c8-a5df3e230785%40postgrespro.ru >>> >> > > I think the patch should do the simplest thing possible, i.e. what it > does today. Otherwise we'll never get it committed. > I have to agree with Tomas, that keeping things as simple as possible should be a main priority right now. Otherwise, the entire patch set will pass next release cycle without being committed at least partially. In the same time, it resolves important problem from my perspective. It moves I/O overhead from primary to replica using large transactions streaming, which is a nice to have feature I guess. Later it would be possible to replace logical apply worker with bgworkers pool in a separated patch, if we decide that it is a viable solution. Anyway, regarding the Amit's questions: - I doubt that maintaining a separate buffer on the apply side before spilling to disk would help enough. We already have ReorderBuffer with logical_work_mem limit, and if we exceeded that limit on the sender side, then most probably we exceed it on the applier side as well, excepting the case when this new buffer size will be significantly higher then logical_work_mem to keep multiple open xacts. - I still think that we should optimize database for commits, not rollbacks. BGworkers pool is dramatically slower for rollbacks-only load, though being at least twice as faster for commits-only. I do not know how it will perform with real life load, but this drawback may be inappropriate for such a general purpose database like Postgres. - Tomas' implementation of streaming with spilling does not have this bias between commits/aborts. However, it has a noticeable performance drop (~x5 slower compared with master [1]) for large transaction consisting of many small rows. Although it is not of an order of magnitude slower. Another thing is it that about a year ago I have found some problems with MVCC/visibility and fixed them somehow [1]. If I get it correctly Tomas adapted some of those fixes into his patch set, but I think that this part should be reviewed carefully again. I would be glad to check it, but now I am a little bit confused with all the patch set variants in the thread. Which is the last one? Is it still dependent on 2pc decoding? [1] https://www.postgresql.org/message-id/flat/40c38758-04b5-74f4-c963-cf300f9e5dff%40postgrespro.ru#98d06fefc88122385dacb2f03f7c30f7 Thanks for moving this patch forward! -- Alexey Kondratov Postgres Professional https://www.postgrespro.com Russian Postgres Company