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

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

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

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

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

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

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

Прочитав файл 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 и низкоуровневых драйверов. Это включает в себя увеличение сетевых буферов. Вот почему 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: / и т.д. / sysconfig / сеть / 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

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

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

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

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

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

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

Jumbo-кадры?

ifconfig <interface> mtu 9000

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

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

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