Я безпосередньо підключив два кросовери 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 та драйверів низького рівня. Сюди входить розширення мережевих буферів. Ось чому 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
Спеціальні параметри для bond-пристрою (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
nuttcp
. Легко протестуйте одиночні з'єднання або кілька підключень
/proc/net/bonding/bond0
щоб переконатися, що ви насправді отримуєте баланс-rr ? Чи бачили ви зауваження, що документація, яку ви вставили про зв'язок між 4 інтерфейсами, дає лише 2.3 інтерфейси, варті пропускної здатності? Враховуючи цю замітку, здається, дуже малоймовірно, що ви наблизитесь до потрібних 2000 Мб / с.