Re: optimizing pg_upgrade's once-in-each-database steps
Ilya Gladyshev <ilya.v.gladyshev@gmail.com>
On 22.07.2024 21:07, Nathan Bossart wrote: > On Fri, Jul 19, 2024 at 04:21:37PM -0500, Nathan Bossart wrote: >> However, while looking into this, I noticed that only one get_query >> callback (get_db_subscription_count()) actually customizes the generated >> query using information in the provided DbInfo. AFAICT we can do this >> particular step without running a query in each database, as I mentioned >> elsewhere [0]. That should speed things up a bit and allow us to simplify >> the AsyncTask code. >> >> With that, if we are willing to assume that a given get_query callback will >> generate the same string for all databases (and I think we should), we can >> run the callback once and save the string in the step for dispatch_query() >> to use. This would look more like what you suggested in the quoted text. > Here is a new patch set. I've included the latest revision of the patch to > fix get_db_subscription_count() from the other thread [0] as 0001 since I > expect that to be committed soon. I've also moved the patch that moves the > "live_check" variable to "user_opts" to 0002 since I plan on committing > that sooner than later, too. Otherwise, I've tried to address all feedback > provided thus far. > > [0] https://commitfest.postgresql.org/49/5135/ > Hi, I like your idea of parallelizing these checks with async libpq API, thanks for working on it. The patch doesn't apply cleanly on master anymore, but I've rebased locally and taken it for a quick spin with a pg16 instance of 1000 empty databases. Didn't see any regressions with -j 1, there's some speedup with -j 8 (33 sec vs 8 sec for these checks). One thing that I noticed that could be improved is we could start a new connection right away after having run all query callbacks for the current connection in process_slot, instead of just returning and establishing the new connection only on the next iteration of the loop in async_task_run after potentially sleeping on select. +1 to Jeff's suggestion that perhaps we could reuse connections, but perhaps that's a separate story. Regards, Ilya
Commits
-
Introduce framework for parallelizing various pg_upgrade tasks.
- 40e2e5e92b7d 18.0 landed
-
pg_upgrade: Parallelize WITH OIDS check.
- f93f5f7b984e 18.0 landed
-
pg_upgrade: Parallelize contrib/isn check.
- 9db3018cf83b 18.0 landed
-
pg_upgrade: Parallelize data type checks.
- bbf83cab98f2 18.0 landed
-
pg_upgrade: Parallelize encoding conversion check.
- c880cf258864 18.0 landed
-
pg_upgrade: Parallelize incompatible polymorphics check.
- cf2f82a37cc3 18.0 landed
-
pg_upgrade: Parallelize postfix operator check.
- c34eabfbbfd3 18.0 landed
-
pg_upgrade: Parallelize retrieving extension updates.
- 6ab8f27bc716 18.0 landed
-
pg_upgrade: Parallelize retrieving loadable libraries.
- 46cad8b31927 18.0 landed
-
pg_upgrade: Parallelize retrieving relation information.
- 6d3d2e8e541f 18.0 landed
-
pg_upgrade: Parallelize subscription check.
- 7baa36de58bd 18.0 landed
-
pg_upgrade: Move live_check variable to user_opts.
- 4b56bb4ab485 18.0 landed
-
pg_upgrade: run all data type checks per connection
- 347758b12063 17.0 cited