Re: Adding locks statistics
Michael Paquier <michael@paquier.xyz>
From: Michael Paquier <michael@paquier.xyz>
To: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Cc: Jeff Davis <pgsql@j-davis.com>, Greg Sabino Mullane <htamfids@gmail.com>, pgsql-hackers@lists.postgresql.org
Date: 2026-02-13T07:36:57Z
Lists: pgsql-hackers
On Tue, Feb 10, 2026 at 07:30:50AM +0000, Bertrand Drouvot wrote: > New rebase due to 73d60ac385a. I have been looking at this patch, and can get behind the data gathered here in terms of being able to tune things, but not all. See below for the details of my reasoning. max_locks_per_xact is a PGC_POSTMASTER, so backend-level stats with this data would not be relevant for its tuning. However, something else can be said about deadlock_timeout, where one could rely on the data gathered by this view to set it on a backend basis, particularly if the load pattern is divided into a subsets of connections (say few backend see a lot of the deadlock_timeout, for example). Same argument for lock_timeout, which is user-settable. As the set of data gathered, I think that I'm OK with timeouts (for lock_timeout), deadlock_timeouts (for deadlock_timeout), fastpath (for max_locks_per_xact), that can all be compared with the number of requests. Regarding "deadlocks" and "waits", these two are less useful than the three others because not really actionable. They would become much more relevant if and only if we know the distribution of the deadlocks not only for the lock types, but for the objects involved, especially if the activity is diluted across many objects. So these have less value IMO because they are not really actionable in the system. The other three can be directly tuned based on the GUCs we have. So my suggestion for the moment would be to be more frugal (yeah I know, sorry..) and limit ourselves to four fields: deadlock_timeout, requests, fastpath and timeouts. Three fields to compare with requests, one for each GUC. Regarding the implementation, you are right to use a fixed-sized stats kind for the job. I can see a lot of code has been copy-pasted from pgstat_io.c, then slightly adjusted to fit into the picture. That's fine here, it makes the implementation straight-forward to read. Regarding the documentation, listing all the values for locktype is a recipe for rot. I'd suggest to remove the list instead, with only a link referring to pg_locks to avoid the duplication. -- Michael
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix injection point detach timing problem in TAP test for lock stats
- 3284e3f63cf0 19 (unreleased) landed
-
Use single LWLock for lock statistics in pgstats
- 404a17c155ac 19 (unreleased) landed
-
Add tests for lock statistics, take two
- 557a9f1e3e62 19 (unreleased) landed
-
Remove isolation test lock-stats
- 7c64d56fd976 19 (unreleased) landed
-
Avoid including clog.h in proc.h
- f227b7b20c36 19 (unreleased) landed
-
Don't include storage/lock.h in so many headers
- 2102ebb1953f 19 (unreleased) landed
-
Add support for lock statistics in pgstats
- 4019f725f5d4 19 (unreleased) landed
-
Move some code blocks in lock.c and proc.c
- a90d86518243 19 (unreleased) landed
-
Move declarations related to locktags from lock.h to new locktag.h
- 322bab79744d 19 (unreleased) landed