O limite de conexão do banco de dados deve ser igual ao número de processos conectados?

5

Notei que o PostgreSQL e o MySQL têm um limite de conexão de 100 clientes por padrão. Eu estou querendo saber se eu deveria recusar isso, já que o servidor está na mesma caixa e eu tenho apenas cerca de 20 processos PHP que precisam se conectar.

Esta configuração deve corresponder ou exceder o número de processos que tentarão se conectar?

    
por Xeoncross 30.05.2011 / 19:22

1 resposta

4

No PostgreSQL (não sei MySQL) existe max_connections propriedade definida como:

Determines the maximum number of concurrent connections to the database server. The default is typically 100 connections, but might be less if your kernel settings will not support it (as determined during initdb). This parameter can only be set at server start.

Increasing this parameter might cause PostgreSQL to request more System V shared memory or semaphores than your operating system's default configuration allows. See Section 17.4.1 for information on how to adjust those parameters, if necessary.

O limite efetivo de conexões do cliente é definido como:

max_connections - superuser_reserved_connections

O valor padrão para superuser_reserved_connections é 3.

Você precisa ter uma visão em perspectiva. Hoje, vamos dizer que 40 max_connections é seguro para você e mantém alguns recursos do SO livres (semamphores e memória compartilhada, conforme descrito em documentação ), mas amanhã pode não ser suficiente:

psql: FATAL:  sorry, too many clients already

Vamos calcular o lucro que você recebe:

minSemaphoresSets = ceil((max_connections + autovacuum_max_workers)/16)

O valor padrão para autovacuum_max_workers é 3, então:

prevSets = ceil((100 + 3)/16) = 7
newSets = ceil((40 + 3)/16) = 3

Cada conjunto (Postgres) tem sempre 17 semáforos, então você tem 68 semáforos protegidos:

ipcs -s | grep postgres
0x0052e2c1 589824     postgres  600        17        
0x0052e2c2 622593     postgres  600        17        
0x0052e2c3 655362     postgres  600        17        
0x0052e2c4 688131     postgres  600        17        
0x0052e2c5 720900     postgres  600        17        
0x0052e2c6 753669     postgres  600        17        
0x0052e2c7 786438     postgres  600        17
# changing max_connections from 100 to 40
pg_ctlcluster 8.3 main restart
ipcs -s | grep postgres
0x0052e2c1 819200     postgres  600        17        
0x0052e2c2 851969     postgres  600        17        
0x0052e2c3 884738     postgres  600        17

Para memória compartilhada é ~ 1 MiB (veja Tabela 17- 2 para mais detalhes):

ipcs -m | grep postgres
0x0052e2c1 0          postgres  600        29368320   4
# changing max_connections from 100 to 40
pg_ctlcluster 8.3 main restart
ipcs -m | grep postgres
0x0052e2c1 425984     postgres  600        28270592   4

Como você vê, não é demais, então você pode usar o limite padrão se não precisar dessa otimização.

    
por 30.05.2011 / 21:05