> On 14 Jun 2024, at 10:46, Dmitry Dolgov <9erthali...@gmail.com> wrote:
> 
>> On Thu, Jun 13, 2024 at 10:30:24AM GMT, Andres Freund wrote:
>>>> To investigate a report of both postgres and pgbouncer having issues when a
>>>> lot of new connections aree established, I used pgbench -C.  Oddly, on an
>>>> early attempt, the bottleneck wasn't postgres+pgbouncer, it was pgbench. 
>>>> But
>>>> only when using TCP, not with unix sockets.
>>>> 
>>>> c=40;pgbench -C -n -c$c -j$c -T5 -f <(echo 'select 1') 'port=6432 
>>>> host=127.0.0.1 user=test dbname=postgres password=fake'
>>>> 
>>>> host=127.0.0.1:                           16465
>>>> host=127.0.0.1,gssencmode=disable         20860
>>>> host=/tmp:                                49286
>>>> 
>>>> Note that the server does *not* support gss, yet gss has a substantial
>>>> performance impact.
>>>> 
>>>> Obviously the connection rates here absurdly high and outside of badly 
>>>> written
>>>> applications likely never practically relevant. However, the number of 
>>>> cores
>>>> in systems are going up, and this quite possibly will become relevant in 
>>>> more
>>>> realistic scenarios (lock contention kicks in earlier the more cores you
>>>> have).
>>> 
>>> By not supporting gss I assume you mean having built with --with-gssapi,
>>> but only host (not hostgssenc) records in pg_hba, right?
>> 
>> Yes, the latter. Or not having kerberos set up on the client side.
> 
> I've been experimenting with both:
> 
> * The server is built without gssapi, but the client does support it.
>  This produces exactly the contention you're talking about.
> 
> * The server is built with gssapi, but do not use it in pg_hba, the
>  client does support gssapi. In this case the difference between
>  gssencmode=disable/prefer is even more dramatic in my test case
>  (milliseconds vs seconds) due to the environment with configured
>  kerberos (for other purposes, thus gss_init_sec_context spends huge
>  amount of time to still return nothing).
> 
> At the same time after quick look I don't see an easy way to avoid that.
> Current implementation tries to initialize gss before getting any
> confirmation from the server whether it's supported. Doing this other
> way around would probably just shift overhead to the server side.

The main problem seems to be that we check whether or not there is a credential
cache when we try to select encryption but not yet authentication, as a way to
figure out if gssenc it as all worth trying?  I experimented with deferring it
with potentially cheaper heuristics in encryption selection, but it seems hard
to get around since other methods were even more expensive.

--
Daniel Gustafsson



Reply via email to