Типичный сценарий ошибки превышения времени ожидания сетевого подключения

Введение и предыстория:

У вас проблемы, если ваш 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
  • Жесткий предел ресурса, однажды установленный для пользователя, может быть только снижен, но не может быть повышен.

Надеюсь, вам понравилась эта статья так же, как и мне. Не стесняйтесь оставлять любые комментарии.