Я заметил, что 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
Как видите, это не так уж много, поэтому вы можете использовать лимит по умолчанию, если вам не нужна такая оптимизация.