From: | Jose Luis Tallon <jltallon(at)adv-solutions(dot)net> |
---|---|
To: | Andres Freund <andres(at)anarazel(dot)de>, "Jonathan S(dot) Katz" <jkatz(at)postgresql(dot)org> |
Cc: | Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Let's make PostgreSQL multi-threaded |
Date: | 2023-06-08 12:01:16 |
Message-ID: | d4bbfc52-24e6-2f09-13b6-62399829dcdf@adv-solutions.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 7/6/23 23:37, Andres Freund wrote:
> [snip]
> I think we're starting to hit quite a few limits related to the process model,
> particularly on bigger machines. The overhead of cross-process context
> switches is inherently higher than switching between threads in the same
> process - and my suspicion is that that overhead will continue to
> increase. Once you have a significant number of connections we end up spending
> a *lot* of time in TLB misses, and that's inherent to the process model,
> because you can't share the TLB across processes.
IMHO, as one sysadmin who has previously played with Postgres on "quite
large" machines, I'd propose what most would call a "hybrid model"....
* Threads are a very valuable addition for the "frontend" of the server.
Most would call this a built-in session-aware connection pooler :)
Heikki's (and others') efforts towards separating connection state
into discrete structs is clearly a prerequisite for this;
Implementation-wise, just toss the connState into a TLS[thread-local
storage] variable and many problems just vanish.
Postgres wouldn't be the first to adopt this approach, either...
* For "heavyweight" queries, the scalability of "almost independent"
processes w.r.t. NUMA is just _impossible to achieve_ (locality of
reference!) with a pure threaded system. When CPU+mem-bound
(bandwidth-wise), threads add nothing IMO.
Indeed a separate postmaster is very much needed in order to control the
processes / guard overall integrity.
Hence, my humble suggestion is to consider a hybrid architecture which
benefits from each model's strengths. I am quite convinced that
transition would be much safer and simpler (I do share most of Tom and
other's concerns...)
Other projects to draw inspiration from:
* Postfix -- multi-process, postfix's master guards processes and
performs privileged operations; unprivileged "subsystems". Interesting
IPC solutions
* Apache -- MPMs provide flexibility and support for e.g. non-threaded
workloads (PHP is the most popular; cfr. "prefork" multi-process MPM)
* NginX is actually multi-process (one per CPU) + event-based
(multiplexing) ...
* PowerDNS is internally threaded, but has a "guardian" process. Seems
to be evolving to a more hybrid model.
I would suggest something along the lines of :
* postmaster -- process supervision and (potentially privileged)
operations; process coordination (i.e descriptor passing); mostly as-is
* *frontend* -- connection/session handling; possibly even event-driven
* backends -- process heavyweight queries as independently as possible.
Can span worker threads AND processes when needed
* *dispatcher* -- takes care of cached/lightweight queries (cached
catalog / full snapshot visibility+processing)
* utility processes can be left "as is" mostly, except to be made
multi-threaded for heavy-sync ones (e.g. vacuum workers, stat workers)
For fixed-size buffers, i.e. pages / chunks, I'd say mmaped (anonymous)
shared memory isn't that bad... but haven't read the actual code in years.
For message queues / invalidation messages, i guess that shmem-based
sync is really a nuisance. My understanding is that Linux-specific (i.e.
eventfd) mechanisms aren't quite considered .. or are they?
> The amount of duplicated code we have to deal with due to to the process model
> is quite substantial. We have local memory, statically allocated shared memory
> and dynamically allocated shared memory variants for some things. And that's
> just going to continue.
Code duplication is indeed a problem... but I wouldn't call "different
approaches/solution for very similar problems depending on
context/requirement" a duplicate. I might well be wrong / lack detail,
though... (again: haven't read PG's code for some years already).
Just my two cents.
Thanks,
J.L.
--
Parkinson's Law: Work expands to fill the time alloted to it.
From | Date | Subject | |
---|---|---|---|
Next Message | shveta malik | 2023-06-08 12:01:49 | Re: Support logical replication of DDLs |
Previous Message | Andrew Dunstan | 2023-06-08 12:00:49 | Re: Let's make PostgreSQL multi-threaded |