Еще полгода назад я подарил себе не совсем обычную сетевую карту.
Конечно, для домашнего применения толку от нее не будет никакого, а вот для среднестатистического сервера она может стать приятным дополнением. Гигабитного порта не всегда достаточно для реализации всех замыслов. И тут на помощь может прийти многопортовая сетевая карта. Я же решил усложнить задачу. Мне нужна не просто агрегация нескольких гигабитных портов в один логический линк, но и возможность создать несколько интерфейсов в разных VLAN поверх такого линка.
На сервере волею судеб оказалась FreeBSD 9.1.
C:\>uname -a
FreeBSD k-42.ru 9.1-RELEASE-p9 FreeBSD 9.1-RELEASE-p9 #0: Fri Dec 13 13:34:05 NOVT 2013 root@k-42.ru:/sys/amd64/compile/Onyx amd64
После подключения сетевой карты она определилась как четыре порта:
C:\>ifconfig | grep flags
igb0: flags=8c02<BROADCAST,OACTIVE,SIMPLEX,MULTICAST> metric 0 mtu 1500
igb1: flags=8c02<BROADCAST,OACTIVE,SIMPLEX,MULTICAST> metric 0 mtu 1500
igb2: flags=8c02<BROADCAST,OACTIVE,SIMPLEX,MULTICAST> metric 0 mtu 1500
igb3: flags=8c02<BROADCAST,OACTIVE,SIMPLEX,MULTICAST> metric 0 mtu 1500
Замечательно. Теперь нужно из первых двух портов создать агрегированный линк под управлением протокола LACP до ближайшего коммутатора и создать интерфейс в VLAN 222. Первым делом необходимо настроить коммутатор. В данном случае им оказался ZyXEL 4728. Заходим через веб-интерфейс в Advanced Application — VLAN — Static VLAN и создаем VLAN под номером 222. Подаем его с тэгом в порты 11 и 12 (к которым у нас будет подключен сервер) и в порт 10G (который соединяет коммутатор с ядром сети).
В настройках порта (Advanced Application — VLAN — VLAN Port Settings) запрещаем нетэгированные пакеты с портов 11 и 12.
Теперь переходим к настройкам агрегированного линка. Заходим в Advanced Application — Link Aggregation и создаем линк T1, в который включаем порты 11 и 12. Ставим балансировку по IP-адресам источника и получателя.
Далее направляемся в меню LACP. Активируем протокол, оставляем приоритет 65535, чтобы параметры LACP определял сервер. Если вы хотите, чтобы управление агрегированным линком происходило со стороны коммутатора — имеет смысл поставить приоритет 1.
Коммутатор настроен. Теперь можно переходить к настройке сервера. В арсенале FreeBSD есть драйвер lagg, с помощью которого реализуется функционал агрегированных линков и LACP. В стандартном ядре этого драйвера нет, поэтому необходимо либо пересобрать ядро с параметром device lagg, либо добавить строчку if_lagg_load=»YES» в файл /boot/loader.conf.
После прочтения man lagg и изучения примеров в rc.conf появились следующие строчки:
ifconfig_igb0=»up»
ifconfig_igb1=»up»
cloned_interfaces=»lagg0 lagg0.222″
ifconfig_lagg0=»laggproto lacp laggport igb0 laggport igb1″
ifconfig_lagg0_222=» inet 31.13.177.77 netmask 255.255.255.252″
defaultrouter=»31.13.177.78″
Как это ни странно, но с таким конфигом агрегированный канал поднялся в режиме failover вместо lacp, при этом сеть не работала. Выяснилось, что на интерфейс lagg обязательно надо вешать IP-адрес. Поскольку я запретил нетэгированные пакеты на агрегированном линке со стороны коммутатора — можно удовлетворить причуду lagg-драйвера FreeBSD и повесить любой IP-адрес:
ifconfig_lagg0=»laggproto lacp laggport igb0 laggport igb1 192.168.0.88 netmask 255.255.255.0″
С обновленным конфигом поднялся LACP и заработала сеть. Но мне захотелось большего. А именно MTU 9000. Если уж сетевая карта и коммутатор поддерживают Jumbo Frames — грех этим не воспользоваться. Казалось бы, что нет ничего проще. Добавляем в конфиг правильный MTU:
ifconfig_igb0=»up mtu 9000″
ifconfig_igb1=»up mtu 9000″
cloned_interfaces=»lagg0 lagg0.222″
ifconfig_lagg0=»laggproto lacp laggport igb0 laggport igb1 192.168.0.88 netmask 255.255.255.0″
ifconfig_lagg0_222=» inet 31.13.177.77 netmask 255.255.255.252″
defaultrouter=»31.13.177.78″
И видим развалившийся lagg0 :). На консоли я заметил странные сообщения:
igb1: Could not setup receive structures
Выяснилось, что это махровая проблема, известная еще со времен чипсетов Intel 825xx. Для лечения нужно уменьшить размер очереди igb и увеличить максимальное количество mbuf-кластеров.
/boot/loader.conf:
hw.igb.num_queues=3
/etc/sysctl.conf:
kern.ipc.nmbclusters=262144
kern.ipc.nmbjumbop=262144
После перезагрузки системы с указанными выше параметрами агрегированный линк заработал в полную силу.
Pingback: 10 гигабит по витой паре (часть 1, теория) | Inadequate Perception
Pingback: 10 гигабит по витой паре (часть 1, теория) | Inadequate Perception