TCP Retransmission May Be Misleading (2023) by Arthur Chiao
Про типы TCP ретрансмитов в linux, как наблюдать и влиять на них.
tags: #linux #network #tcp
Про типы TCP ретрансмитов в linux, как наблюдать и влиять на них.
tags: #linux #network #tcp
👍1
Optimizing web servers for high throughput and low latency by Dropbox.tech
Разбор всех компонентов Linux машины участвующих в обработке трафика и методы оптимизаций их производительности, от типов CPU и до алгоритмов сжатия.
tags: #linux #performance #network #tuning
Разбор всех компонентов Linux машины участвующих в обработке трафика и методы оптимизаций их производительности, от типов CPU и до алгоритмов сжатия.
tags: #linux #performance #network #tuning
dropbox.tech
Optimizing web servers for high throughput and low latency
👍2
A Complete Guide of 'ss' Output Metrics by Mark Zhu
Самое подробное описание использования утилиты
tags: #network #linux #troubleshooting #tooling
Самое подробное описание использования утилиты
ss
что я встречал.tags: #network #linux #troubleshooting #tooling
Mark Zhu's Blog
A Complete Guide of 'ss' Output Metrics - TCP Connection Inspecting Tool
Understanding metrics from Linux ss command output
👍2
TCP Puzzlers by Dave Pacheco
Исследуется поведение TCP протокола в ситуациях как нормального закрытия соединений так и при:
* отключение питания сервера
* перезагрузка сервера
* внештатный обрыв соединения.
Авто подсвечивает не совсем очевидные моменты, о которых хорошо бы знать.
tags: #tcp #network
Исследуется поведение TCP протокола в ситуациях как нормального закрытия соединений так и при:
* отключение питания сервера
* перезагрузка сервера
* внештатный обрыв соединения.
Авто подсвечивает не совсем очевидные моменты, о которых хорошо бы знать.
tags: #tcp #network
Tritondatacenter
TCP Puzzlers | Triton DataCenter
It's been said that we don't really understand a system until we understand how it fails. Despite h...
👍2
Рубрика "Вредные советы" ч.2 — больше не всегда лучше.
Увеличение размера очередей - один из самых частых и эффективных советов по тюнингу, который можно услышать.
И сложно спорить, всего один параметр, а сколько пользы:
* сглаживание всплесков нагрузки;
* меньше переполнений => меньше потери данных;
* пропускная способность растет, как и эффективность обработки (пакетами, а не штуками);
* больше асинхронности, меньше боимся "морганий";
* ...
Но у любого совета, пусть и очень хорошего, всегда найдутся недостатки.
Представим два сервиса (1 и 2), взаимодействующих по сети через большую очередь, например на сетевой карте (2).
Пока (2) успевает обрабатывать поток данных, все работает гладко, с описанными выше преимуществами.
Но как только (2) замедляется на значительное время, могут возникнуть проблемы:
* latency каждого пакета в буфере растет кумулятивно, а хвосты ожидают слишком долго;
* срабатывают таймауты (на уровне приложения, TCP) и происходит переотправка, еще больше нагружая очередь;
* все накопленные данные будут обработаны (2), даже если они давно устарели;
* из-за отсутствия своевременной обратной связи TCP (1) реагирует с опозданием — отсутствует failfast;
* перегрузка накапливается в одной части системы, вместо того чтобы равномерно распределяться — отсутствует backpressure.
Список можно продолжить.
Вывод: не следует слепо следовать интернет-советам — всё нужно ставить под сомнение, проверять и подбирать оптимальные параметры именно под вашу систему.
P.S. проблеме раздутых буферов в свое время даже дали название - bufferbloat. Подробнее почитать о ней можно на www.bufferbloat.net.
tags: #network #tcp #theory
Увеличение размера очередей - один из самых частых и эффективных советов по тюнингу, который можно услышать.
И сложно спорить, всего один параметр, а сколько пользы:
* сглаживание всплесков нагрузки;
* меньше переполнений => меньше потери данных;
* пропускная способность растет, как и эффективность обработки (пакетами, а не штуками);
* больше асинхронности, меньше боимся "морганий";
* ...
Но у любого совета, пусть и очень хорошего, всегда найдутся недостатки.
Представим два сервиса (1 и 2), взаимодействующих по сети через большую очередь, например на сетевой карте (2).
Пока (2) успевает обрабатывать поток данных, все работает гладко, с описанными выше преимуществами.
Но как только (2) замедляется на значительное время, могут возникнуть проблемы:
* latency каждого пакета в буфере растет кумулятивно, а хвосты ожидают слишком долго;
* срабатывают таймауты (на уровне приложения, TCP) и происходит переотправка, еще больше нагружая очередь;
* все накопленные данные будут обработаны (2), даже если они давно устарели;
* из-за отсутствия своевременной обратной связи TCP (1) реагирует с опозданием — отсутствует failfast;
* перегрузка накапливается в одной части системы, вместо того чтобы равномерно распределяться — отсутствует backpressure.
Список можно продолжить.
Вывод: не следует слепо следовать интернет-советам — всё нужно ставить под сомнение, проверять и подбирать оптимальные параметры именно под вашу систему.
P.S. проблеме раздутых буферов в свое время даже дали название - bufferbloat. Подробнее почитать о ней можно на www.bufferbloat.net.
tags: #network #tcp #theory
👍7
Scaling in the Linux Networking Stack (scaling.txt)
Документ от разработчиков ядра Linux описывает пять техник, которые помогают повысить производительность сетевого стека в многоядерных системах.
Это:
* RSS: Receive Side Scaling
* RPS: Receive Packet Steering
* RFS: Receive Flow Steering
* Accelerated Receive Flow Steering
* XPS: Transmit Packet Steering
В нашей инфраструктуре мы уже давно и успешно используем RSS.
Это аппаратная технология, суть следующая.
Когда поступает сетевой пакет, на основе его заголовков вычисляется хеш. Полученное значение сопоставляется с таблицей, где каждому значению соответствует определенная очередь (RX).
Каждая RX-очередь привязана к конкретному ядру процессора.
Таким образом:
1. Обработка трафика распределяется между несколькими CPU, что позволяет эффективно использовать ресурсы;
2. Все пакеты одного соединения попадают в одну очередь. Это исключает проблему "out of order" пакетов.
Однако бывают ситуации, когда распределить обработку трафика между ядрами не получается, и отдельное ядро или группа ядер оказывается сильно перегруженной:
- одно конкретное соединение прокачивает кратно больший объем трафика, чем другие;
- RX-очередей в системе меньше, чем доступных CPU.
Мы, например, сталкивались с такими проблемами при использовании MetalLB в L2-режиме: весь трафик шел через одну машину MetalLB (мастер) и "приклеивался" к одной RX-очереди на Ingress Controller. Остальные ядра и RX-очереди при этом простаивали.
В подобных случаях может помочь другая техника, описанная в том же документе — RPS (Receive Packet Steering).
RPS — это программная реализация RSS. Она позволяет распределить RX-очереди по конкретным ядрам, выравнивая нагрузку между ними.
Но есть и минусы:
- Программная реализация создает дополнительную нагрузку на CPU, что проявляется в увеличении числа IRQ на графике загрузки процессора;
- Снижается "локальность" данных в кэшах процессора, что может повлиять на производительность.
(на скрине RPS включили после 16:00)
———
Тема сложная, и я не уверен, что до конца понимаю, как это все работает;)
Было бы интересно узнать, какие техники масштабирования трафика используете вы и как справляетесь с подобными проблемами.
Дальнейшее чтение:
- сам документ scaling.txt
- расшифровка доклада от Одноклассников, где ребята решали похожие проблемы;
- примерно тоже самое, но забугорный доклад по перформансу сетевого стека.
tags: #network #tuning #linux #кейс
Документ от разработчиков ядра Linux описывает пять техник, которые помогают повысить производительность сетевого стека в многоядерных системах.
Это:
* RSS: Receive Side Scaling
* RPS: Receive Packet Steering
* RFS: Receive Flow Steering
* Accelerated Receive Flow Steering
* XPS: Transmit Packet Steering
В нашей инфраструктуре мы уже давно и успешно используем RSS.
Это аппаратная технология, суть следующая.
Когда поступает сетевой пакет, на основе его заголовков вычисляется хеш. Полученное значение сопоставляется с таблицей, где каждому значению соответствует определенная очередь (RX).
Каждая RX-очередь привязана к конкретному ядру процессора.
Таким образом:
1. Обработка трафика распределяется между несколькими CPU, что позволяет эффективно использовать ресурсы;
2. Все пакеты одного соединения попадают в одну очередь. Это исключает проблему "out of order" пакетов.
Однако бывают ситуации, когда распределить обработку трафика между ядрами не получается, и отдельное ядро или группа ядер оказывается сильно перегруженной:
- одно конкретное соединение прокачивает кратно больший объем трафика, чем другие;
- RX-очередей в системе меньше, чем доступных CPU.
Мы, например, сталкивались с такими проблемами при использовании MetalLB в L2-режиме: весь трафик шел через одну машину MetalLB (мастер) и "приклеивался" к одной RX-очереди на Ingress Controller. Остальные ядра и RX-очереди при этом простаивали.
В подобных случаях может помочь другая техника, описанная в том же документе — RPS (Receive Packet Steering).
RPS — это программная реализация RSS. Она позволяет распределить RX-очереди по конкретным ядрам, выравнивая нагрузку между ними.
Но есть и минусы:
- Программная реализация создает дополнительную нагрузку на CPU, что проявляется в увеличении числа IRQ на графике загрузки процессора;
- Снижается "локальность" данных в кэшах процессора, что может повлиять на производительность.
(на скрине RPS включили после 16:00)
———
Тема сложная, и я не уверен, что до конца понимаю, как это все работает;)
Было бы интересно узнать, какие техники масштабирования трафика используете вы и как справляетесь с подобными проблемами.
Дальнейшее чтение:
- сам документ scaling.txt
- расшифровка доклада от Одноклассников, где ребята решали похожие проблемы;
- примерно тоже самое, но забугорный доклад по перформансу сетевого стека.
tags: #network #tuning #linux #кейс
👍13
Алгоритмы управления потоком (Flow Control) в TCP служат для предотвращения перегрузки сети и потерь данных.
Исследования в этой области не прекращаются и на сегодня нам доступно множество вариантов:
*
*
*
*
*
*
*
* ...
По умолчанию в Linux используется
Так может нам просто переехать на новые рельсы?
Хотя кажется правильнее поставить вопрос по другому: в каких случаях какой алгоритм может быть предпочтительнее?
————
Алгоритмы Flow Control можно условно разделить на два типа:
1. Loss-based (ориентированы на потери пакетов):
2. Delay-based (ориентированы на изменения RTT):
Основная цель любой реализации Flow Control — максимально эффективно использовать пропускную способность канала, сохраняя баланс между скоростью передачи данных и предотвращением перегрузок.
Скорость регулируется через Congestion Window (окно перегрузки) — сколько данных можно отправить без получения подтверждения.
Разница между подходами к контролю перегрузки заключается в методах её определения.
Loss-based (CUBIC)
Алгоритмы этого типа оценивают перегрузку по потерям пакетов.
Пришел дублирующий ACK или сработал Retransmission Timeout (RTO)? Значит есть потери и следовательно канал перегружен - снижаем скорость.
Затем ориентируясь на поступающие ACK, скорость увеличивается, пока не обнаружатся новые потери.
Такой подход может забивать очереди в канале до предела, что и будет приводить к потерям. Реакция носит реактивный характер: перегрузка фиксируется только после её возникновения.
Delay-based (BBR)
В Delay-based алгоритмах, таких как BBR, перегрузка оценивается на основе изменения задержек:
* минимальный RTT (
* если текущий RTT (
Таким образом, BBR стремится избегать заполнения очередей, что позволяет сократить задержки.
Его подход более превентивный: предотвращение перегрузки до её появления.
————
Внутри дата-центров, где RTT низкий,
Вообщем как обычно надо быть осторожее!
Почитать:
- https://blog.apnic.net/2017/05/09/bbr-new-kid-tcp-block/
- https://book.systemsapproach.org/congestion.html
- https://tcpcc.systemsapproach.org/
tags: #network #tcp
Исследования в этой области не прекращаются и на сегодня нам доступно множество вариантов:
*
Reno
(1986)*
New Reno
(1999)*
CUBIC
(2004)*
FAST TCP
(2005)*
BBRv1
(2016)*
BBRv2
(2019)*
BBRv3
(2023)* ...
По умолчанию в Linux используется
CUBIC
. Однако создатели BBR (Google) выкладывают любопытные исследования, где резюмируют:BBR enables big throughput improvements on high-speed, long-haul links...
BBR enables significant reductions in latency in last-mile networks that connect users to the internet...
Так может нам просто переехать на новые рельсы?
Хотя кажется правильнее поставить вопрос по другому: в каких случаях какой алгоритм может быть предпочтительнее?
————
Алгоритмы Flow Control можно условно разделить на два типа:
1. Loss-based (ориентированы на потери пакетов):
Reno
, NewReno
, CUBIC
2. Delay-based (ориентированы на изменения RTT):
FAST TCP
, BBRv*
Основная цель любой реализации Flow Control — максимально эффективно использовать пропускную способность канала, сохраняя баланс между скоростью передачи данных и предотвращением перегрузок.
Скорость регулируется через Congestion Window (окно перегрузки) — сколько данных можно отправить без получения подтверждения.
Разница между подходами к контролю перегрузки заключается в методах её определения.
Loss-based (CUBIC)
Алгоритмы этого типа оценивают перегрузку по потерям пакетов.
Пришел дублирующий ACK или сработал Retransmission Timeout (RTO)? Значит есть потери и следовательно канал перегружен - снижаем скорость.
Затем ориентируясь на поступающие ACK, скорость увеличивается, пока не обнаружатся новые потери.
Такой подход может забивать очереди в канале до предела, что и будет приводить к потерям. Реакция носит реактивный характер: перегрузка фиксируется только после её возникновения.
Delay-based (BBR)
В Delay-based алгоритмах, таких как BBR, перегрузка оценивается на основе изменения задержек:
* минимальный RTT (
RTT_min
) принимается за эталон;* если текущий RTT (
RTT_now
) превышает RTT_min
, алгоритм предполагает, что канал перегружен, и снижает скорость передачи данных.Таким образом, BBR стремится избегать заполнения очередей, что позволяет сократить задержки.
Его подход более превентивный: предотвращение перегрузки до её появления.
————
CUBIC
проигрывает BBR
в сетях с высоким RTT, например, в интернете. Это происходит из-за медленного роста скорости после обнаружения потерь: ACK приходят с задержкой.Внутри дата-центров, где RTT низкий,
CUBIC
должен справляться лучше - быстрые ACK ускоряют рост скорости передачи данных.BBR
же в таких сетях может не дать преимуществ. При всплесках трафика он снижает скорость, чтобы избежать заполнения очередей, из-за чего канал используется не полностью. Кроме того, возможны конфликты между алгоритмами, когда та или иная реализация будет захватывать пропусную способность, вытесняя другие. Настоящие войны)Вообщем как обычно надо быть осторожее!
Почитать:
- https://blog.apnic.net/2017/05/09/bbr-new-kid-tcp-block/
- https://book.systemsapproach.org/congestion.html
- https://tcpcc.systemsapproach.org/
tags: #network #tcp
Google Cloud Blog
TCP BBR congestion control comes to GCP – your Internet just got faster | Google Cloud Blog
🔥20👍3🤝1
Готовлюсь к внутреннему митапу с докладом о потерях сетевого трафика: как их диагностировать и устранять.
В основе GIF-анимация, иллюстрирующая путь и остановки входящего сетевого пакета в ядре Linux.
Очереди в ядре Linux
* RX queue. Первая остановка: очередь сетевой карты (см.
* QDisc. Приоритизация, модификация и многое другое возможны с помощью дисциплины очередей. Calico, Cilium и подобные ребята перехватывает пакеты именно здесь (eBPF)
* Input Packet Queue. Очередь перед стеком протоколов.
📍Для новых соединений
* SYN queue. Очередь, где SYN-сегменты дожидаются ACK;
* Accept queue. Приложение через
📍Для уже установленных соединений
* Out Of Order queue. При нарушении очередности (sequence number больше ожидаемого), пакет помещается в нее, до восстановления правильного порядка;
* Recv queue. TCP-буфер сокета, из него приложение читает данные системным вызовом
———
Подробнее я описывал весь процесс в двух частях: один, два.
P.S. Кстати, поддержать канал теперь можно на Бусти или просто донатом!
#network #tcp #kernel
В основе GIF-анимация, иллюстрирующая путь и остановки входящего сетевого пакета в ядре Linux.
Очереди в ядре Linux
* RX queue. Первая остановка: очередь сетевой карты (см.
ethtool -l eth0
)* QDisc. Приоритизация, модификация и многое другое возможны с помощью дисциплины очередей. Calico, Cilium и подобные ребята перехватывает пакеты именно здесь (eBPF)
* Input Packet Queue. Очередь перед стеком протоколов.
📍Для новых соединений
* SYN queue. Очередь, где SYN-сегменты дожидаются ACK;
* Accept queue. Приложение через
accept()
подтверждает, что соединение установлено - зеленый свет для обмена данными.📍Для уже установленных соединений
* Out Of Order queue. При нарушении очередности (sequence number больше ожидаемого), пакет помещается в нее, до восстановления правильного порядка;
* Recv queue. TCP-буфер сокета, из него приложение читает данные системным вызовом
read()
.———
Подробнее я описывал весь процесс в двух частях: один, два.
P.S. Кстати, поддержать канал теперь можно на Бусти или просто донатом!
#network #tcp #kernel
🔥18👍9