Один медленный запрос в базу подвешивает всех клиентов Asio-сервера
Сервер на Boost.Asio с одним потоком io.run() держит 3000 соединений. В обработчике чтения появился синхронный запрос к PostgreSQL:
void Session::onRead(error_code ec, size_t n) {
auto profile = db_.queryProfile(userId_); // 150–400 мс
writeResponse(profile);
}
Теперь задержка у всех клиентов, включая пинг-запросы без обращения к базе, выросла до сотен миллисекунд. Почему и как исправить?
- Блокировка стопорит цикл; вынести запрос в пул
- PostgreSQL ограничивает число одновременных клиентов
- Пинг-запросам нужен отдельный сокет
- Нужно увеличить буфер чтения сокета
