company_banner

Как оптимизировать полосу пропускания в сетях Ethernet

    В блоге 45 Drives вышел достаточно интересный материал Роба МакКвина, который работает в R&D отделе компании. В нем идет речь об оптимизации полосы пропускания. Попробуем разобраться в этой истории и основных моментах, о которых рассказал Роб.

    / Фото Karl Baron CC

    Роб сравнивает 10-гигабитный стандарт с покупкой нового «Мустанга» после многолетней езды на обычном городском седане — гигабитном Ethernet. Схожесть в настройке позволяет не только с легкостью перейти с одного на другой, но и настроить 20-гигабитные и 30-гигабитные соединения.

    Автомобильные аналогии вполне уместны, ибо пропускная способность как понятие схоже с тем, что из себя представляет магистраль: чем больше полос на дороге, тем больше автомобилей пользуется дорогой. С ИТ-инфраструктурой все аналогично.

    Какое оборудование здесь упоминается:

    • Ячейки хранения Storinator (чтение и запись на скоростях больше 2 Гбайт/с)
    • Коммутатор Netgear XS708E
    • Сетевые адаптеры Intel X540-T2 (идут к Storinator'у)
    • Сетевые кабели Cat 6, Cat 6a и Cat7

    Дело в том, что любая ОС, автоматически определить возможность использования 10-гигабитной сетевой карты — поэтому сам процесс в целом идентичен настройке стандартной гигабитной сети.

    Что еще:

    • DHCP для коммутатора — выдача IP-адресов
    • iperf для тестирования качества сетевого соединения

    Весь дальнейший процесс основан на объединении нескольких 10-гигабитных соединений. Драйвер для связывания каналов уже есть в Linux — дополнительного ПО здесь не требуется.

    Далее в CentOS нужно создать конфигурационный файл (устройства, IP, подсеть, режим связывания и так далее). Для решения этой задачи Роб советует взглянуть на его руководство по модификации каналов для CentOS 7. Процесс настройки для FreeNAS находится тут.

    Роб столкнулся с непредвиденной проблемой, которая позволила получить пропускную способность только в 11,3 Гбит/с (вместо 20 Гбит/с). Подозрение пало на стандартный размер окна TCP, но в итоге выяснилось, что Linux самостоятельно определяет оптимальный размер окна.

    Другой ход — переключение на джамбо-кадры дал только 13,9 Гбит/с. А вот две сетевые карты в каждой машине и связывание двух интерфейсов (по одному на каждую карту) с коммутатором дало искомое 20-гигабитное соединение (что и подтвердил iperf).

    P.S. Другие материалы по теме из нашего блога:

    ИТ-ГРАД
    vmware iaas provider

    Comments 10

      +5
      То есть вся статья ради того, чтобы сказать, что у вас сетевые карты на 14 гбит, а не на 20?
      Щиорт побери.

      А где куда более важная инфа про irq, про то, что одна сессия всё равно будет в 10G?
        0
        Насколько я знаю, round-robin — единственный из механизмов port bonding, позволяющий увеличивать скорость одной сессии. Жалко, работает не везде и как попало (очень сильно зависит от конкретного свитча)
          +1
          Да, увеличивает, только резко возрастает количество TCP out of order пакетов, даже при crossover подключении без свичей вовсе. Поэтому нужно задирать параметр net.ipv4.tcp_reordering.
        0
        Узкое место: PCI-E, а точнее серверный мост, который является посредником между CPU и PCI-E устройствами. Начиная с чипсета intel c202/c602 PCI-E линии подключены напрямую к CPU. По сравнению с intel 5500/5520 ускорение на порядок! Возможно Ваша платформа не имеет прямых линий на CPU.
          +1
          Статья — много воды и немножко цитат из bonding.txt.
          Вы открыли миру аггрегацию линков!
            0
            Мне казалось, для аггрегирования обычно используют mode=4 (IEEE 802.3ad) (LACP).
            Автору статьи нужно было запустить, например, htop, чтобы посмотреть, как дела с прерываниями.
            Если видно, что загружено только одно ядро процессора загрузкой ядра linux (в htop красненький цвет), то драйвер упирался прерываниями в CPU.
            У интелового драйвера можно выставить 4 или 8 векторов прерываний, которые могут висеть каждое на своем ядре.
            Тогда драйвер сетевухи будет размазывать нагрузку на 4-8 ядер, а не на одно.
            Вполне возможно, тогда автор получил бы 20 Гб сразу.
              0
              Через iperf автор ни с каким режимом кроме round-robin никогда бы не получил больше 10Гбит.

              Ибо все эти режимы используют хеш от (srcip | dstip | srcport | dstport | srcmac | dstmac) в разных режимах и комбинациях для выбора интерфейса для передачи данных.

              В таком виде единственный TCP поток пойдет всегда по одному интерфейсу.
                0
                Ну, не совсем. Iperf поддерживает работу в несколько потоков.
                Каждый поток открывает свое соединение.
                Я получил вот такую картину:
                22:42:09.093381 IP 127.0.0.1.51086 > 127.0.0.1.5001: tcp 65483
                22:42:09.093446 IP 127.0.0.1.51090 > 127.0.0.1.5001: tcp 106
                22:42:09.093463 IP 127.0.0.1.5001 > 127.0.0.1.51090: tcp 0
                22:42:09.093479 IP 127.0.0.1.51090 > 127.0.0.1.5001: tcp 65483
                22:42:09.093562 IP 127.0.0.1.51088 > 127.0.0.1.5001: tcp 65483
                22:42:09.093590 IP 127.0.0.1.5001 > 127.0.0.1.51088: tcp 0
                22:42:09.093642 IP 127.0.0.1.51086 > 127.0.0.1.5001: tcp 65483
                22:42:09.093670 IP 127.0.0.1.5001 > 127.0.0.1.51086: tcp 0
                22:42:09.093719 IP 127.0.0.1.51089 > 127.0.0.1.5001: tcp 106
                22:42:09.093735 IP 127.0.0.1.5001 > 127.0.0.1.51089: tcp 0
                22:42:09.093750 IP 127.0.0.1.51091 > 127.0.0.1.5001: tcp 65483
                22:42:09.093774 IP 127.0.0.1.5001 > 127.0.0.1.51091: tcp 0
                22:42:09.093843 IP 127.0.0.1.51087 > 127.0.0.1.5001: tcp 65483
                


                Автору статьи нужно было просто указать -P 2, или -P 4.
                  0
                  Это понятно, но, как я понял, целью его был разгон именно одного потока.
                  Да и никто не гарантирует, что та комбинация IP:PORT, которая будет получена приведёт к использованию двух разных интерфейсов.
                    0
                    > Это понятно, но, как я понял, целью его был разгон именно одного потока.
                    Мне кажется, автор просто не подумал об этом.
                    Как говорится, не ищите хитрый план там…
                    Я не знаю примеров реальной нагрузки, где нужно отдавать 10Г в одну TCP сессию.

            Only users with full accounts can post comments. Log in, please.