Почему моя гигабитная связь не обеспечивает пропускную способность не менее 150 МБ / с?


17

Я напрямую подключил два кроссовера PowerEdge 6950 (используя прямые линии) к двум разным PCIe-адаптерам.

Я получаю гигабитную ссылку на каждую из этих линий (1000 Мбит, полный дуплекс, управление потоком в обоих направлениях).

Теперь я пытаюсь связать эти интерфейсы в bond0 с помощью rr-алгоритма с обеих сторон (я хочу получить 2000 МБит для одного сеанса IP).

Когда я проверил пропускную способность путем перевода / dev / zero в / dev / null с использованием dd bs = 1M и netcat в режиме tcp, я получил пропускную способность 70 МБ / с - нет - как и ожидалось, более 150 МБ / с.

Когда я использую отдельные строки, я получаю около 98 МБ / с в каждой строке, если я использовал другое направление для каждой строки. Когда я использую отдельные линии, я получаю 70 МБ / с и 90 МБ / с на линию, если трафик идет в «том же» направлении.

Прочитав bonding-readme (/usr/src/linux/Documentation/networking/bonding.txt), я обнаружил, что следующий раздел будет полезен: (13.1.1 Выбор режима соединения MT для топологии с одним коммутатором)

balance-rr: этот режим является единственным режимом, который позволяет одному соединению TCP / IP распределять трафик между несколькими интерфейсами. Следовательно, это единственный режим, который позволяет одному потоку TCP / IP использовать пропускную способность более чем одного интерфейса. Однако это обходится дорого: чередование часто приводит к тому, что одноранговые системы получают пакеты не по порядку, что приводит к срабатыванию системы управления перегрузкой TCP / IP, часто путем повторной передачи сегментов.

    It is possible to adjust TCP/IP's congestion limits by
    altering the net.ipv4.tcp_reordering sysctl parameter. The
    usual default value is 3, and the maximum useful value is 127.
    For a four interface balance-rr bond, expect that a single
    TCP/IP stream will utilize no more than approximately 2.3
    interface's worth of throughput, even after adjusting
    tcp_reordering.

    Note that this out of order delivery occurs when both the
    sending and receiving systems are utilizing a multiple
    interface bond.  Consider a configuration in which a
    balance-rr bond feeds into a single higher capacity network
    channel (e.g., multiple 100Mb/sec ethernets feeding a single
    gigabit ethernet via an etherchannel capable switch).  In this
    configuration, traffic sent from the multiple 100Mb devices to
    a destination connected to the gigabit device will not see
    packets out of order.  However, traffic sent from the gigabit
    device to the multiple 100Mb devices may or may not see
    traffic out of order, depending upon the balance policy of the
    switch.  Many switches do not support any modes that stripe
    traffic (instead choosing a port based upon IP or MAC level
    addresses); for those devices, traffic flowing from the
    gigabit device to the many 100Mb devices will only utilize one
    interface.

Теперь я изменил этот параметр на обоих подключенных серверах на всех линиях (4) с 3 на 127.

После повторного соединения я получаю около 100 МБ / с, но все равно не больше.

Есть идеи почему?

Обновление: Детали оборудования от lspci -v:

24:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
        Subsystem: Intel Corporation PRO/1000 PT Dual Port Server Adapter
        Flags: bus master, fast devsel, latency 0, IRQ 24
        Memory at dfe80000 (32-bit, non-prefetchable) [size=128K]
        Memory at dfea0000 (32-bit, non-prefetchable) [size=128K]
        I/O ports at dcc0 [size=32]
        Capabilities: [c8] Power Management version 2
        Capabilities: [d0] MSI: Mask- 64bit+ Count=1/1 Enable-
        Capabilities: [e0] Express Endpoint, MSI 00
        Kernel driver in use: e1000
        Kernel modules: e1000

Обновить окончательные результаты:

Скопировано 8589934592 байт (8,6 ГБ), 35,8489 секунд, 240 МБ / с

Я изменил много опций tcp / ip и low-level-driver. Это включает в себя расширение сетевых буферов. Вот почему ddтеперь отображаются числа, превышающие 200 МБ / с: dd завершается, пока еще есть вывод, ожидающий передачи (в буферах отправки).

Обновление 2011-08-05: настройки, которые были изменены для достижения цели ( /etc/sysctl.conf ):

# See http://www-didc.lbl.gov/TCP-tuning/linux.html
# raise TCP max buffer size to 16 MB. default: 131071
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# raise autotuninmg TCP buffer limits
# min, default and max number of bytes to use
# Defaults:
#net.ipv4.tcp_rmem = 4096 87380 174760
#net.ipv4.tcp_wmem = 4096 16384 131072
# Tuning:
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Default: Backlog 300
net.core.netdev_max_backlog = 2500
#
# Oracle-DB settings:
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
kernel.shmmax = 2147659776
kernel.sem = 1250 256000 100 1024
net.core.rmem_default = 262144
net.core.wmem_default = 262144
#
# Tuning for network-bonding according to bonding.txt:
net.ipv4.tcp_reordering=127

Специальные настройки для устройства связи (SLES: / etc / sysconfig / network / ifcfg-bond0 ):

MTU='9216'
LINK_OPTIONS='txqueuelen 10000'

Обратите внимание, что установка максимально возможного MTU была ключом к решению.

Настройка буферов rx / tx задействованных сетевых карт:

/usr/sbin/ethtool -G eth2 rx 2048 tx 2048
/usr/sbin/ethtool -G eth4 rx 2048 tx 2048

Вы проверили, /proc/net/bonding/bond0чтобы убедиться, что вы действительно настроены на баланс-р-р ? Вы видели примечание о том, что документация, которую вы вставили в связи с 4 интерфейсами, дает вам пропускную способность только в 2,3 интерфейса? Учитывая это замечание, маловероятно, что вы приблизитесь к 2000 Мбит / с, которые хотите.
Зоредаче

Я не уверен, что LACP / Bonding может разделить один сеанс TCP на несколько физических каналов.
Кедар

@Kedare, это не LACP, это собственный объединяющий планировщик пакетов модулей связывания Linux, который может использовать несколько ссылок для одного сеанса TCP.
Жаворонки

1
Лучшим способом проверки пропускной способности по ссылке является использование nuttcp. Тестируйте одиночные или множественные соединения легко.
MikeyB

Ответы:


8

У меня была похожая проблема, когда я пытался поднять скорость синхронизации drbd по двум гигабитным каналам. В итоге мне удалось получить скорость синхронизации около 150 МБ / с. Это были настройки, которые я применил на обоих узлах:

ifconfig bond0 mtu 9000
ifconfig bond0 txqueuelen 10000
echo 3000 > /proc/sys/net/core/netdev_max_backlog

Вы также можете попытаться включить объединение прерываний, если у вас его еще нет для сетевых карт (с помощью ethtool --coalesce )


Я не знаю. Это было не нужно в моем случае. Установки этих параметров было достаточно. Но я думаю, если вы установите его, это не повредит. Скорость передачи улучшилась?
user842313

1
Я в настоящее время не могу проверить это, но это будет наиболее вероятно. Ваш намек на «слияние», вероятно, попадает в цель. Я нашел интересную статью (на немецком языке) о настройках «High Speed ​​Ethernet». Гигантские кадры движутся в одном направлении - речь идет о сокращении количества pci-прерываний, необходимых для передачи рабочей нагрузки.
Нильс

Если вы думаете о некотором узком месте, таком как ограничение количества прерываний, такой инструмент, как collectd , определенно поможет, хотя и потребует небольшой настройки. Посмотрите, например, этот график
user842313

0

Вы настроили эту двустороннюю магистраль на коммутаторе? если нет, то он не будет работать так, он будет работать только в активном / пассивном режиме и использовать только 1 из ссылок 1 Гбит / с.


Нет подключенного сетевого устройства. Это прямые кроссоверные кабели.
Нильс

5
Ах, значит, вам не повезло по другой совершенно другой причине; Транки LACP / Etherchannel, такие как эта, полагаются на дисперсию в первом (и, где необходимо, втором и третьем) младшем значащем бите MAC-адреса назначения, чтобы определить, какой элемент соединительной линии используется для связи с этим MAC. Учитывая, что у вас будет только один MAC для транка на каждом конце, они также никогда не будут использовать более одной ссылки.
Chopper3

2
он не использует etherchannel / 802.3ad, он использует balance-rr, который, точнее говоря, даже не требует поддержки коммутатора.
The Wabbit

@ Chopper3: То есть, по вашему мнению, проблема MAC не должна появляться в RR?
Нильс

2
Не знаю достаточно хорошо, чтобы комментировать, хотелось бы, чтобы вы упомянули об этом раньше, но не берите в голову.
Chopper3

0

Похоже, что PowerEdge 6950 ограничен, возможно, слотами PCI, которые достигают 133 МБ / с и распределяются по всей шине. Возможно, вы видите ограничения ввода-вывода для самой архитектуры системной шины.

Помимо тестирования других систем с другим аппаратным обеспечением и архитектурой ввода / вывода, кабели также могут быть задействованы. Некоторые возможные комбинации могут быть в соответствии с различными рейтингами (5e против 6), а также длины (короче не всегда лучше).


Я уже получил 160 МБ / с - используя параллельные одиночные линии. Но это падает до 100 МБ / с при соединении. На каждой отдельной линии я получаю почти 100 МБ / с, поэтому, похоже, проблема не в кабелях.
Нильс

Похоже, что для PowerEdge 6950 нет поддержки PCIe. Что-нибудь «отличается» от его шины PCI? Несмотря на это, вы можете посмотреть спецификации шины ввода-вывода для PowerEdge 6950.
user48838

Я обновил вопрос с выводом lspci. Это не было узким местом. Я получаю свои 200 МБ / с сейчас.
Нильс

0

Джамбо кадры?

ifconfig <interface> mtu 9000

Это должно уменьшить нагрузку на процессор, верно? Интересно, что процессор делает во время этих тестов.
SpacemanSpiff

1
с MTU 9000 вместо 1500 вы уменьшаете количество пакетов данных tcp, которые вам необходимы для передачи того же объема данных (полезная нагрузка больше). Таким образом, вы выполняете меньше обработки пакетов как с обеих сторон, так и с обеих сторон и отправляете больше данных.
Жюльен Вехент

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

Мне тоже интересно узнать результат. Кроме того, попробуйте привязать каждый сетевой адаптер к ядру процессора. Недавнее ядро ​​должно справиться с этим должным образом, но я не уверен, как это будет работать со связыванием Идея состоит в том, чтобы избежать переключения с кэша l2 на другой для каждого пакета.
Жюльен Вехент

Загрузка процессора не является проблемой. Все варианты разгрузки включены ...
Нильс

0

делать гигантские кадры - гигантская помощь, если ваш коммутатор и ник поддерживают ее. если у вас неуправляемая команда siwtch, скорее всего, вы не получите ничего, что вам нужно для пропускной способности, но это не тот случай, если вы связываете порты на коммутаторе. вот что я узнал давно, в 65% случаев, это физическая проблема. Вы используете кабель Cat6?


0

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

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


В этом особом случае нет сетевых устройств. (прямые перекрестные линии). Это также единственный (реальный) случай, когда вы можете использовать алгоритм RR для распределения нагрузки по всем линиям за один сеанс.
Нильс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.