Назад | Перейти на главную страницу

Должно ли ограничение на подключение к базе данных равняться количеству подключающихся процессов?

Я заметил, что PostgreSQL и MySQL по умолчанию имеют ограничение в 100 клиентских подключений. Мне интересно, следует ли мне отказаться от этого, поскольку веб-сервер находится в том же поле, и у меня есть только около 20 процессов PHP, которые необходимо подключить.

Должен ли этот параметр соответствовать или превышать количество процессов, которые будут пытаться подключиться?

В PostgreSQL (я не знаю MySQL) есть max_connections свойство определяется как:

Определяет максимальное количество одновременных подключений к серверу базы данных. По умолчанию обычно 100 подключений, но может быть меньше, если настройки вашего ядра не поддерживают это (как определено во время initdb). Этот параметр можно установить только при запуске сервера.

Увеличение этого параметра может привести к тому, что PostgreSQL запросит больше разделяемой памяти System V или семафоров, чем позволяет конфигурация вашей операционной системы по умолчанию. Видеть Раздел 17.4.1 для получения информации о том, как при необходимости отрегулировать эти параметры.

Эффективный лимит клиентских подключений определяется как:

max_connections - superuser_reserved_connections

Значение по умолчанию для superuser_reserved_connections равно 3.

Вам нужно смотреть в перспективе. Сегодня предположим, что 40 max_connections безопасны для вас и позволяют освободить некоторые ресурсы ОС (семафоры и разделяемую память, как описано в документация), но завтра этого может не хватить:

psql: FATAL:  sorry, too many clients already

Посчитаем, какую прибыль вы получите:

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

Значение по умолчанию для autovacuum_max_workers равно 3, поэтому:

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

Каждый набор (Postgres) всегда содержит 17 семафоров, поэтому у вас есть 68 сохраненных семафоров:

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

Для разделяемой памяти это ~ 1 МиБ (см. Таблица 17-2 Больше подробностей):

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

Как видите, это не так уж много, поэтому вы можете использовать лимит по умолчанию, если вам не нужна такая оптимизация.