Рейтинг:2

Как имитировать то, что происходит внутри буфера пакетов простого коммутатора?

флаг ro

Я отлаживаю случай потери UDP-пакетов в гигабитном коммутаторе с промежуточным хранением и хотел визуализировать, что происходит внутри коммутатора, чтобы лучше понять суть проблемы.

Сценарий простой — два пакетных потока данных приходят через 2 порта внутри коммутатора и оба хотят выйти из него через третий порт (общий для обоих). Таким образом, коммутатору необходимо какое-то время удерживать некоторые данные в буфере пакетов.

Проблема в том, что, исходя из моих простых расчетов, буферы должны быть достаточно большими, чтобы справиться с рассматриваемым мной случаем. Один поток данных отправляет пакеты по 25 кБ (разделенные на пакеты по 1514 Б) каждые 1,56 мс, другой отправляет пакеты по 60 кБ каждые 1 мс. Теперь даже такой коммутатор Soho, как Netgear GS105E, имеет размер буфера 128 КБ. Таким образом, простая математика (25 + 60 < 128) говорит, что это должно работать, даже если потоки приходят на вход в одно и то же время (при условии отсутствия другого значительного трафика).

Реальные тесты показывают, что на некоторых коммутаторах теряется много пакетов из обоих потоков (видимо, это связано с размером буфера, но не только с ним). В моем моделировании я не могу заставить буфер переполняться, если установлено значение 128 КБ.

Я записал эту анимацию для буфера размером 24 КБ, где есть переполнение. Однако легко увидеть, что увеличение буфера всего на несколько байт решит проблему, и все пакеты будут проходить.

Я сделал несколько упрощений в этой симуляции. Все пакеты имеют одинаковый QoS (то есть и в реальном случае). Поэтому я исключил очереди QoS из моделирования и рассматриваю весь трафик как одинаково важный. Затем я исключил управление памятью буфера. Я могу представить, что это важная часть проблемы, но я был бы удивлен, если бы мое упрощение с идеальным распределением было бы более чем на 10% неверным по сравнению с реальным случаем. Я также делаю вид, что коммутатор знает длину кадра, когда он получает свои первые байты, поэтому он резервирует всю необходимую память в начале. Поскольку я не смог найти никакой документации о размере входных/выходных очередей портов, я предполагаю, что все они помещаются в общий буфер пакетов и могут занимать столько буфера, сколько необходимо (хотя я думаю, что виновником может быть где-то здесь).Я установил задержку обработки каждого пакета на 512 нс (задержка распространения пакета 64 байта).

Я не уверен, играет ли это роль, но потоки состоят из фрагментированных UDP-пакетов (т. е. 25-килобайтный пакет — это один UDP-пакет, фрагментированный на 17 IP-фрагментов). Второй поток создает пакет в виде 2 или 3 пакетов UDP по 20 КБ, каждый из которых фрагментирован на 14 фрагментов IP.

Команды Iperf 3.7 для репликации потоков, похожих на настоящие:

iperf3 -c приемник -u -b 128M -t 600 -l 25256 --pacing-timer 1560
iperf3 -c приемник -u -b 400M -t 600 -l 20k --pacing-timer 1000

У вас есть идеи, что еще я забыл принять во внимание, что могло привести к тому, что симуляция была так далека от реальности? Спасибо за помощь!

Исходный код анимации находится по адресу https://gist.github.com/peci1/a0346538acc6c289b2c6d596b184ad21 .

имитация потока данных через коммутатор

Вот моя таблица результатов реальных экспериментов. Первый поток данных фиксированный - 128 Мбит/с в пакетах UDP по 25 кБ каждые 1,56 мс. Я менял параметры второго потока, пытаясь найти предел, при котором пакеты первого потока начнут теряться коммутатором. я менял (длина) параметр, определяющий размер UDP-пакета, и (пропускная способность) параметр, указывающий, какую пропускную способность должны генерировать эти пакеты. --pacing-таймер всегда был установлен на 1000 для второго потока. Как видите, D-Link и Netgear GS105 вообще не справляются с пакетами по 60 кБ. GS108 работает намного лучше, чем GS105, при этом у него почти такой же чип коммутатора (то же самое «семейство», только другое количество портов и немного больший буфер).

Выключатель Размер буфера [КБ] Максимальный пакетный трафик 1,5 КБ Максимальный пакет трафика 20 КБ Максимальный пакетный трафик 60 КБ
Гигаблок прочный (VSC7512) 220 825 Мбит/с 825 Мбит/с 825 Мбит/с
Гигаблок (RTL8367N-VB-CG) 250 730 Мбит/с 750 Мбит/с 790 Мбит/с
D-Link DIS-100G-5W (QCA8337N-AL3C) 128 110 Мбит/с 1 Мбит/с каждый всплеск теряет пакеты
Zyxel XGS 1210-12 (RTL9302B) 1500 800 Мбит/с 830 Мбит/с 830 Мбит/с
Netgear GS310-TP (RTL8380M) 520 830 Мбит/с 830 Мбит/с 835 Мбит/с
Netgear GS308T (RTL8380M) 520 830 Мбит/с 835 Мбит/с 835 Мбит/с
Netgear GS108 v3 (BCM53118) 192 630 Мбит/с 660 Мбит/с 710 Мбит/с
Netgear GS105E (BCM53114) 128 120 Мбит/с 1 Мбит/с каждый всплеск теряет пакеты
Ренкфорс RF-4270245 ? 740 Мбит/с 760 Мбит/с 800 Мбит/с
Микротик RB260GS (AR8327) 128 835 Мбит/с 835 Мбит/с 835 Мбит/с
Можжевельник EX2300 4ГБ? 800 Мбит/с 830 Мбит/с 830 Мбит/с

(Этот вопрос был перенесен из https://networkengineering.stackexchange.com/questions/78529/how-to-simulate-what-happens-inside-the-packet-buffer-of-a-simple-switch где это было помечено как не по теме).

paladin avatar
флаг id
Размер MTU для пакетов Ethernet составляет 1500 байт, а не 1514 байт. Посмотрите --> https://en.wikipedia.org/wiki/Maximum_transmission_unit#MTUs_for_common_media
paladin avatar
флаг id
PS, если вы действительно отправляете пакеты с размером MTU 1514 байт по Ethernet, эти пакеты будут разделены на 2 пакета (1500 байт + 14 байт), эффективно уменьшая вдвое буфер вашего коммутатора.
Martin Pecka avatar
флаг ro
1514 включает накладные расходы. Размер IP-пакета составляет 1500 байт.
paladin avatar
флаг id
Я только что прочитал, что iperf не работает на 100% точно. Его функциональность зависит от используемого вами оборудования. Если вам нужны более точные результаты, используйте меньшее значение `--pacing-timer`. Короче говоря, iperf не может гарантировать достижение желаемой скорости передачи данных.
Martin Pecka avatar
флаг ro
@paladin Спасибо за информацию. Я проверил свойства битрейта и потока пакетов на принимающей стороне, и они выглядят так, как ожидалось.
Zac67 avatar
флаг ru
Я могу создавать различные модели, но *вы не можете точно воспроизвести то, что происходит внутри коммутатора, без подробной информации* о его реализации. Различные разработчики и поставщики могут использовать очень разные подходы к этой проблеме. Буферы могут быть статически распределены по портам и т. д. Если вам не повезет, у вас никогда не будет этой информации. Соответственно, ваш вопрос приводит только к догадкам, которые здесь не по теме. Если переключатель не работает, используйте лучший. Если у вас есть *очень* специфические требования, сначала свяжитесь с поставщиком или оцените его в лаборатории.
Martin Pecka avatar
флаг ro
@ Zac67 Спасибо за понимание. Это то, чего я боялся (и я надеялся, что будет, например, несколько «стандартных подходов», из которых поставщики смогут выбирать...).«Если переключатель не работает, используйте лучший» — это именно то, что я хотел бы, но в идеале я хотел бы иметь возможность оценить поведение перед покупкой переключателя или, по крайней мере, предположить его поведение. .
Zac67 avatar
флаг ru
@MartinPecka К сожалению, вы не обнаружите это, создавая теоретические модели, а только спросив поставщика о своем варианте использования или путем жесткого тестирования.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.