The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Объединение интерфейсов в Linux через teql (linux interface balance teql ethernet)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: linux, interface, balance, teql, ethernet,  (найти похожие документы)
From: Юрий Кисель. <netilesik[_AT_]elo[.]iptelecom[.]net[.]ua> Newsgroups: http://www.cisco-linux.com.ua Date: Sun, 28 Mar 2006 17:02:14 +0000 (UTC) Subject: Объединение интерфейсов в Linux через teql Оригинал: http://www.cisco-linux.com.ua/index.cgi?action=articles|show_article&ID=1 Настраиваем teql в Linux на интерфейсах разного типа В связи с острой необходимостью увеличить пропускную способность сети между двумя зданиями (на расстоянии 100-150 метров) мне понадобилось выполнить следующие опыты. Так как скорость по ethernet кабелю лежащему между ними не поднималась выше 10 Mb/s (поставить свитч где-то по центру было не возможно), а прокладывать второй кабель было очень проблематично, то было принято решение использовать пару неиспользуемых адаптера D-Link DWL-G520+. Карточки построены на чипсете Texas Instruments ACX 111 и для них есть драйвер под Linux. (http://acx100.sourceforge.net/ и http://acx100.erley.org/) Настройку карточек под Linux я описывать не буду, так как в интернете валом документации на эту тему...(я использовал Craig's ACX100/111 Guide for Linux) Имеем - два интерфейса ( eth0 и wlan0 ) на каждой из машин установленных по разные стороны. |---------| / \ |---------| | 20.0.0.1|-( wlan )-|20.0.0.2 | | | \ / | | | PC1 | | PC2 | | | | | | | ethernet | | |_10.0.0.1|---------------|10.0.0.2_| Цель - объединить два интерфейса в один. Среди решений которые пришли мне в голову было два: использовать bonding или teql. Почитав документацию по bonding-у (Documentation/networking/bonding.txt) сразу откинул этот вариант, так как модуль использует утилиту ethtool для определения скорости адаптера и/или mii-tool для link up/down. В моем случае с wlan карточкой эти модули не работают. (Кроме того, модуль работает только с equal-link интерфейсами) Остался вариант teql... Загрузка модуля sch_teql: У модуля есть всего один параметр: max_equalizers - количество создаваемых устройств teqlX. [root@ilesik sched]# modinfo sch_teql parmtype: max_equalizers:int parm: max_equalizers:Max number of link equalizers .... [root@ilesik root]# modprobe sch_teql После выполнения команды появился новый интерфейс с названием teql0: [root@ilesik sched]# ip link list 14: teql0: mtu 1500 qdisc pfifo_fast qlen 100 link/void .... Объединение: Далее все необыкновенно просто (как описано в sch_teql.c) : для каждого из подчиненных устройств указываем в качестве корневого qdisc-а teql0: (на всякий случай предварительно удалив корневые qdisc-и :-)) [root@ilesik sched]# tc qdisc del dev eth0 root [root@ilesik sched]# tc qdisc del dev wlan0 root [root@ilesik sched]# tc qdisc add dev eth0 root teql0 [root@ilesik sched]# tc qdisc add dev wlan0 root teql0 [root@ilesik sched]# tc qdisc show qdisc teql0 8007: dev eth0 qdisc teql0 8008: dev wlan0 qdisc pfifo_fast 0: dev teql0 [Unknown qdisc, optlen=20] [root@ilesik sched]# Далее стандартная настройка интерфейсов: [root@ilesik sched]# ifconfig eth0 10.0.0.2 newmask 255.255.255.0 up [root@ilesik sched]# ifconfig wlan0 20.0.0.2 newmask 255.255.255.0 up [root@ilesik sched]# ifconfig teql0 30.0.0.2 newmask 255.255.255.0 up На второй машине аналогично только адреса заканчиваются на 1. Надо не забыть выключить rp_filter на каждом интерфейсе подключенном к teql0, так как на каждый физический интерфейс будут приходить пакеты с dst ip не равным ip этого интерфейса, а равным ip интерфейса teql0. [root@ilesik sched]# echo "0" > /proc/sys/net/ipv4/conf/eth0/rp_filter [root@ilesik sched]# echo "0" > /proc/sys/net/ipv4/conf/wlan0/rp_filter На второй машине аналогично. Настройка wlan интерфейсов (минимальная): [root@ilesik sched]# iwconfig wlan0 mode ad-hoc [root@ilesik sched]# iwconfig wlan0 essid "test" Далее убедившись что каждый из физических интерфейсов пингует своего соседа можно попробовать пропинговать 30.0.0.1: [root@ilesik sched]# ping 30.0.0.1 -c 6 PING 30.0.0.1 (30.0.0.1) 56(84) bytes of data. 64 bytes from 30.0.0.1: icmp_seq=0 ttl=64 time=0.276 ms 64 bytes from 30.0.0.1: icmp_seq=1 ttl=64 time=1.05 ms 64 bytes from 30.0.0.1: icmp_seq=2 ttl=64 time=0.304 ms 64 bytes from 30.0.0.1: icmp_seq=3 ttl=64 time=1.07 ms 64 bytes from 30.0.0.1: icmp_seq=4 ttl=64 time=0.302 ms 64 bytes from 30.0.0.1: icmp_seq=5 ttl=64 time=1.07 ms В данном случае даже видно (по задержке) какой пакет "ходил" по какому интерфейсу. Для надежности я запустил tcpdump на каждом из интерфейсов второго маршрутизатора: [root@gwl root]# tcpdump -n -i eth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 18:45:53.647752 IP 30.0.0.2 > 30.0.0.1: icmp 64: echo request seq 0 18:45:55.656000 IP 30.0.0.2 > 30.0.0.1: icmp 64: echo request seq 2 18:45:57.667520 IP 30.0.0.2 > 30.0.0.1: icmp 64: echo request seq 4 И для wlan0: [root@gwl root]# tcpdump -n -i wlan0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on wlan0, link-type EN10MB (Ethernet), capture size 96 bytes 18:45:54.652580 IP 30.0.0.2 > 30.0.0.1: icmp 64: echo request seq 1 18:45:56.659783 IP 30.0.0.2 > 30.0.0.1: icmp 64: echo request seq 3 18:45:58.683827 IP 30.0.0.2 > 30.0.0.1: icmp 64: echo request seq 5 Как видно teql равномерно разбросал по 3-и пакета в каждый интерфейс. Так как на 2-м маршрутизаторе тоже настроен teql то icmp echo reply мы тоже получаем по разным интерфейсам: [root@ilesik root]# tcpdump -i eth0 -n src host 30.0.0.1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 18:59:28.319834 IP 30.0.0.1 > 30.0.0.2: icmp 64: echo reply seq 1 18:59:30.324767 IP 30.0.0.1 > 30.0.0.2: icmp 64: echo reply seq 3 18:59:32.335110 IP 30.0.0.1 > 30.0.0.2: icmp 64: echo reply seq 5 Для wlan0: [root@ilesik root]# tcpdump -n -i wlan0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on wlan0, link-type EN10MB (Ethernet), capture size 96 bytes 18:59:27.316539 IP 30.0.0.1 > 30.0.0.2: icmp 64: echo reply seq 0 18:59:29.321931 IP 30.0.0.1 > 30.0.0.2: icmp 64: echo reply seq 2 18:59:31.327306 IP 30.0.0.1 > 30.0.0.2: icmp 64: echo reply seq 4 Тестирование: Тесты я проводил простой и удобной утилитой для замера пропускной способности сети - iperf. Тесты проводились при полном отсутствии какого-либо трафика в сети. (Тест для физических интерфейсов выполнялся ДО установки qdisc-a в teql0) Тест pc1.eth0 <-> pc2.eth0 (10.0.0.1 <-> 10.0.0.2): 1) 8.16 Mbits/sec 2) 8.09 Mbits/sec 3) 8.04 Mbits/sec Тест pc1.wlan0 <-> pc2.wlan0 (20.0.0.1 <-> 20.0.0.2): 1) 11.7 Mbits/sec 2) 11.4 Mbits/sec 3) 11.6 Mbits/sec После настройки teql0 и привязки к нему eth0 и wlan0: Тест pc1.teql0 <-> pc2.teql0 (30.0.0.1 <-> 30.0.0.2): 1) 13.6 Mbits/sec 2) 13.4 Mbits/sec 3) 13.8 Mbits/sec Итого прирост всего-то 2-2,5 мб по сравнению с pc1.wlan0 <-> pc2.wlan0. Игры с tcp_reordering: Как пишет автор sch_teql Alexey Kuznetsov (linux/net/sched/sch_teql.c) teql должен отлично работать даже на интерфейсах 100Mb и 9600baud. Но за время прохождения пакета по одному интерфейсу, по второму (другому) может пройти 2-3 а то и намного больше пакетов, при этом tcp стек считает что один (или более) из пакетов не дошел ... и начинается повторная передача. Для этого в ядре есть замечательный параметр - /proc/sys/net/ipv4/tcp_reordering - количество пакетов которые могут прийти "вне очереди". Тест No.2 (tcp_reordering = 10) pc1.teql0 <-> pc2.teql0 (30.0.0.1 <-> 30.0.0.2): На обоих машинах выполняем: [root@ilesik root]# echo "10" > /proc/sys/net/ipv4/tcp_reordering 1) 17.2 Mbits/sec 2) 17.0 Mbits/sec 3) 16.8 Mbits/sec Тест No.3 (tcp_reordering = 15) pc1.teql0 <-> pc2.teql0 (30.0.0.1 <-> 30.0.0.2): На обоих машинах выполняем: [root@ilesik root]# echo "15" > /proc/sys/net/ipv4/tcp_reordering 1) 15.9 Mbits/sec 2) 16.0 Mbits/sec 3) 16.3 Mbits/sec На этом эксперименты я закончил. Число tcp_reordering - 10 или 15 не является "идеальным", оно отлично подошло в моем случае. Как итог: 19 Mbits/sec я так и не достиг (8 по eth + 11 по wlan) но 17 - стабильно! PS: Появилось сильное желание заставить D-Link-и работать на своей "рекламной" (написанной на коробке большим красным текстом) скорости - 54Mbps, тогда можно вообще ethernet отключить. :-) PS2: Ip адреса выбраны для удобства восприятия, в реальных условиях они все из сети 10.0.0.0/8. При настройке важно обратить внимание на таблицу маршрутизации каждого из маршрутизаторов, в приведенном случае надо проверить что маршрут на сеть 30.0.0.x/24 идет через teql0. Юрий Кисель. (netilesik[_AT_]elo[.]iptelecom[.]net[.]ua)

<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>

 Добавить комментарий
Имя:
E-Mail:
Заголовок:
Текст:




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру