Подробное объяснение отставания в Linux

Linux
Подробное объяснение отставания в Linux

что такое отставание

Backlog — это параметр прослушивания функции сокета в Linux.Когда приложение вызывает системный вызов listen, чтобы перевести сокет в состояние LISTEN, необходимо указать параметр backlog. Этот параметр часто называют ограничением длины новой очереди соединений.

Поскольку TCP требует трех рукопожатий для установления соединения, новое соединение должно пройти через промежуточное состояние SYN RECEIVED, прежде чем достигнет состояния ESTABLISHED, и может быть возвращено приложению с помощью системного вызова accept. Это означает, что в стеке TCP/IP есть два разных варианта реализации очередей невыполненных работ:

  • Используется только одна очередь, а размер очереди определяется параметром невыполненной работы системного вызова listen. Когда стек протоколов получает пакет SYN, он отвечает на пакет SYN/ACK и добавляет соединение в очередь. Когда соответствующий ответный пакет ACK получен, соединение становится УСТАНОВЛЕННЫМ и может быть возвращено приложению. Это означает, что соединения в очереди могут иметь два различных состояния: SEND RECEIVED и ESTABLISHED. Только последнее соединение может быть возвращено приложению с помощью системного вызова accept.

  • --SYN две очереди, использующие очередь (очередь, ожидающая подключения) и приемную очередь (подключение очереди завершено). Состояние подключения RECEIVED в очередь SYN SYN, при перемещении в последующую очередь состояния изменяется на ESTABLISHED accept queue (т. е. последний получен пакет ACK трехэтапного рукопожатия). Как следует из названия, системный вызов accept просто принимает новое подключение потребителя из очереди. В этом случае параметр listen system call backlog определяет максимальный размер принимаемой очереди.

Для операционной системы Linux после версии ядра 2.2 протокол tcp/ip реализует вторую схему, то есть очередь на синхронизацию и очередь на прием, длина очереди на синхронизацию задается на системном уровне, а длина очередь принятия может быть задана на уровне приложения, процесс взаимодействия при установлении tcp соединения показан на следующем рисунке:

  1. Клиентская сторона использует connect() для инициирования запроса на соединение (отправляет синхропакет) на серверную сторону.В это время TCP-статус клиентской стороны — SYN_SENT.

  2. После того, как серверная сторона получает пакет синхронизации, она помещает информацию, относящуюся к TCP, в очередь синхронизации (полуподключенная очередь) и одновременно отправляет синхронизацию + подтверждение клиенту, а состояние TCP на стороне сервера SYN_RCVD.

  3. После того, как клиентская сторона получает syn+ack от серверной стороны, она отправляет ack на серверную сторону.В это время TCP-статус клиентской стороны ESTABLISHED. После того, как серверная сторона получает подтверждение подтверждения, она извлекает информацию TCP из очереди синхронизации и помещает ее в очередь принятия (полная очередь соединений).В это время состояние TCP стороны сервера УСТАНОВЛЕНО.

После трех вышеуказанных процессов клиентская сторона и серверная сторона устанавливают соединение, которое представляет собой так называемый процесс трехэтапного рукопожатия.
Отсюда мы уже знаем, что такое отставание, а также происхождение полусвязных очередей и полносвязных очередей. Упомянутые ниже невыполненные работы представляют собой полную длину очереди соединений. Итак, как установить значение отставания?


Как установить отставание

Размер отставания определяется двумя факторами: одним из них является уровень системы, а другим — уровень приложения.
  1. Системный уровень: параметр somaxconn, который можно установить, отредактировав значение /proc/sys/net/core/somaxconn.

  2. Уровень приложения: для сервера netty он устанавливается с помощью опции serverbootstrap, то есть option((ChannelOption.SO_BACKLOG,number), число — это устанавливаемый размер, а тип — int

Окончательное значение отставания — минимальное из двух, а именно min(backlog, somaxconn).После запуска сервиса мы можем просмотреть его через ss -tnlp, как показано на следующем рисунке:

В случае состояния прослушивания: Recv-Q представляет размер очереди, которая существует в бэклоге и не принимается серверным приложением; Send-Q представляет размер наибольшего бэклога, то есть размер бэклога, который мы установили min (отставание, somaxconn). При настройке отставания на какой стандарт настройки следует ссылаться?

стандарт настройки отставания

При настройке отставания, ни слишком большого, ни слишком маленького, ни слишком большого, когда трафик доступа внезапно увеличивает нагрузку на сервер, клиент не может быстро выйти из строя, что приводит к тайм-ауту соединения чтения на сервере, повлияет на сеть сервера I / O, в то время как память используется чрезмерно, нагрузка на ЦП увеличивается; если параметр слишком мал, грузоподъемность сервера не может быть полностью использована, и клиент приведет к сбою клиента. Устанавливается максимальное число запросов в секунду, которое может выдержать корневой сервер, а размер отставания должен быть установлен таким образом, чтобы сервер выдерживал 1-1,5-кратное число запросов в секунду.


анализ использования резерва

Для использования очереди невыполненных работ мы можем запросить ее через netstat, как показано на следующем рисунке:

Как показано на рисунке, мы видим, что длина очереди, используемая текущим невыполненным заданием, равна 1. Из приведенного выше анализа мы можем узнать, что соединение в очереди невыполненных работ не было принято потоком приложения. То есть мы можем запросить текущее соединение через netstat, но соединение не связано с pid процесса. Проанализировав все соединения на рисунке, мы можем узнать, что порт с номером 34328 не имеет связанного pid, а это значит, что это соединение находится в полной очереди соединений.
Конечно, мы также можем запросить незавершенное использование текущего номера порта прослушивания с помощью команды ss, как показано на следующем рисунке:

Как показано на рисунке, полная длина очереди соединений для текущего порта прослушивания равна 2. Когда длина использования полной очереди соединений равна (отставание + 1), это означает, что вторичная очередь полных соединений заполнена. очередь заполнена, когда полная очередь соединений заполнена Что произойдет, когда поступит новый запрос на соединение?
Когда есть новый запрос на установление соединения, он будет обрабатываться по-разному в соответствии с настройкой сервера /proc/sys/net/ipv4/tcp_abort_on_overflow.
  • Когда tcp_abort_on_overflow=0, ACK отбрасывается напрямую, и следующий процесс взаимодействия можно увидеть, перехватив пакеты через tcpdump

В это время сервер находится в【syn_rcvd】состояние, клиент находится в【учредил】статус:

  • Когда tcp_abort_on_overflow = 1, клиент отправляет RST-уведомление, клиент будет сообщен при сбросе соединения узлом.

Процесс захвата пакетов и их просмотра выглядит следующим образом:

Когда полносвязная очередь переполняется, какие индикаторы можно использовать для индикации этого и какие у нас есть эффективные методы запросов? Мы можем запросить его с помощью команды netstat -s:

Как показано на рисунке, 4879 раз представляет собой количество раз, когда полная очередь соединений переполняется.Опрос выполняется каждые несколько секунд.Если это число продолжает увеличиваться, это означает, что полная очередь соединений переполняется.
Как мы можем определить, какой порт прослушивания имеет полное переполнение очереди соединений?
  1. Используйте ss -tnlp, чтобы запросить использование очереди полных соединений порта прослушивания.

  2. Через netstat мы можем узнать соединение, состояние соединения которого установлено, но не связано с номером процесса.Это соединение соответствует порту-источнику и порту-получателю.Порт-источник этого соединения - это порт, который слушает наше приложение, то есть номер порта, на котором очередь невыполненных работ переполняется.

Короче говоря, наша повседневная работа, будь то длительное соединение, короткое соединение и различные промежуточные программы для обмена сообщениями, если она включает в себя прослушивание порта, будет включать отставание, когда мы понимаем отставание, потому что мы имеем дело с сетевыми проблемами, было то, как представить высокопараллельные системы будет очень полезно.


использованная литература

http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html
https://www.jianshu.com/p/7fde92785056

об авторе

Ли Шуанцюань, инженер-разработчик Java мобильной финансовой платформы Firefly, отдел технологий пользовательского опыта компании Minsheng Technology Co., Ltd.