Заметка из wiki HikariCP про установку "правильного" размера пула коннектов к базам данных.
Основные мысли
1. Последовательное исполнение на одном CPU двух тредов всегда быстрее "параллельного" (потери на context-swithing и cache miss).
2. БОльшее кол-во тредов нежели доступных CPU ведет к замедлению системы (при идеальной CPU-bound модели использования);
3. Как только в уравнение добавляются IO-операции (диск, сеть, memory), правило меняется - чем дольше треды способны находиться в заблокированном состоянии (IO-wait), тем бОльший пул коннектов следует выставлять;
Сообщество PostgreSQL ввело в оборот формулу:
connections = ((core_count * 2) + effective_spindle_count)
* core_count должен учитывать только физически ядра (никакого вам HT); * effective_spindle_count равен 0 если вся БД способна поместиться в кеш и приближается к фактическому кол-ву дисков по мере снижения cache hit rate.Axiom: You want a small pool, saturated with threads waiting for connections.
P.S. думаю, что подход выше будет справедлив для всех типов коммунальных ресурсов.
tags: #performance #reliability