Re: Built-in connection pooler - Mailing list pgsql-hackers

From Konstantin Knizhnik
Subject Re: Built-in connection pooler
Date
Msg-id a79b0687-c94d-8e0e-835b-85782c7b68ec@postgrespro.ru
Whole thread Raw
In response to RE: Built-in connection pooler  ("ideriha.takeshi@fujitsu.com" <ideriha.takeshi@fujitsu.com>)
Responses RE: Built-in connection pooler  ("ideriha.takeshi@fujitsu.com" <ideriha.takeshi@fujitsu.com>)
List pgsql-hackers
Hi

On 12.11.2019 10:50, ideriha.takeshi@fujitsu.com wrote:
> Hi.
>
>> From: Konstantin Knizhnik [mailto:k.knizhnik@postgrespro.ru]
>>
>> New version of builtin connection pooler fixing handling messages of extended
>> protocol.
>>
> Here are things I've noticed.
>
> 1. Is adding guc to postgresql.conf.sample useful for users?
Good catch: I will add it.

>
> 2. When proxy_port is a bit large (perhaps more than 2^15), connection failed
> though regular "port" is fine with number more than 2^15.
>
> $ bin/psql -p  32768
> 2019-11-12 16:11:25.460 JST [5617] LOG:  Message size 84
> 2019-11-12 16:11:25.461 JST [5617] WARNING:  could not setup local connect to server
> 2019-11-12 16:11:25.461 JST [5617] DETAIL:  invalid port number: "-22768"
> 2019-11-12 16:11:25.461 JST [5617] LOG:  Handshake response will be sent to the client later when backed is assigned
> psql: error: could not connect to server: invalid port number: "-22768"
Hmmm, ProxyPortNumber is used exactly in the same way as PostPortNumber.
I was able to connect to the specified port:


knizhnik@knizhnik:~/dtm-data$ psql postgres -p 42768
psql (13devel)
Type "help" for help.

postgres=# \q
knizhnik@knizhnik:~/dtm-data$ psql postgres -h 127.0.0.1 -p 42768
psql (13devel)
Type "help" for help.

postgres=# \q


> 3. When porxy_port is 6543 and connection_proxies is 2, running "make installcheck" twice without restarting server
failed.
> This is because of remaining backend.
>
> ============== dropping database "regression"         ==============
> ERROR:  database "regression" is being accessed by other users
> DETAIL:  There is 1 other session using the database.
> command failed: "/usr/local/pgsql-connection-proxy-performance/bin/psql" -X -c "DROP DATABASE IF EXISTS
\"regression\"""postgres"
 
Yes, this is known limitation.
Frankly speaking I do not consider it as a problem: it is not possible 
to drop database while there are active sessions accessing it.
And definitely proxy has such sessions. You can specify 
idle_pool_worker_timeout to shutdown pooler workers after  some idle time.
In this case, if you make large enough pause between test iterations, 
then workers will be terminated and it will be possible to drop database.

> 4. When running "make installcheck-world" with various connection-proxies, it results in a different number of
errors.
> With connection_proxies = 2, the test never ends. With connection_proxies = 20, 23 tests failed.
> More connection_proxies, the number of failed tests decreased.
Please notice, that each proxy maintains its own connection pool.
Default number of pooled backends is 10 (session_pool_size).
If you specify too large number of proxies then number of spawned backends =
  session_pool_size * connection_proxies can be too large (for the 
specified number of max_connections).

Please notice the difference between number of proxies and number of 
pooler backends.
Usually one proxy process is enough to serve all workers. Only in case 
of MPP systems with large number of cores
and especially with SSL connections, proxy can become a bottleneck. In 
this case you can configure several proxies.
But having more than 1-4 proxies seems to be bad idea.

But in case of check-world the problem is not related with number of 
proxies.
It takes place even with connection_proxies = 1
There was one bug with handling clients terminated inside transaction.
It is fixed in the attached patch.
But there is still problem with passing isolation tests under connection 
proxy: them are using pg_isolation_test_session_is_blocked
function which checks if backends with specified PIDs are blocked. But 
as far as in case of using connection proxy session is no more bounded 
to the particular backend, this check may not work as expected and test 
is blocked. I do not know how it can be fixed and not sure if it has to 
be fixed at all.



-- 
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company


Attachment

pgsql-hackers by date:

Previous
From: Ranier Vilela
Date:
Subject: [PATCH][BUG FIX] Potential uninitialized vars used.
Next
From: Jehan-Guillaume de Rorthais
Date:
Subject: Re: segmentation fault when cassert enabled