Обнаружилась ошибка в коммутаторах DLink серий DES38xx DGS31xx (так же оно есть еще и в 3Com SS2). Ошибка связана с неправильным алгоритмом при выборе порта и приводит к потерям пакетов и деградации производительности.
Ошибка легко повторяется при использвании следующей схемы:
Код:
+-------------------+ +----------+ +--------+
| Router 1 | | Switch 1 | | Switch |
+-------------------+ +----------+ . . . +--------+ +--------+
| vlan1 ---\ | | /port 1 ==100M=== . L2 . ===== port1 | | |
| + eth0 ===1GE===+ port25 | . . | === Router |
| vlan2 ---/ | | \port 2 ==100M=== . NET . ===== port2 | | |
+-------------------+ +----------+ . . . +--------+ +--------+
Есть роутер (1) в котором есть 3 интерфейса: 2 vlan и один релаьный интерфейс 1000Mbit.
в linux это выглядит так:
vconfig set_name_type VLAN_PLUS_VID_NO_PAD
ifconfig eth0 up
vconfig add eth0 1
vconfig add eth0 2
ifconfig vlan1 192.168.1.1
ifconfig vlan2 192.168.2.1
через гигабитный порт eth0 подключен Switch 1, где ошибка и происходит.
конфигурация свича:
create vlan v1 tag 1
create vlan v2 tag 2
conf vlan v1 add tag 1,25 ; 25 - порт в сторону рутера, 1 - порт "наружу"
conf vlan v2 add tag 2,25 ; 25 - порт в сторону рутера, 2 - порт "наружу"
Ну можно еще удалить из 1 и 2 порта все, что там есть untagged, дабы не было никакой связи между этими портами.
Порты 1 и 2 свича (1) - 100М , воткнуты в некую сеть, которая транспортирует трафик без потерь, и сохраняет теги 802.1q. Для эксперемента можно соединить cross over патчкордом с другим свитчем, который настраивается зеркально свичу 1.
В результате имеем сеть из двух роутеров, где есть 2 vlan с тегами 1 и 2. Роутеры соеденены между собой коммутаторами, где каждый тег идет в своем порту (первый тег в первом порту, второй во втором).
Mac адрес на интерфейсах vlan1 и vlan2 в первом и втором рутерах одинаковый, и соответствует mac адресу интерфейса eth0. Дальше роутере 2 запускаем iperf в режиме сервера (или заменяем на iptables -I INPUT -j DROP -p udp -s 192.168.0.0/23 --dport 5001 так как статистика тут не нужна). Адрес этого роутера будет на vlan1 192.168.1.2 , на vlan2 192.168.2.2.
На роутере 1 запускаем iperf в режиме генератора:
iperf -c 192.168.1.2 -u -B 100M -t 100000 &
iperf -c 192.168.2.2 -u -B 100M -t 100000 &
и смотрим прохождение трафикачерез интерфейсы в данной схеме.
На роутере 1 в интерфейсах vlan1 и vlan2 будет по 100М, как и должно быть, на eth0 будет сумма vlan1+vlan2 200Мбит, на порту 25 первого свича будет 200Мбит, а вот на портах 1 и 2 этого же коммутатора будет уже по 50Мбит. Почему ? Ведь оба порта 100М, в каждом из портов находится только один 802.1q vlan. Видимо тут есть ошибка, связанная с тем, что при выборе порта назначения в коммутаторе ка каком-то этапе не проверяется тег 802.1q, а смотрится лишь в mac адрес назначения. Соответственно, никаких ошибок на портах (sh e p порт) не видно.
И, если прибить один из генерирующих iperf-ов , то в порту, соответствующему vlan, где трафик остался будет 100Мбит.
Данная ошибка воспроизводится 100% на придеденнных выше типах свичей, перезагрузка самих свичей (с сохраненной конфигурацией) проблему не решает. Прошивка свичей везде самая свежая.
ЗЫ: я знаю, что есть агрегация портов в свиче и т.д. но желания использовать его нет, из-за невозможности свича эффективно балансировать нагрузку между портами.
ЗЫЫ: нагрузку можно легко смотреть через ifstat, который так же умеет снимать данные и через SNMP.