Connection timed out в журнале службы
Таймаут соединения (номер 110, ETIMEDOUT) отличается от отказа: там ответ пришёл сразу, здесь ответа нет вовсе. Это характерно для правил брандмауэра с отбрасыванием пакетов, недоступных узлов и перегруженных серверов.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Пакеты отбрасываются брандмауэром
Правило с действием drop не отвечает вовсе, и клиент ждёт до истечения таймаута. Правило с reject дало бы отказ сразу.
-
Узел недоступен по сети
Маршрут отсутствует, узел выключен, адрес изменился. При этом соединение тоже висит до таймаута.
-
Сервер на другой стороне перегружен
Очередь подключений заполнена, и новые запросы не принимаются. Внешне это выглядит как таймаут.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Быстрая проверка достижимости порта без дополнительных программ.
timeout 5 bash -c "</dev/tcp/узел/порт" && echo открыт || echo нет ответаПо какому маршруту пойдёт соединение.
ip route get адресСтроки о таймаутах и их частота.
journalctl -u myapp.service -n 40 --no-pager | grep -i timeoutРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Правило с действием drop не отвечает вовсе, и клиент ждёт до истечения таймаута. Правило с reject дало бы отказ сразу.
- Как проверить
-
Проверьте доступность порта и правила.
timeout 5 bash -c "</dev/tcp/узел/5432" && echo открыт || echo нет ответа sudo nft list ruleset 2>/dev/null | head -30
- Как исправить
- Разрешите нужный порт для нужного источника. Если правило не ваше, выясните, где стоит промежуточный фильтр.
- Почему происходит
- Маршрут отсутствует, узел выключен, адрес изменился. При этом соединение тоже висит до таймаута.
- Как проверить
-
Проверьте доступность узла и маршрут.
ping -c3 узел ip route get адрес
- Как исправить
- Исправьте адрес, маршрут или доступность узла. Само приложение тут ни при чём.
- Почему происходит
- Очередь подключений заполнена, и новые запросы не принимаются. Внешне это выглядит как таймаут.
- Как проверить
-
Посмотрите состояние соединений и нагрузку на той стороне.
ss -tan | awk "{print \$1}" | sort | uniq -c | sort -rn | head
- Как исправить
- Разбирайтесь с перегрузкой на стороне сервера: увеличение таймаута у клиента лишь отложит ошибку.
Пример вывода
Служба не может подключиться к внешнему сервису. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
myapp[3100]: error: dial tcp <адрес>:443: i/o timeout
myapp[3100]: retrying in 5s (attempt 3/5)
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE
Связанные ошибки
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- No route to host в журнале службы Нет маршрута до узла: отсутствует шлюз, узел в другой сети, правило брандмауэра отвечает отказом.
- Failed with result 'timeout' Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- A stop job is running: выключение висит Перезагрузка останавливается с обратным отсчётом: служба не завершается. Как найти и сократить ожидание.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Broken pipe в журнале службы Запись в закрытый канал или соединение: клиент отключился, обработчик завершился, конвейер разорван.
Источники
- connect(2): ошибка ETIMEDOUT
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено правилом брандмауэра с отбрасыванием пакетов.