RE: Synchronizing slots from primary to standby
Zhijie Hou (Fujitsu) <houzj.fnst@fujitsu.com>
Attachments
- 0001-Cache-standby-slot-index.patch.txt (text/plain)
- test_3.zip (application/x-zip-compressed)
- test_2.zip (application/x-zip-compressed)
- test_1.zip (application/x-zip-compressed)
On Friday, March 8, 2024 1:09 PM shveta malik <shveta.malik@gmail.com> wrote: > On Fri, Mar 8, 2024 at 9:56 AM Ajin Cherian <itsajin@gmail.com> wrote: > > > >> Pushed with minor modifications. I'll keep an eye on BF. > >> > >> BTW, one thing that we should try to evaluate a bit more is the > >> traversal of slots in StandbySlotsHaveCaughtup() where we verify if > >> all the slots mentioned in standby_slot_names have received the > >> required WAL. Even if the standby_slot_names list is short the total > >> number of slots can be much larger which can lead to an increase in > >> CPU usage during traversal. There is an optimization that allows to > >> cache ss_oldest_flush_lsn and ensures that we don't need to traverse > >> the slots each time so it may not hit frequently but still there is a > >> chance. I see it is possible to further optimize this area by caching > >> the position of each slot mentioned in standby_slot_names in > >> replication_slots array but not sure whether it is worth. > >> > >> > > > > I tried to test this by configuring a large number of logical slots while making > sure the standby slots are at the end of the array and checking if there was any > performance hit in logical replication from these searches. > > > Thanks Nisha for conducting some additional tests and discussing with me internally. We have collected the performance data on HEAD. Basically, we don't see a noticeable difference in the performance data and StandbySlotsHaveCaughtup also does not stand out in the profile. Here are the details: > 1) Redoing XLogSendLogical time-log related test with > 'sync_replication_slots' enabled. Setup: - one primary + 3standbys + one subscriber with one active subscription - ran 15 min pgbench for all cases - hot_standby_feedback=ON and sync_replication_slots=TRUE (To maximize the impact of SearchNamedReplicationSlot clear, the standby slot is at the end of the ReplicationSlotCtl->replication_slots array in each test) Case1 - 1 slot: 895.305565 secs Case2 - 100 slots: 894.936039 secs Case3 - 500 slots: 895.256412 secs > 2) pg_recvlogical test to monitor lag in StandbySlotsHaveCaughtup() for a > large number of slots. We reran the XLogSendLogical() wait time analysis tests. Setup: - One primary node and 3 standby nodes - Created logical slots using "test_decoding" and activated one walsender by running pg_recvlogical on one slot. - hot_standby_feedback=ON and sync_replication_slots=TRUE - Did one run for each case with pgbench for 15 min (To maximize the impact of SearchNamedReplicationSlot clear, the stanbys slot is at the end of the ReplicationSlotCtl->replication_slots array in each test) Case1 - 1 slot: 894.83775 secs Case2 - 100 slots: 894.449356 secs Case3 - 500 slots: 894.98479 secs There is no noticeable regression when the number of replication slots increases. > 3) Profiling to see if StandbySlotsHaveCaughtup() is noticeable in the report > when there are a large number of slots to traverse. The setup is the same as 2). To maximize the impact of SearchNamedReplicationSlot clear, the stanbys slot is at the end of the ReplicationSlotCtl->replication_slots array. The StandbySlotsHaveCaughtup is not noticeable in the profile. 0.03% 0.00% postgres postgres [.] StandbySlotsHaveCaughtup After some investigation, it appears that the cached 'ss_oldest_flush_lsn' plays a crucial role in optimizing this workload, effectively reducing the need for frequent strcmp operations within the loop. To test the impact of frequent strcmp calls, we conducted a test by removing the 'ss_oldest_flush_lsn' check and re-evaluating the profile. This time, although the profile indicated a small increase in the StandbySlotsHaveCaughtup metric, it still does not raise significant concerns. --1.47%--NeedToWaitForWal | NeedToWaitForStandbys | StandbySlotsHaveCaughtup | | | --0.96%--SearchNamedReplicationSlot The scripts that were used to setup the test environment for all above tests are attached. The machine configuration for above tests is as follows: CPU : E7-4890v2(2.8Ghz/15core)×4 MEM : 768GB HDD : 600GB×2 OS : RHEL 7.9 While no noticeable overhead was observed in the SearchNamedReplicationSlot operation, we explored a strategy to enhance efficiency by minimizing the search for standby slots within the loop. The idea is to cache the position of each standby slot within ReplicationSlotCtl->replication_slots. We will reference the slot directly through ReplicationSlotCtl->replication_slots[index]. If the slot name matches, we will perform other checks including the restart_lsn; otherwise, SearchNamedReplicationSlot is invoked to update the index cache accordingly. This optimization can reduce the cost from O(n*m) to O(n). Note that since we didn't see the overhead in the test, I am not proposing to push this patch now. But just share the idea and a small patch in case anyone came across a workload where performance impact of SearchNamedReplicationSlot becomes noticeable. Best Regards, Hou zj
Commits
-
Doc: Add the new section "Logical Replication Failover".
- b560a98a17ae 17.0 landed
-
Fix the review comments and a bug in the slot sync code.
- 3741f2a09d52 17.0 landed
-
Fix a test in failover slots regression test.
- 7e85d1c75f29 17.0 landed
-
Fix the intermittent buildfarm failures in 040_standby_failover_slots_sync.
- 6f3d8d5e7cc2 17.0 landed
-
Split XLogCtl->LogwrtResult into separate struct members
- c9920a9068ea 17.0 cited
-
Ensure that the sync slots reach a consistent state after promotion without losing data.
- 2ec005b4e297 17.0 landed
-
Introduce a new GUC 'standby_slot_names'.
- bf279ddd1c28 17.0 landed
-
Fix BF failure introduced by commit b3f6b14cf4.
- def0ce337068 17.0 landed
-
Fixups for commit 93db6cbda0.
- b3f6b14cf48f 17.0 landed
-
Fix BF failure in commit 93db6cbda0.
- d13ff82319cc 17.0 landed
-
Add a new slot sync worker to synchronize logical slots.
- 93db6cbda037 17.0 landed
-
Improve ERROR/LOG messages added by commits ddd5f4f54a and 7a424ece48.
- 801792e528d6 17.0 landed
-
Disable autovacuum on primary in 040_standby_failover_slots_sync test.
- b7bdade6a42f 17.0 landed
-
Fix the incorrect format specifier used in commit 7a424ece48.
- b987be39c3c7 17.0 landed
-
Change the LOG level in 040_standby_failover_slots_sync.pl to DEBUG2.
- d9e225f275b7 17.0 landed
-
Add more LOG and DEBUG messages for slot synchronization.
- 7a424ece4828 17.0 landed
-
Another try to fix BF failure introduced in commit ddd5f4f54a.
- 9bc1eee988c3 17.0 landed
-
Fix BF introduced in commit ddd5f4f54a.
- bd8fc1677b88 17.0 landed
-
Add a slot synchronization function.
- ddd5f4f54a02 17.0 landed
-
Clean-ups for 776621a5e4 and 7329240437.
- 22f7e61a6330 17.0 landed
-
Enhance libpqrcv APIs to support slot synchronization.
- dafbfed9efbe 17.0 landed
-
Add a failover option to subscriptions.
- 776621a5e479 17.0 landed
-
Allow setting failover property in the replication command.
- 73292404370c 17.0 landed
-
Allow to enable failover property for replication slots via SQL API.
- c393308b69d2 17.0 landed
-
Add macros for looping through a List without a ListCell.
- 14dd0f27d7cd 17.0 cited
-
Track conflict_reason in pg_replication_slots.
- 007693f2a3ac 17.0 cited
-
Allow upgrades to preserve the full subscription's state.
- 9a17be1e244a 17.0 cited
-
Add support for incremental backup.
- dc212340058b 17.0 cited
-
Simplify some logic in CreateReplicationSlot()
- e83aa9f92fdd 17.0 cited
-
Fix uninitialized access to InitialRunningXacts during decoding after ERROR.
- c7256e6564fa 15.5 cited
-
Flexible options for CREATE_REPLICATION_SLOT.
- 0266e98c6b86 15.0 cited
-
Empty search_path in logical replication apply worker and walsender.
- 11da97024abb 14.0 cited
-
Fix oldest xmin and LSN computation across repslots after advancing
- b48df818dcbd 14.0 cited
-
Require C99 (and thus MSCV 2013 upwards).
- d9dd406fe281 12.0 cited