Типичный сценарий ошибки превышения времени ожидания сетевого подключения
Введение и предыстория:
У вас проблемы, если ваш HTTP-сервер встречает вас с сообщением 599: истекло время ожидания сетевого подключения. Прежде всего проверьте, доступен ли сервер и можно ли подключиться к нему по SSH. Тут на помощь приходит лог-файл сервера. Скорее всего, они будут выглядеть примерно так.
HTTP: Accept error: accept tcp [::]:<port_number>: accept4: too many open files
Кто-то может задаться вопросом, почему слишком много открытых файлов связано с ошибкой принятия HTTP. Причина этого довольно интересна. Каждый сокет в Debian рассматривается как открытый файл. Вот как они связаны! Поскольку каждый сокет является открытым файлом, а сервер превысил ограничение на количество открытых файлов, сервер не может принимать новые TCP-соединения.
# command that counts the number of open files by the service. lsof -u <user-running-the-service> | wc -l
Если это производственный сервер, и вы не уверены, в чем заключается сделка, за исключением того факта, что вы поняли, что существует слишком много открытых подключений, быстрое и грязное решение - перезапустить службу. Поскольку это TCP-сервер, все существующие соединения будут разорваны, и текущие активные клиенты попытаются снова подключиться к серверу. Этот перезапуск очищает все сокеты, которые валяются и не были очищены. Но это временное решение. Эта статья посвящена изучению постоянного исправления.
Как исправить эту ошибку?
Короткий ответ - увеличить ограничение количества открытых файлов для службы до более высокого значения с помощью утилиты ulimit. Подробное объяснение обсуждается в разделах ниже.
Постоянное исправление будет двояким
- Убедитесь, что сервер поддерживает больше открытых файлов
- Убедитесь, что сервер очищает все устаревшие сокеты.
Первое исправление должно в значительной степени избежать любых ошибок 599, но второе гарантирует, что количество открытых сокетов не будет продолжать увеличиваться из-за невозможности очистить сокеты после использования. Второе исправление зависит от типа сервера и не зависит от конфигурации системы.
Что такое ulimit:
Встроенная функция ulimit используется для установки ограничений использования ресурсов оболочки
и любых порождаемых ею процессов. - Страница руководства
По сути, это команда, которая используется для установки ограничения на использование ресурсов, таких как количество процессов на пользователя, использование ЦП, ограничение на количество открытых файловых дескрипторов и т. Д. За сеанс.
Проверка пределов тока:
Есть несколько способов проверить текущие ограничения
Чтобы проверить ограничение для процесса:
- Найдите идентификатор процесса
ps -afx | grep <process_name>
- Скопируйте PID из вывода команды, а затем запустите
$ cat /proc/<PID>/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 15671 15671 processes Max open files 1024 524288 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 15671 15671 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
В этом файле перечислены все интересующие вас пределы. Из-за указанной выше ошибки представляет интерес ограничение Max Open files.
Чтобы проверить предел оболочки:
При входе в терминал, если вам нужно проверить лимиты ресурсов для пользователя, пригодится команда limit.
$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 15671 max locked memory (kbytes, -l) 65536 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 15671 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
Что такое мягкие и жесткие лимиты?
Каждый лимит ресурса имеет две границы
- Жесткий предел: это верхний предел мягкого ограничения. Значение мягкого предела не может быть больше его жесткого предела. Жесткий предел, однажды установленный для пользователя, не может быть изменен.
- Мягкое ограничение: ограничение ресурса, которое устанавливается для пользователя или программы за сеанс. Пользователь / программа не может превышать мягкий лимит ресурса. Это предел, который необходимо увеличить, чтобы исправить ошибку.
Настройка ограничений ресурсов в сценариях bash - исправление:
В этом разделе в качестве примера взят сценарий запуска службы runit. О премьере на runit читайте в моей статье ниже.
Чтобы установить ограничение на количество открытых файлов для службы runit, можно добавить ulimit до вызова двоичного файла, специфичного для службы. Пример сценария запуска выглядит следующим образом
# /etc/service/dhcp-client/run
#!/bin/sh
exec 2>&1 # redirect output of stderr to stdout
ulimit -n 409600
exec /sbin/dhclient -4 -v -i -d --no-pid \
-lf /var/lib/dhcp/dhclient.eth1.leases \
-I eth1
Установка более высокого значения ulimit увеличивает количество открытых файлов и, следовательно, также увеличивается лимит количества открытых сокетов. Если сервер запускается конкретным системным пользователем, ulimit пользователя может быть увеличен, выполнив следующую команду.
su <user> — shell /bin/bash — command “ulimit -n <limit>”
Чтобы установить общий лимит для пользователя или группы пользователей по умолчанию, можно обновить файл /etc/security/limits.conf.
$ cat /etc/security/limits.conf
#<domain> <type> <item> <value>
* soft core <value>
* hard nofile <value>
@<group> hard nproc <value>
<user> soft nproc <value>
Ключевые выводы:
- Мягкое ограничение - это ограничение, которое применяется для сеанса или процесса.
- Мягкое ограничение не может превышать жесткое ограничение для ресурса.
- Общие ограничения для пользователя или группы или подстановочный знак можно установить в файле /etc/security/limits.conf
- Жесткий предел ресурса, однажды установленный для пользователя, может быть только снижен, но не может быть повышен.
Надеюсь, вам понравилась эта статья так же, как и мне. Не стесняйтесь оставлять любые комментарии.