Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Мелочи —> LACP и VLAN

Настройка LACP и VLAN во FreeBSD 7.0

Автор: s@sh@.


   Как всегда, в жизни людям чего-то не хватает.В основном это денег и счастья, и я этому не исключение :). Но иногда приходят моменты, когда еще не хватает хорошего настроения от качественно, или хотя бы красиво проделанной работы. Возникла на днях задачка - организовать файл-сервер для бекапов на фряхе, да еще и прикрутить к нему сторедж на 10 терабайт.Все, как бы, не совсем страшно, если бы не одно но... Сторедж при правильной настройке может давать до 200 Мбайт\с на чтение или запись(Fiber Channel это хорошо). Так или иначе нужно эту возможность использовать по максимуму. Но даже при гигабитном соединении такой нагрузки не получишь. Зато по двум гигабитным карточкам можно такое устроить. Почему нужна такая нагрузка? По тому что бекапы будут литься отовсюду в сети приблизительно в один момент времени, а это, мягко говоря, много! Какое можно найти решение? Когда-то помню приходилось строить link aggregation на двух HP свичах, там протоколов было много для этих целей, но мне почему-то понравился такой себе LACP (Link aggregation control protocol). Ну на теперешней работе таких свичиков больше нету(или вообще нету), зато есть другие  - cisco catalyst 6509. Попарсив google на тему присутствия организации такой штуки на FreeBSD и Сisco, напоролся на статейку HandBook/NetworkAggregation. Если вкратце, в статье  описывается процес добавления пары-тройки команд  на циске и во фряхе, в результате чего сервер с двумя интерфейсами балансирует нагрузку одновременно по обеим интерфейсам и на прием, и на передачу трафика, да еще и обеспечивает Fault tolerance. Ну с циской как-бы все  понятно, а вот с фряхой понятно быть перестало сразу. Ввод
команды
netflow1# ifconfig lagg0 create

позитивного результата не дал, как и
netflow1# man lagg
No manual entry for lagg

  Недолго покопавшись в инете, выяснилось, что данная функция будет поддерживаться в 7-й версии FreeBSD. Дело было вечером, делать было нечего... Функцию опробовать надо, заодно и на CURRENT версию посмотреть можно. Обновляем сорцы до CURRENT-а, компилим и ставим мир и ядро. Выполнение этой процедуры очень хорошо описано в http://www.lissyara.su/?id=1072, http://www.lissyara.su/?id=1161,
http://www.lissyara.su/?id=1270.
От себя добавлю некоторую инфу:
 # это файлик /usr/local/etc/supfile
*default host=cvsup3.ua.FreeBSD.org #мне от сюда легче тянуть исходники
*default base=/var/db
*default prefix=/usr
*default release=cvs
#*default tag=.                      # а это чтоб CURRENT стянуть ()
#по прозьбе трудящих закоментил предыдущую строку
#т.к. сейчас такой тег более актуален.
*default tag=RELENG_7                
*default delete use-rel-suffix
*default compress
## Main Source Tree.
src-all                             # тянем только исходники

                                 
Далее просто:
netflow1# cvsup -g -L 2 /usr/local/etc/supfile

После недолгих бульканий cvsup'а были скачаны исходники. По статейке билдим мир и ядришко. Здесь у меня возникли проблемы. Я со старта покаментил все ненужные мне опции в конфигфайле ядра, и оно компилиться  не захотело, хотя мир скомпилился с первого раза. Проблемка была в коментированнии неких  неприветных строчек

cpu             I486_CPU
cpu             I586_CPU
options         INET6                   # IPv6 communications protocols

Хотя способ решения был другим, я сначала скомпилил и проставил мир и ядро GENERIC, а опосля уже на новой Фряхе забубенил свое ядро /usr/src/sys/i386/conf/MK .
cpu             I486_CPU
cpu             I586_CPU
cpu             I686_CPU
ident           MK

makeoptions     DEBUG=-g                # Build kernel with gdb(1) debug symbols

options         SCHED_4BSD              # 4BSD scheduler
options         PREEMPTION              # Enable kernel thread preemption
options         INET                    # InterNETworking
options         INET6                   # IPv6 communications protocols
options         SCTP                    # Stream Control Transmission Protocol
options         FFS                     # Berkeley Fast Filesystem
options         SOFTUPDATES             # Enable FFS soft updates support
options         UFS_ACL                 # Support for access control lists
options         UFS_DIRHASH             # Improve performance on big directories
options         UFS_GJOURNAL            # Enable gjournal-based UFS journaling
options         MD_ROOT                 # MD is a potential root device
options         NFSCLIENT               # Network Filesystem Client
options         NFSSERVER               # Network Filesystem Server
options         NFS_ROOT                # NFS usable as /, requires NFSCLIENT
options         MSDOSFS                 # MSDOS Filesystem
options         CD9660                  # ISO 9660 Filesystem
options         PROCFS                  # Process filesystem (requires PSEUDOFS)
options         PSEUDOFS                # Pseudo-filesystem framework
options         GEOM_PART_GPT           # GUID Partition Tables.
options         GEOM_LABEL              # Provides labelization
options         COMPAT_43TTY            # BSD 4.3 TTY compat [KEEP THIS!]
options         COMPAT_FREEBSD4         # Compatible with FreeBSD4
options         COMPAT_FREEBSD5         # Compatible with FreeBSD5
options         COMPAT_FREEBSD6         # Compatible with FreeBSD6
options         SCSI_DELAY=5000         # Delay (in ms) before probing SCSI
options         KTRACE                  # ktrace(1) support
options         SYSVSHM                 # SYSV-style shared memory
options         SYSVMSG                 # SYSV-style message queues
options         SYSVSEM                 # SYSV-style semaphores
options         _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options         KBD_INSTALL_CDEV        # install a CDEV entry in /dev
options         ADAPTIVE_GIANT          # Giant mutex is adaptive.
options         STOP_NMI                # Stop CPUS using NMI instead of IPI
options         AUDIT                   # Security event auditing

# To make an SMP kernel, the next two lines are needed
options         SMP                     # Symmetric MultiProcessor Kernel -
                                        #  вот это уже 
                                        # по дефолту ставят в ядро
device          apic                    # I/O APIC

device          lagg       #вот это та самая строка, с помощью 
                           #которой и должен заработать LACP

# CPU frequency control
device          cpufreq
# Bus support.
device          pci
# Floppy drives
device          fdc
# ATA and ATAPI devices
device          ata
device          atadisk         # ATA disk drives
device          ataraid         # ATA RAID drives
device          atapicd         # ATAPI CDROM drives
device          atapifd         # ATAPI floppy drives
device          atapist         # ATAPI tape drives
options         ATA_STATIC_ID   # Static device numbering
# SCSI Controllers
device          ahb             # EISA AHA1742 family
device          ahc             # AHA2940 and onboard AIC7xxx devices
options         AHC_REG_PRETTY_PRINT    # Print register bitfields in debug
                                        # output.  Adds ~128k to driver.
device          ahd             # AHA39320/29320 and onboard AIC79xx devices
options         AHD_REG_PRETTY_PRINT    # Print register bitfields in debug
                                        # output.  Adds ~215k to driver.
device          isp             # Qlogic family - а по этим девайсом подключем массив
device          ispfw           # Firmware for QLogic HBAs- normally a module 
device          mpt             # LSI-Logic MPT-Fusion
device          aha             # Adaptec 154x SCSI adapters
device          aic             # Adaptec 15[012]x SCSI adapters, AIC-6[23]60.
# SCSI peripherals
device          scbus           # SCSI bus (required for SCSI)
device          ch              # SCSI media changers
device          da              # Direct Access (disks)
device          sa              # Sequential Access (tape etc)
device          cd              # CD
device          pass            # Passthrough device (direct SCSI access)
device          ses             # SCSI Environmental Services (and SAF-TE)

device          iir             # Intel Integrated RAID

# RAID controllers
device          aac             # Adaptec FSA RAID
device          mfi             # LSI MegaRAID SAS

# atkbdc0 controls both the keyboard and the PS/2 mouse
device          atkbdc          # AT keyboard controller
device          atkbd           # AT keyboard
device          psm             # PS/2 mouse

device          kbdmux          # keyboard multiplexer
device          vga             # VGA video card driver
device          splash          # Splash screen and screen saver support

# syscons is the default console driver, resembling an SCO console
device          sc
device          agp             # support several AGP chipsets

# Power management support (see NOTES for more options)
# Add suspend/resume support for the i8254.
device          pmtimer
# Serial (COM) ports
device          sio             # 8250, 16[45]50 based serial ports
device          uart            # Generic UART driver
# Parallel port
device          ppc
device          ppbus           # Parallel port bus (required)
device          lpt             # Printer
device          plip            # TCP/IP over parallel
device          ppi             # Parallel port interface device

# PCI Ethernet NICs.
device          em              # Intel PRO/1000 adapter Gigabit Ethernet Card
device          ixgb            # Intel PRO/10GbE Ethernet Card

# Pseudo devices.
device          loop            # Network loopback
device          random          # Entropy device
device          ether           # Ethernet support
device          sl              # Kernel SLIP
device          ppp             # Kernel PPP
device          tun             # Packet tunnel.
device          pty             # Pseudo-ttys (telnet etc)
device          md              # Memory "disks"
device          gif             # IPv6 and IPv4 tunneling
device          faith           # IPv6-to-IPv4 relaying (translation)
device          firmware        # firmware assist module

# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device          bpf             # Berkeley packet filter

# USB support
device          uhci            # UHCI PCI->USB interface
device          ohci            # OHCI PCI->USB interface
device          ehci            # EHCI PCI->USB interface (USB 2.0)
device          usb             # USB Bus (required)
device          ugen            # Generic
device          uhid            # "Human Interface Devices"
device          ukbd            # Keyboard
device          ulpt            # Printer
device          umass           # Disks/Mass storage - Requires scbus and da
device          ums             # Mouse

Сильно не бейте за весь файлик конфигурации ядра, этот файлик у меня точно скомпилился под CURRENT-ом, вот я его и решил выложить для примера.
Из него повыбрасывал всякие дебаги, так как оно мне ничего не раскажет интересного, но на продуктивность системы может нехило повлиять.Ну и повыбрасывал  поддержку девайсов, которы у меня нет и быть не может(сервак то блейдовый). Ну и типа для компиля заюзал опцию -j8.
netflow1# make -j8 buildworld && make -j8 buildkernel KERNCONF=MK

На двух ксеонах все скомпилилось достаточно быстро. При инсталляции мира и ядра особых проблем не возникло, так как система, которую апдейтил, была почти без софта. Поэтому анализ вывода mergemaster особо не проводился и на все вопросы автоматом жал "i".
По завершению сего процесса получаем
netflow1# uname -v
FreeBSD 7.0-CURRENT #8: Mon Oct  1 11:43:02 EEST 2007
root@netflow1.intellecom.ua:/usr/obj/usr/src/sys/MK
netflow1#

Ну а теперь поработаем клавиатурой
netflow1# ifconfig em0 up
netflow1# ifconfig em1 up
netflow1# ifconfig lagg0 create
netflow1# ifconfig lagg0 up laggproto lacp laggport em0 laggport em1
netflow1# ifconfig lagg0 10.10.10.18 netmask 255.255.255.0
netflow1# route add -net 0.0.0.0 10.10.10.1 0.0.0.0

Выглядит не совсем красиво, но причесывать будем позже.
Идем на циску и к каждому нужному интерфейсу прописываем:
urk-5(config)#interface GigabitEthernet2/2
urk-5(config-if)#description krv/dev-3
urk-5(config-if)#switchport
urk-5(config-if)#switchport access vlan 10 
urk-5(config-if)#channel-protocol lacp
urk-5(config-if)#channel-group 23 mode active
urk-5(config-if)#interface GigabitEthernet2/16
urk-5(config-if)#description krv:/dev-3
urk-5(config-if)#switchpot
urk-5(config-if)#switchport access vlan 10 
urk-5(config-if)#channel-protocol lacp
urk-5(config-if)#channel-group 23 mode active
ukr-5(config-if)#int po23
ukr-5(config-if)#no shutdown
ukr-5(config-if)#end 

Значит пояснения: Наш сервак включен в свич двумя сетевыми карточками, одна в порт GigabiEthernet2/2, другая в GigabiEthernet2/16. Соответственно на циске их и конфигурим. switchport access vlan 10 "добавляет"  порт в 10 влан в access режиме. Далее добавляем оба порта в channel-group 23, устанавливаем активный режим и протокол агрегации портов. При этих дествиях создается интерфейс с полныйм названием Port-channel 23.Все параметры, которые будут изменены относительно него автоматически применяются ко всем портам из группы. По умолчанию, при создании, данный интерфес пребывает в состоянии shutdown, т.е. отключен,поэтому и нужна предпоследняя команда.Далее ждём пару мин и посмотри че получилось
ukr-5#sh int po23
Port-channel23 is up, line protocol is up (connected)
  Hardware is EtherChannel, address is 000d.ed4e.6fbb (bia 000d.ed4e.6fbb)
  MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec,
     reliability 255/255, txload 1/255, rxload 1/255
  Encapsulation ARPA, loopback not set
  Keepalive set (10 sec)
  Full-duplex, 1000Mb/s
  input flow-control is off, output flow-control is on
  Members in this channel: Gi2/2
  ARP type: ARPA, ARP Timeout 04:00:00
  Last input never, output never, output hang never
  Last clearing of "show interface" counters never
  Input queue: 0/2000/0/0 (size/max/drops/flushes); Total output drops: 0
  Queueing strategy: fifo
  Output queue: 0/40 (size/max)
  5 minute input rate 0 bits/sec, 0 packets/sec
  5 minute output rate 0 bits/sec, 0 packets/sec
     7158113 packets input, 6796184799 bytes, 0 no buffer
     Received 2003 broadcasts (1430 multicasts)
     0 runts, 0 giants, 0 throttles
     0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
     0 watchdog, 0 multicast, 0 pause input
     0 input packets with dribble condition detected
     16746229 packets output, 22947297446 bytes, 0 underruns
     0 output errors, 0 collisions, 9 interface resets
     0 babbles, 0 late collision, 0 deferred
     0 lost carrier, 0 no carrier, 0 PAUSE output
     0 output buffer failures, 0 output buffers swapped out

Ну а во FreeBSD получаем что-то такое:
netflow1# ifconfig -a
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWCSUM>
        ether 00:14:22:b1:e3:06
        media: Ethernet autoselect (1000baseSX <full-duplex>)
        status: active
        lagg: laggdev lagg0
em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWCSUM>
        ether 00:14:22:b1:e3:06
        media: Ethernet autoselect (1000baseSX <full-duplex>)
        status: active
        lagg: laggdev lagg0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWCSUM>
        ether 00:14:22:b1:e3:06
        inet 10.10.10.18 netmask 0xffffff00 broadcast 10.10.10.255
        media: Ethernet autoselect
        status: active
        laggproto lacp
        laggport: em1 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>
        laggport: em0 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>
netflow1#

Проведем некоторое тестирование. Я на двух консолях выполнил такой себе пинг:
netflow1# ping -i 0.2 -s 10000 10.10.10.1

А что из этого получилось смотрел systat'ом
               /0   /1   /2   /3   /4   /5   /6   /7   /8   /9   /10
     Load Average

      Interface           Traffic               Peak                Total
          lagg0  in    150.083 KB/s        225.318 KB/s           30.898 MB
                 out   150.146 KB/s        225.372 KB/s           34.340 MB

            lo0  in      0.000 KB/s          0.000 KB/s            4.604 KB
                 out     0.000 KB/s          0.000 KB/s            4.604 KB

            em1  in    150.083 KB/s        225.343 KB/s           30.908 MB
                 out     0.000 KB/s          0.023 KB/s           15.137 KB

            em0  in      0.000 KB/s          0.066 KB/s           22.844 KB
                 out   150.171 KB/s        225.396 KB/s           34.355 MB


Как видим, пинг отсылается по одному физическому интерфейсу, а reply приходит на другой.
Но задача в практической постановке не совсем полная. Реально вся сетка разграничена кучей VLAN'ов и в каждом из них есть сервера и важные хосты, которые нужно бекапить. Так сложилось в жизни, что свитчинг работает быстрее роутинга, особенно если маршруты к соседнему порту в другом VLAN'е лежат через десяток маршрутизаторов в пяти офисах :)). Как одно из решений, нужные интерфейсы на свиче можно перевести в транковый режим и "прокинуть" туда все необходимые VLAN'ы. Как тогда быть с системой под FreeBSD, ведь ей нужно видеть все виланы? Решение простое, нужно создать виртуальные интерфейсы для каждого VLAN'а, и назначить каждому из них адрес и маршрут из соотведствующей подсети. Для примера, нам нужно из системы видеть 10 и 17 VLAN'ы. Соответственно конфигурим свитч:
urk-5(config)#int po23
urk-5(config-if)# no switchport access vlan 10
urk-5(config-if)# switchport mode trunk
urk-5(config-if)# switchport trunk encapsulation dot1q
urk-5(config-if)# switchport trunk allowed vlan 10,17
urk-5(config-if)#end 

Здесь мы удалили Port-Channel23 из 10-го VLAN'а, и перевели его в транковый режим, позволив "пробрасывать" 10 и 17 виланы. Полная конфига на свиче выглядит так:
urk-5# sh run int po23
!
interface Port-channel23
 switchport
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 10,17
 switchport mode trunk
 no ip address
end
urk-5#sh run int g2/2
Building configuration...

Current configuration : 238 bytes
!
interface GigabitEthernet2/2
 description krv:dev-3
 switchport
 switchport trunk allowed vlan 10,17
 switchport mode trunk
 no ip address
 channel-protocol lacp
 channel-group 23 mode active
end

urk-5#sh run int g2/16
Building configuration...

Current configuration : 239 bytes
!
interface GigabitEthernet2/16
 description krv:dev-3
 switchport
 switchport trunk allowed vlan 10,17
 switchport mode trunk
 no ip address
 channel-protocol lacp
 channel-group 23 mode active
end

ukr-a05#

Ну а теперь возьмемся за нашу FreeBSD.
Чтоб не мучатся каждый раз с созданием lagg-интерфейса, причешем всю эту кашку в
/etc/rc.conf, но для этого нам еще нужны два скрипта: /etc/rc.d/mklagg:
#!/bin/sh
#
# PROVIDE: mkvlan
# BEFORE: netif
# KEYWORD: nojail

. /etc/rc.subr
. /etc/network.subr

name="mklagg"
rcvar=`set_rcvar`
start_cmd="mklagg_start"
stop_cmd="mklagg_stop"

mklagg_start()
{
        ifconfig em0 up
        ifconfig em1 up
        echo -n "creating link aggregated  interfaces... "
        set | grep "ifconfig_lagg[0-9]*=" | while read ln ; do
                ifn=`expr "${ln}" : "ifconfig_\(lagg[0-9]*\)=.*"`
                echo -n "${ifn} "
                ifconfig $ifn create

        done
        echo
}

mklagg_stop()
{
}

load_rc_config $name
run_rc_command "$1"

и /etc/rc.d/mkvlan:
#!/bin/sh
#
# PROVIDE: mkvlan
# BEFORE: netif
# KEYWORD: nojail

. /etc/rc.subr
. /etc/network.subr

name="mkvlan"
rcvar=`set_rcvar`
start_cmd="mkvlan_start"
stop_cmd="mkvlan_stop"

mkvlan_start()
{
        echo -n "creating vlan interfaces... "
        set | grep "ifconfig_vlan[0-9]*=" | while read ln ; do
                ifn=`expr "${ln}" : "ifconfig_\(vlan[0-9]*\)=.*"`
                echo -n "${ifn} "
                ifconfig $ifn create
        done
        echo
}

mkvlan_stop()
{
}

load_rc_config $name
run_rc_command "$1"

Файлы практически идентичны, и можно было бы их обьединить, но лучше пусть живут отдельно.
Эти скрипты используются в /etc/rc.conf при старте системы для создания lagg- и vlan-интерфейсов. Далее все просто:
mklagg_enable="YES"       #это наш скрипт для создания lagg-интерфейсов 
mkvlan_enable="YES"             #а это vlan
hostname="netflow1.intellecom.ua"
cloned_interface="lagg0"        # создаем lagg0
ifconfig_lagg0="laggproto lacp laggport em0 laggport em1 " # и определяем для него
                                # физицеские интерфейсы em0 и em1
cloned_interface="vlan17"       # создаем два vlan-интерфейса
cloned_interface="vlan10"       # для 10 и 17 
ifconfig_vlan10="inet 10.10.10.18 netmask 255.255.255.0 vlan 10 vlandev lagg0" 
                                # назначаем адреса, маски VLAN'ы и интерфейс, через
                                # который будут работать вланы
ifconfig_vlan17="inet 10.10.17.18 netmask 255.255.255.0 vlan 17 vlandev lagg0"
                                # вместо lagg0 мог бы быть em0 или em1
static_routes="static1 static2"
route_static1="-net 10.10.17.0 -netmask 255.255.255.0 -gateway 10.10.17.1"
route_static2="-net 10.10.10.0 -netmask 255.255.255.0 -gateway 10.10.10.1"
                                # устанавливаем маршруты в каждую из подсетей
defaultrouter="10.10.10.1"      # и по ходу шлюз по умолчанию
linux_enable="YES"
sshd_enable="YES"

После, для гарантии, перезагружаемся. Далее посмотрим, что у нас получилось.
Для наглядного тестированния, нужно нагрузить интерфесый из каждого VLAN'а. Я сделал следующим образом, установил nfs-сервер и подмонтировал по сети с устройств из соотведстующих VLAN'ов зашаренную папку. Потом просто копируя файлы, наблюдал systat'ом статитику на интерфейсах.
netflow1# ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWCSUM>
        ether 00:14:22:b1:e3:06
        inet6 fe80::214:22ff:feb1:e306%em0 prefixlen 64 scopeid 0x1
        media: Ethernet autoselect (1000baseSX <full-duplex>)
        status: active
        lagg: laggdev lagg0
em1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWCSUM>
        ether 00:14:22:b1:e3:06
        inet6 fe80::214:22ff:feb1:e307%em1 prefixlen 64 scopeid 0x2
        media: Ethernet autoselect (1000baseSX <full-duplex>)
        status: active
        lagg: laggdev lagg0
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWCSUM>
        ether 00:14:22:b1:e3:06
        media: Ethernet autoselect
        status: active
        laggproto lacp
        laggport: em1 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>
        laggport: em0 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>
vlan10: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 00:14:22:b1:e3:06
        inet 10.10.10.18 netmask 0xffffff00 broadcast 10.10.10.255
        media: Ethernet autoselect
        status: active
        vlan: 10 parent interface: lagg0
vlan17: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 00:14:22:b1:e3:06
        inet 10.10.17.18 netmask 0xffffff00 broadcast 10.10.17.255
        media: Ethernet autoselect
        status: active
        vlan: 17 parent interface: lagg0
netflow1# 

У нас получилось два виртуальных интрефейса для VLAN'ов 10 і 17, и один виртуальный интерфейс, выполняющий агрегацию.  Ниже приведена статистика нагрузки при одновременном копировании с двух хостов, примонтированных по nfs.
             
  /0   /1   /2   /3   /4   /5   /6   /7   /8   /9   /10
     Load Average   ||

      Interface           Traffic               Peak                Total
         vlan17  in     16.040 MB/s         27.128 MB/s            3.475 GB
                 out   296.854 KB/s        503.104 KB/s            1.849 GB

         vlan10  in     15.150 MB/s         17.765 MB/s            1.751 GB
                 out   280.022 KB/s        328.352 KB/s            2.191 GB

          lagg0  in     31.279 MB/s         33.397 MB/s            1.280 GB
                 out   591.862 KB/s        631.911 KB/s           62.236 MB

            lo0  in      0.000 KB/s          0.000 KB/s          103.969 KB
                 out     0.000 KB/s          0.000 KB/s          103.969 KB

            em1  in     31.279 MB/s         33.397 MB/s            1.255 GB
                 out   295.836 KB/s        318.546 KB/s            2.035 GB

            em0  in      0.023 KB/s          0.234 KB/s           35.756 MB
                 out   296.025 KB/s        315.969 KB/s            2.035 GB

Это производилось копирование с устройств на наш тестируемый хост. Как видим, ситуация не совсем понятная,
все работает, но балансировка трафика на вход не проводиться. Попробуем скопировать с нашего устройства на удаленные.
                /0   /1   /2   /3   /4   /5   /6   /7   /8   /9   /10
     Load Average   |

      Interface           Traffic               Peak                Total
         vlan17  in    198.756 KB/s         27.128 MB/s          351.315 MB
                 out     8.186 MB/s          8.908 MB/s            2.366 GB

         vlan10  in    147.494 KB/s         18.929 MB/s          806.246 MB
                 out     6.075 MB/s         10.464 MB/s            2.695 GB

          lagg0  in    353.114 KB/s         36.143 MB/s            1.251 GB
                 out    14.301 MB/s         16.422 MB/s            1.095 GB

            lo0  in      0.000 KB/s          0.000 KB/s          103.969 KB
                 out     0.000 KB/s          0.000 KB/s          103.969 KB

            em1  in    353.154 KB/s         36.143 MB/s            1.226 GB
                 out     7.153 MB/s          8.211 MB/s            2.552 GB

            em0  in      0.000 KB/s          0.982 KB/s           35.781 MB
                 out     7.147 MB/s          8.210 MB/s            2.552 GB

Воот оно!! Получается свитч не производит балансировку нагрузки на вход агрегированный портов, но производит балансировку при выходном трафике. О причинах такой деятельности мне, пока что, приходиться догадываться и нужно будет провести еще ряд тестов. Но о сути настройки системы для такого типа задач я попытался здесь рассказать.
P.S. Остались нераскрытыми для меня два вопроса, первый - как такое сделать под 6.2; как заставить свич балансировать нагрузку на вход?
Пока что все!




размещено: 2007-10-29,
последнее обновление: 2007-10-29,
автор: s@sh@


terminus, 2007-10-29 в 11:18:22

LACP не балансирует входящий трафик. Вот, например, выдержка из мануала к HP свитчам серий 6400 5300 4200 3400 :
=================================
The two trunk group options (LACP and Trunk) use source-destination
address pairs (SA/DA) for distributing outbound traffic over trunked links.
SA/DA (source address/destination address) causes the switch to distribute
outbound traffic to the links within the trunk group on the basis of source/
destination address pairs. That is, the switch sends traffic from the same
source address to the same destination address through the same trunked link,
and sends traffic from the same source address to a different destination
address through a different link, depending on the rotation of path assignments
among the links in the trunk. Likewise, the switch distributes traffic for
the same destination address but from different source addresses through
different links. Because the amount of traffic coming from or going to various
nodes in a network can vary widely, it is possible for one link in a trunk group
to be fully utilized while others in the same trunk have unused bandwidth
capacity even though the address assignments are evenly distributed across
the links in a trunk. In actual networking environments, this is rarely a
problem.
=================================

Abigor, 2007-10-29 в 11:42:11

*default tag=.
правьте, он вытянет уже 8 версию, так что ставьте вот такое:
[abigor@chieftec ~]$ cat /usr/local/etc/csup.conf
*default host=cvsup.isea.ru
*default prefix=/usr
*default base=/var/db
*default release=cvs delete use-rel-suffix compress

src-all         tag=RELENG_7
[abigor@chieftec ~]$

s@sh@, 2007-10-29 в 11:47:04

TO abigor.
Кстати пробовал tag=RELENG_7, но у меня он потянул почему-то все сорци со всякими diff к разным версиям. мож руки кривые? :)

atckoe, 2007-10-29 в 14:28:35

Рано значит пробовали, видимо тогда еще такого реленга не было     :)

Abigor, 2007-10-29 в 15:06:06

to s@sh@
не наю, у меня нормально утянулось, и собралось
---------------
интересно, а без циски такое можно сделать?

terminus, 2007-10-29 в 15:20:19

>интересно, а без циски такое можно сделать?

В чем проблема? Любой нормальный HP/3com/etc где есть LACP, VLANS и прочие фички...

s@sh@, 2007-10-29 в 15:21:30

Можно на HP-свичах, я такое когда-то делал на HP ProCurve 3400, и на 2848

alb, 2007-10-29 в 19:31:31

1  В RELENG_6 есть lagg, должен быть и в 6.3
2  хз  Интересно было бы в качестве эксперемента связать две Фряхи без свитча.

shutdown now, 2007-10-29 в 21:21:42

на циске есть удобные команды для одновременной настройки нескольких интерфейсов:
# conf t
(config)# int range gi0/1 - 3

и есть глобальная команда
(config)#port-channel load-balance src-dst-ip

ru_pchel, 2007-11-01 в 8:45:42

Вот эту команду и стоит посмотреть на cisco
(config)#port-channel load-balance xxxxxx

mitiok, 2007-11-05 в 14:38:48

а jumbo frames включить?

sunTechnic, 2007-11-05 в 23:28:39

Имхо, ложить свои скрипты в системный /etc/rc.d/ — раскладывать грабли. Лучше всё-таки их положить в /usr/local/etc/rc.d/

s@sh@, 2007-11-06 в 10:19:38

Имхо, мы не запускаем сервисы типа апача или почтовика, а создаем виртуальныйе интерфейсы, по этому для меня более разумным есть размещение таких скриптов подальше от /usr/local/etc/rc.d. Но каждый волен делать так как ему удобно!

-=Alex=-, 2007-11-07 в 16:52:48

> cloned_interface="vlan17"       # создаем два vlan-интерфейса
> cloned_interface="vlan10"       # для 10 и 17

так не будет виден vlan17

IMHO, должно быть
cloned_interface="vlan10 vlan17"

eGuru, 2007-11-13 в 13:25:20

> Получается свитч не производит балансировку нагрузки на вход агрегированный портов...

Свич не должен и физически не может балансировать нагрузку на вход, так как пакеты между интерфейсами уже распределены драйвером lagg во FreeBSD, а свич принимает что дают. Распределением должен заниматься драйвер lagg во FreeBSD. Тут и надо копать.

eGuru, 2007-11-13 в 13:45:51

Еще о балансировке нагрузки.

Прочел man lagg(4). Судя по описанию опции lacp, балансировка делается путем распределения активных соединений между интерфейсами. То есть, весь исходящий трафик от одного соединения будет пущен через один интерфейс в группе, от другого соединения - через другой, и т.д.
В man еще описана опция roundrobin. Это дает псевдослучайное распределение пакетов по интерфейсам. Возможно это поможет распределить нагрузку более подходящим образом. Сам проверить не могу, нет оборудования, но тема интересная.  s@sh@, ответь, что думаешь.

s@sh@, 2007-11-13 в 14:06:05

to eGuru
Фряха то расскидывает при выходном(с себя) трафике поровну по физическим интерфейсам, не балансируется то что приходит из вне на фряху, т.е., действительно, получается свич с тем, что приходит к нему и должно быть передано в Port-Channet интерфейс не знает что делать(или не хочет). Я думаю, в этом случае фряха не "виновата", как она может сказать свичу "дай мне следующий пакет на другой физический интерфейс, причем балансируя раздачу поровну".Но насчет второй тестовой машинки и разбора параметров,думаю, займусь этим на днях.

eGuru, 2007-11-16 в 23:49:47

Да. Недоглядел на замеры скорости.

О балансировке нагрузки свичами Cisco сказано немного в этом документе

Пишут, что когда для балансировки используются MAC адреса, в случае, если трафик идет только на один MAC (описанный случай) свитч всегда будет выбирать только один канал. Для лучшего результата рекомендуют использовать режим балансировки по IP.

Режим задается командой:

port-channel load-balance

s@sh@, напиши, как идут дела с настройкой.

Максим, 2007-12-16 в 0:16:46

Проблема в том, что LACP не работает на транковом порту :(

0ther, 2008-03-12 в 11:57:28

А можно и без скриптов, ибо и так работает

cloned_interface="lagg0 vlan10 vlan17"
ifconfig_em0="up"
ifconfig_em1="up"
ifconfig_lagg0="laggproto lacp laggport em0 laggport em1"
ifconfig_vlan10="inet 10.10.10.18 netmask 255.255.255.0 vlan 10 vlandev lagg0"
ifconfig_vlan17="inet 10.10.17.18 netmask 255.255.255.0 vlan 17 vlandev lagg0"

gmn, 2008-04-07 в 20:15:58

А о какой стойке идет речь?
(Сторедж при правильной настройке может давать до 200 Мбайт\с на чтение или запись(Fiber Channel это хорошо).)

arf, 2008-04-22 в 15:54:24

стоит добавить в статью еще немножко инфы по lacp. И пояснить настройки на коммутаторе: На cat2960 chanel-group может быть только до шести.

arf, 2008-04-22 в 17:04:16

eсли не нужны vlan можно добавить:
ifconfig_lagg0_alias0="inet 192.168.0.1  netmask 255.255.255.0"
иначе(без alias) нифига не пашет.

skeletor, 2008-09-19 в 16:19:55

2arf нифига не работает (это я про lagg0).
Я сделал так. Добавил в /etc/rc.local такую строчку
(ifconfig lagg0 create && ifconfig lagg0 up laggproto lacp laggport em0 \
laggport em1 10.10.10.10 netmask 255.255.255.0 && route add default 10.10.10.1) || \
(ifconfig em0 up 10.10.10.10 netmask 255.255.255.0)

на тот случай, если вдруг lagg0 не подымется.

Kolesya, 2008-12-05 в 19:34:29

root@TA3IK# kldload /boot/kernel/if_lagg.ko

root@TA3IK# kldstat | grep lagg
Id Refs Address    Size     Name
6    1 0xc9e4b000 7000     if_lagg.ko

root@TA3IK# uname -r
6.2-STABLE
root@TA3IK# dmesg
...
em0: <Intel(R) PRO/1000 Network Connection Version - 6.2.9>
em1: <Intel(R) PRO/1000 Network Connection Version - 6.2.9>
...

На 6.2 все нормально работает, проверял с телесаном (AT-GS950/16)

Shurik.at.host, 2008-12-19 в 19:44:17

Спасибо lissyara !!!
Спасибо Автору статьи
спасибо arf - именно ifconfig_lagg0_alias0 помогло.
плюс туда же
ifconfig_em0="up polling -tso"

Глеб, 2009-07-17 в 4:48:20

У кого не работает через rc.conf,
cloned_interface судя по всему где-то между 7.0 и 7.2 поменялось на
cloned_interfaces

Alexx, 2010-01-15 в 17:02:09

Без vlan-ов все превосходно работает (Catalyst 3560G и Freebsd 8.0). При переводе port-channel в режим транка пропадает связь.

fec, 2011-01-20 в 16:41:15

Максим, 2007-12-16 в 0:16:46
Проблема в том, что LACP не работает на транковом порту :(

Тогда вкл. FEC
interface FastEthernet0/2
switchport trunk native vlan 10
switchport trunk allowed vlan 20,100
switchport mode trunk
channel-group 1 mode on
!
interface FastEthernet0/3
switchport trunk native vlan 10
switchport trunk allowed vlan 20,100
switchport mode trunk
channel-group 1 mode on

port-channel load-balance dst-mac

На FreeBSD:
ifconfig lagg0 up laggproto fec laggport em0 laggport em1

Евгений, 2013-01-19 в 9:15:51

Привет из 2013 года :)

Есть у меня серверок с "интересным" софтом под управлением 6.4, обновить ооочень проблемно. Дак вот, сервер - роутер, PF NAT, ipfw, em, dummy, на 500 мегабитах карта со стандартными дровами начала давать ошибки, решил прикрутить lagg, проблема с распределением по картам наблюдалась аналогичная - на одной карте весь трафик, на другой почти ноль, собственно загуглив пришел сюда и коментарий о:

Режим задается командой:

port-channel load-balance

s@sh@, напиши, как идут дела с настройкой.


привел меня к мысле перекрутить на свиче параметр балансинга, у меня экстрим.

команда: config sharing address-based ip-source-dest

нагрузила обе карты задействованные в лаге.
Надеюсь данная инфа будет полезна тем кто наступил на подобные грабли.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0818 секунд
Из них PHP: 66%; SQL: 34%; Число SQL-запросов: 77 шт.
Исходный размер: 104712; Сжатая: 21229