Вступить в клуб →
средняявопросСети в Linux: сокеты, epoll и Boost.Asio

Один медленный запрос в базу подвешивает всех клиентов 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 ограничивает число одновременных клиентов
  • Пинг-запросам нужен отдельный сокет
  • Нужно увеличить буфер чтения сокета

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела