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
Настраиваем 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 ) на каждой из машин
установленных по разные стороны.
Цель - объединить два интерфейса в один.
Среди решений которые пришли мне в голову было два: использовать
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.
Далее убедившись что каждый из физических интерфейсов пингует своего
соседа можно попробовать пропинговать 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):
Итого прирост всего-то 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 - количество пакетов которые могут
прийти "вне очереди".
На этом эксперименты я закончил. Число 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)
816 Прочтений • [Объединение интерфейсов в Linux через teql (linux interface balance teql ethernet)] [08.05.2012] [Комментариев: 0]