Базы данных6 мин чтения
Пулы соединений и ошибка, которая приходит в худший момент
«Слишком много клиентов» — ошибка конфигурации, а не ёмкости. Как работает пул, как подобрать размер и почему больше соединений делает всё медленнее.
У любой базы есть максимум одновременных соединений, и он ниже, чем принято думать. Его превышение не приводит к плавному замедлению: оно даёт ошибку, и даёт её под нагрузкой — то есть когда новый режим отказа нужен меньше всего.
Почему больше не значит лучше
Каждое соединение стоит памяти и слота планировщика. За пределом, где база успевает загрузить их все работой, добавление соединений добавляет конкуренцию, а не пропускную способность. Пул из десяти, который постоянно занят, обгонит пул из ста, который буксует.
- Размер пула считается на процесс. Четыре процесса с пулом по двадцать — это восемьдесят соединений, а не двадцать.
- Фоновым worker-ам нужен свой бюджет, и в этой сумме о них обычно забывают.
- Оставьте запас, чтобы вы сами могли подключиться клиентом, когда что-то не так.
Утечка
Соединение, которое взяли и не вернули, потеряно до перезапуска процесса. Если пул медленно исчерпывается за часы, а перезапуск лечит, вам не не хватает ёмкости: в коде есть путь, который забывает освобождать.