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

Максимальная пропускная способность агрегации каналов (LACP / 802.3ad)

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

У меня есть два сервера: Сервер 1 (S1) имеет 4 соединения Ethernet 1 Гбит; Сервер 2 (S2) имеет 2 соединения Ethernet по 1 Гбит. Оба сервера работают под управлением Ubuntu 12.04, хотя и с ядром 3.11.0-15 (из пакета lts-saucy linux-generic).

У обоих серверов все соответствующие сетевые интерфейсы объединены в единый интерфейс bond0 со следующей конфигурацией (в /etc/network/interfaces):

bond-mode 802.3ad
bond-miimon 100
bond-lacp-rate fast
bond-slaves eth0 eth1 [eth2 eth3]

Между серверами находится пара коммутаторов HP, которые (я думаю) правильно настроены для LACP на рассматриваемых портах.

Теперь связь работает - сетевой трафик успешно течет на обе машины и с них. И все соответствующие интерфейсы используются, поэтому не похоже, что агрегация полностью перестает работать. Однако мне нужна как можно большая пропускная способность между этими двумя серверами, и я не получаю ~ 2 Гбит / с, как ожидал бы.

В моем тестировании я заметил, что каждый сервер, кажется, выделяет каждое TCP-соединение (например, iperf, scp, nfs, что угодно) одному подчиненному интерфейсу. По сути, все кажется ограниченным максимумом в 1 гигабит.

Установив bond-xmit-hash-policy layer3+4, Я могу использовать iperf -c S1 -P2 для отправки на два подчиненных интерфейса, но на стороне сервера прием по-прежнему происходит только на одном подчиненном интерфейсе, и поэтому общая пропускная способность ограничена 1 Гбит / с, т.е. клиент показывает ~ 40-50 МБ / с на двух подчиненных интерфейсах, сервер показывает ~ 100 МБ / с на одном подчиненном интерфейсе. Без настройки bond-xmit-hash-policy отправка также ограничена одним подчиненным интерфейсом.

У меня создалось впечатление, что LACP должен разрешать такой тип связывания соединений, позволяя, например, одной передаче scp использовать все доступные интерфейсы между двумя хостами.

Я неправильно понимаю LACP? Или я где-то пропустил какие-то параметры конфигурации? Будем очень признательны за любые предложения или подсказки для расследования!

Быстрое и грязное объяснение состоит в том, что одна линия связи с использованием LACP не будет разделять пакеты по нескольким интерфейсам. Например, если у вас есть одно соединение TCP с потоковой передачей пакетов от HostA к HostB, оно не будет охватывать интерфейсы для отправки этих пакетов. В последнее время я много смотрел на LACP в поисках решения, над которым мы работаем, и это распространенное заблуждение, что «связывание» или «объединение» нескольких сетевых интерфейсов с LACP дает вам «пропускную способность» объединенных интерфейсов. Некоторые поставщики создали проприетарные драйверы, которые будут маршрутизировать через несколько интерфейсов, но стандарт LACP не соответствует тому, что я читал. Вот ссылка на приличную диаграмму и объяснение, которые я нашел в HP при поиске аналогичных проблем: http://www.hp.com/rnd/library/pdf/59692372.pdf

bond-xmit-hash-policy layer3+4 устанавливает балансировку нагрузки с исходного сервера на коммутатор. Он не устанавливает алгоритм балансировки нагрузки с вашего коммутатора на второй сервер. Это почти наверняка все еще сбалансировано на уровне 2 или 3, т.е. совсем не сбалансировано.

Ну, во-первых, когда вы используете драйвер объединения, это создаст некоторые накладные расходы и снизит ожидаемую максимальную пропускную способность, которая составляет ~ 940 МБ / с на адаптере 1 ГБ, на ~ 10%.

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

Еще одно соображение заключается в том, что один поток iperf, вероятно, не получит максимальной скорости. Для 1 ГБ, вероятно, более идеальным будет 2-6 потоков, вы можете использовать простой сценарий bash для одновременного запуска нескольких потоков.

Для сетевой карты Intel, но RSS и аппаратный RSC могут повлиять на пропускную способность, на Broadcom убедитесь, что TOE работает.

Первым шагом, однако, было бы удалить LAG и просто попробовать протестировать 1 порт трафика в каждой системе, чтобы увидеть, какую пропускную способность она получает, сделайте это со всеми портами, затем попробуйте 2. LACP - непостоянный зверь, чтобы его настроить. верно, и я никогда не пытался установить его на коммутаторе HP, только Force10 (pre-Dell).

Кроме того, почему есть пара переключателей?