Назад | Перейти на главную страницу

Почему iperf по-прежнему сообщает о производительности 1 Гбит / с при использовании соединения через два адаптера 1 Гбит / с?

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

Связывание [...] означает объединение нескольких сетевых интерфейсов (NIC) в один канал, обеспечивая либо высокую доступность, либо балансировку нагрузки, либо максимальная пропускная способность, или их комбинацию.

Источник: Документация Ubuntu, акцент мой.

У меня настроено связывание на двух серверах; оба имеют по два сетевых адаптера 1 Гбит / с. При тестировании скорости между этими серверами с помощью iperf, в отчете указано:

Интересно то, что при использовании 802.3ad, ifconfig указывает на то, что практически все RX на eth0 (2,5 ГБ против нескольких КБ / МБ) и все TX на eth1 на машине A и обратное на машине B.

Когда спрашиваешь iperf использовать несколько подключений (iperf -c 192.168.1.2 -P 10), полученная сумма очень близка к результатам, отображаемым при использовании одного подключения.

Две машины подключены к Netgear GS728TS, у которого LACP настроен правильно (я надеюсь), с двумя LAGами, покрывающими по два порта каждая. Режим IEEE 802.3x включен.

Является iperf подходит для такого рода тестов? Если да, что мне не хватает?

Связанные интерфейсы не предоставляют дополнительную полосу пропускания отдельным сетевым потокам. Поэтому, если вы используете только одну копию iperf, вы сможете одновременно использовать только один сетевой интерфейс. Если у вас есть два сетевых адаптера в лаге, вам понадобятся как минимум две полностью независимых копии iperf, запущенные на компьютере, чтобы увидеть любое одновременное использование. Это применимо и к фактическим нагрузкам - например, клиент Samba по-прежнему будет видеть пропускную способность только 1 ГБ, но два клиента могут видеть 1 ГБ каждый, если у вашего лага есть две сетевые карты. Все это предполагает, что у вас есть задержка, настроенная для использования обеих сетевых адаптеров (опция 802.3ad сделает это).

После обращения в службу поддержки Netgear выяснилось, что:

Если вы используете 2 станции (1 клиент / 1 сервер), на самом деле он будет использовать только одну ссылку (следовательно, 1 Гбит / с / 940 Мбит / с), используемый канал определяется алгоритмом хеширования LACP.

Чтобы превысить ограничение в 1 Гбит / с, вам нужно будет протестировать более одного клиента.

Источник: ответ службы поддержки Netgear

Тот же ответ на билет ссылки на сообщение на публичном форуме Netgear, где мы можем прочитать это:

Вы можете получить только 2 Гбит / с, когда алгоритм хеширования LACP направляет несколько потоков трафика по разным путям, а это не всегда. При небольшом количестве клиентов (2 в вашем случае) велика вероятность, что они оба могут попасть в одну и ту же ссылку.

Для тех, кто не хочет читать всю дискуссию на форуме, вот ключевые моменты:

  • Чтобы воспользоваться LACP, к серверу должны подключаться как минимум два клиента. Один клиент будет использовать только одну ссылку, что ограничит его скорость до 1 Гбит / с.

  • Два клиента должны использовать разные ссылки, чтобы воспользоваться LACP.

  • При наличии всего двух сетевых адаптеров на сервере вероятность получения одного и того же канала от двух клиентов составляет 50%, что приведет к ограничению общей скорости на уровне 1 Гбит / с. Три сетевых адаптера уменьшают вероятность до 33%, четыре - до 25%.

В заключение отметим, что Netgear GS728TS не может обеспечить скорость от 1,4 до 1,8 Гбит / с между двумя машинами.

Эти вопросы и ответы были очень полезны для понимания связывания с LACP, но нет конкретного примера, как проверить пропускную способность около 1,8 Гбит / с. Для меня было важно проверить это, поэтому я расскажу, как я это тестировал.

Так как @ChrisS отметил в своем ответе, что важно иметь полностью независимые копии iperf. Для этого я подключаюсь к lacp-серверу с двумя клиентами. На lacp-сервере использую экран для запуска независимых экземпляров iperf в двух окнах / сеансах экрана. Я также гарантирую наличие независимых потоков данных, используя разные порты для каждого соединения. Мой коммутатор с привязкой LACP к серверу - TP-LINK T1600G-52TS. Все устройства используют Debian 10 (Buster). Два тестовых клиента подключены к порту коммутатора. Сначала я запускал iperf в режиме сервера на lacp-сервере два раза в течение экран а затем выполняется на клиентах в то же время (используя ssh):

iperf --time 30 --port 5001 --client lacp-server   # first test client
iperf --time 30 --port 5002 --client lacp-server   # second test client

Вот результаты на lacp-сервере для первого подключения:

lacp-server ~$ iperf -s -p 5001
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 192.168.10.11 port 5001 connected with 192.168.10.69 port 44120
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-30.0 sec  2.99 GBytes   855 Mbits/sec

а для второго подключения:

lacp-server ~$ iperf -s -p 5002
------------------------------------------------------------
Server listening on TCP port 5002
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[  4] local 192.168.10.11 port 5002 connected with 192.168.10.80 port 48930
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-30.0 sec  3.17 GBytes   906 Mbits/sec

Вместе это составляет 855 Мбит / с + 906 Мбит / с = 1,761 Мбит / с.

@ArseniMourzenko отметил в своем ответе:

При наличии всего двух сетевых адаптеров на сервере вероятность получения одного и того же канала от двух клиентов составляет 50%, что приведет к ограничению общей скорости на уровне 1 Гбит / с. Три сетевых адаптера уменьшают вероятность до 33%, четыре - до 25%.

Я повторил тест более 10 раз, чтобы проверить это, но всегда получаю пропускную способность около 1,8 Гбит / с, поэтому я не могу это подтвердить.

Статистика интерфейсов показывает, что его использование сбалансировано:

lacp-server ~$ ip -statistics link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    RX: bytes  packets  errors  dropped overrun mcast
    3088       30       0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    3088       30       0       0       0       0
2: eno1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond1 state UP mode DEFAULT group default qlen 1000
    link/ether 5e:fb:29:44:e9:cd brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    39231276928 25845127 0       0       0       916
    TX: bytes  packets  errors  dropped carrier collsns
    235146272  3359187  0       0       0       0
3: eno2: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond1 state UP mode DEFAULT group default qlen 1000
    link/ether 5e:fb:29:44:e9:cd brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    36959564721 24351697 0       0       0       60
    TX: bytes  packets  errors  dropped carrier collsns
    267208437  3816988  0       0       0       0
4: bond1: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 5e:fb:29:44:e9:cd brd ff:ff:ff:ff:ff:ff
    RX: bytes  packets  errors  dropped overrun mcast
    69334437898 50196824 0       4253    0       976
    TX: bytes  packets  errors  dropped carrier collsns
    502354709  7176175  0       0       0       0

С тремя тестовыми клиентами я получил следующие результаты:

  • 522 Мбит / с + 867 Мбит / с + 486 Мбит / с = 1,875 Мбит / с
  • 541 Мбит / с + 863 Мбит / с + 571 Мбит / с = 1,975 Мбит / с
  • 534 Мбит / с + 858 Мбит / с + 447 Мбит / с = 1,839 Мбит / с
  • 443 Мбит / с + 807 Мбит / с + 606 Мбит / с = 1,856 Мбит / с
  • 483 Мбит / с + 805 Мбит / с + 512 Мбит / с = 1,800 Мбит / с


Ссылки:
Link Aggregation и основы LACP
Связывание LACP и конфигурация Linux
Драйвер связывания Ethernet для Linux HOWTO
RedHat - Использование связывания каналов