Ответ базы оборвался посреди чтения
Ошибка Npgsql «Exception while reading from stream» в Directum RX: соединение с PostgreSQL оборвалось или запрос не уложился в таймаут. Как отличить сетевой обрыв от долгого запроса.
Что это значит
Драйвер Npgsql ждал ответа от PostgreSQL и не дождался. Причин две, и их легко спутать.
Первая: соединение оборвалось. База перезапустилась, сессию завершили, сеть между сервером приложений и базой моргнула, межсетевой экран закрыл давно молчавшее соединение. Тогда рядом обычно видны 57P01 или No suitable host was found.
Вторая: запрос шёл дольше таймаута команды. Npgsql в этом случае пишет ту же фразу, а во внутреннем исключении стоит TimeoutException. В интерфейсе RX это бывает как «Evaluation failure on GetAll()» при открытии списка или отчёта.
Как проверить
- Внутреннее исключение:
TimeoutExceptionозначает долгий запрос,IOExceptionилиSocketExceptionозначает обрыв. - Для обрыва: журнал PostgreSQL за ту же минуту и журнал сетевого оборудования.
- Для долгого запроса: найти его в
pg_stat_statementsили в журнале медленных запросов:
select round(mean_exec_time) ms, calls, left(query, 120)
from pg_stat_statements order by mean_exec_time desc limit 20;
Что сделать
- Обрыв из-за сети: проверить таймауты простоя на межсетевом экране между приложением и базой, включить
tcp_keepalives_idleв PostgreSQL короче этого таймаута. - Долгий запрос: смотреть план (
explain analyze), чаще всего не хватает индекса. Поднимать таймаут без разбора не стоит: пользователь всё равно будет ждать. - Если ошибки идут всплеском вместе с переключением базы, отдельного разбора не нужно.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать