Re: Should we increase the default vacuum_cost_limit?
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Andrew Dunstan <andrew.dunstan@2ndquadrant.com>
Cc: David Rowley <david.rowley@2ndquadrant.com>,
Jeff Janes <jeff.janes@gmail.com>,
Jeremy Schneider <schnjere@amazon.com>,
Joe Conway <mail@joeconway.com>, Peter Geoghegan <pg@bowt.ie>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2019-03-09T03:11:26Z
Lists: pgsql-hackers
I wrote: > [ worries about overflow with VacuumCostLimit approaching INT_MAX ] Actually, now that I think a bit harder, that disquisition was silly. In fact, I'm inclined to argue that the already-committed patch is taking the wrong approach, and we should revert it in favor of a different idea. The reason is this: what we want to do is throttle VACUUM's I/O demand, and by "throttle" I mean "gradually reduce". There is nothing gradual about issuing a few million I/Os and then sleeping for many milliseconds; that'll just produce spikes and valleys in the I/O demand. Ideally, what we'd have it do is sleep for a very short interval after each I/O. But that's not too practical, both for code-structure reasons and because most platforms don't give us a way to so finely control the length of a sleep. Hence the design of sleeping for awhile after every so many I/Os. However, the current settings are predicated on the assumption that you can't get the kernel to give you a sleep of less than circa 10ms. That assumption is way outdated, I believe; poking around on systems I have here, the minimum delay time using pg_usleep(1) seems to be generally less than 100us, and frequently less than 10us, on anything released in the last decade. I propose therefore that instead of increasing vacuum_cost_limit, what we ought to be doing is reducing vacuum_cost_delay by a similar factor. And, to provide some daylight for people to reduce it even more, we ought to arrange for it to be specifiable in microseconds not milliseconds. There's no GUC_UNIT_US right now, but it's time. (Perhaps we should also look into using other delay APIs, such as nanosleep(2), where available.) I don't have any particular objection to kicking up the maximum value of vacuum_cost_limit by 10X or so, if anyone's hot to do that. But that's not where we ought to be focusing our concern. And there really is a good reason, not just nannyism, not to make that setting huge --- it's just the wrong thing to do, as compared to reducing vacuum_cost_delay. regards, tom lane
Commits
-
Allow fractional input values for integer GUCs, and improve rounding logic.
- 1a83a80a2fe5 12.0 landed
-
Reduce the default value of autovacuum_vacuum_cost_delay to 2ms.
- cbccac371c79 12.0 landed
-
Revert "Increase the default vacuum_cost_limit from 200 to 2000"
- 52985e4fea75 12.0 landed
-
Convert [autovacuum_]vacuum_cost_delay into floating-point GUCs.
- caf626b2cd47 12.0 landed
-
Include GUC's unit, if it has one, in out-of-range error messages.
- 28a65fc3607a 12.0 landed
-
Disallow NaN as a value for floating-point GUCs.
- ac75959cdc07 12.0 landed
- f9ec64df8f25 10.8 landed
- e04bb261633d 9.4.22 landed
- d8f8183c0467 9.5.17 landed
- bc2232f2f544 11.3 landed
- 5aafedc2fdbd 9.6.13 landed
-
Increase the default vacuum_cost_limit from 200 to 2000
- bd09503e633b 12.0 landed