Author: 891rpm

  • Сетевой адаптер Intel ServerAdapter 1000 ET Quad Port PCIe в CentOS 5

    Купили такую железку Intel ServerAdapter 1000 ET Quad Port PCIe .

    \"\"

    Смонтировали в сервер. Задача заставить данный адаптер работать в CentOS 5, и распределить сетевую нагрузку по нескольким очередям.

    Загружаемся:

    Информация в dmesg


    Intel(R) Gigabit Ethernet Network Driver - version 1.3.16-k2
    Copyright (c) 2007-2009 Intel Corporation.
    ACPI: PCI Interrupt 0000:09:00.0[A] -> GSI 17 (level, low) -> IRQ 169
    PCI: Setting latency timer of device 0000:09:00.0 to 64
    EDAC MC0: Giving out device to i5000_edac.c I5000: DEV 0000:00:10.0
    intel_rng: FWH not detected
    ACPI: PCI Interrupt 0000:00:1f.3[B] -> GSI 20 (level, low) -> IRQ 162
    igb 0000:09:00.0: Intel(R) Gigabit Ethernet Network Connection
    igb 0000:09:00.0: eth2: (PCIe:2.5Gb/s:Width x4) 00:1b:21:3e:ae:28
    igb 0000:09:00.0: eth2: PBA No: e64750-002
    igb 0000:09:00.0: Using MSI-X interrupts. 4 rx queue(s), 1 tx queue(s)
    ACPI: PCI Interrupt 0000:09:00.1[B] -> GSI 18 (level, low) -> IRQ 106
    PCI: Setting latency timer of device 0000:09:00.1 to 64
    igb 0000:09:00.1: Intel(R) Gigabit Ethernet Network Connection
    igb 0000:09:00.1: eth2: (PCIe:2.5Gb/s:Width x4) 00:1b:21:3e:ae:29
    igb 0000:09:00.1: eth2: PBA No: e64750-002
    igb 0000:09:00.1: Using MSI-X interrupts. 4 rx queue(s), 1 tx queue(s)
    ACPI: PCI Interrupt 0000:0a:00.0[A] -> GSI 19 (level, low) -> IRQ 218
    PCI: Setting latency timer of device 0000:0a:00.0 to 64
    igb 0000:0a:00.0: Intel(R) Gigabit Ethernet Network Connection
    igb 0000:0a:00.0: eth3: (PCIe:2.5Gb/s:Width x4) 00:1b:21:3e:ae:2c
    igb 0000:0a:00.0: eth3: PBA No: e64750-002
    igb 0000:0a:00.0: Using MSI-X interrupts. 4 rx queue(s), 1 tx queue(s)
    ACPI: PCI Interrupt 0000:0a:00.1[B] -> GSI 16 (level, low) -> IRQ 177
    PCI: Setting latency timer of device 0000:0a:00.1 to 64
    igb 0000:0a:00.1: Intel(R) Gigabit Ethernet Network Connection
    igb 0000:0a:00.1: eth2: (PCIe:2.5Gb/s:Width x4) 00:1b:21:3e:ae:2d
    igb 0000:0a:00.1: eth2: PBA No: e64750-002
    igb 0000:0a:00.1: Using MSI-X interrupts. 4 rx queue(s), 1 tx queue(s)

    На первый взгляд все замечательно адаптер определился и работает, но смутили надписи 4 rx queue(s), 1 tx queue(s) на каждом из портов. Все дело в том, что у данного адаптера по 8 rx (прием) очередей на каждый порт.

    Проверим версию драйвера

    modinfo igb


    filename: /lib/modules/2.6.18-164.6.1.el5PAE/kernel/drivers/net/igb/igb.ko
    version: 1.3.16-k2
    license: GPL
    description: Intel(R) Gigabit Ethernet Network Driver
    author: Intel Corporation,
    srcversion: 78555F0A019E05BADBD95AA
    alias: pci:v00008086d000010D6sv*sd*bc*sc*i*
    alias: pci:v00008086d000010A9sv*sd*bc*sc*i*
    alias: pci:v00008086d000010A7sv*sd*bc*sc*i*
    alias: pci:v00008086d000010E8sv*sd*bc*sc*i*
    alias: pci:v00008086d000010E7sv*sd*bc*sc*i*
    alias: pci:v00008086d000010E6sv*sd*bc*sc*i*
    alias: pci:v00008086d0000150Asv*sd*bc*sc*i*
    alias: pci:v00008086d000010C9sv*sd*bc*sc*i*
    depends: 8021q
    vermagic: 2.6.18-164.6.1.1.el5PAE SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
    parm: max_vfs:Maximum number of virtual functions to allocate per physical function (uint)
    module_sig: 883f3504af3fe359a79aca2e69819291121b4409f6ecc47545455cf3b51a9aa99f40859e7bd7931a09f76b4b34dde9013eed67638dee172193713aff51f

    Очень напрягает практически полное отсутствие секции parm, т.е. драйвер не знает практически никаких параметров.

    Поднимем один порт например eth2 и посмотрим как обстоят дела в /proc/interrupts
    cat /proc/interrupts|grep eth2

               CPU0       CPU1       CPU2       CPU3       CPU4       CPU5       CPU6       CPU7
    122:          0          0          0          0          0          0          0          0       PCI-MSI-X  eth2-tx-0
    130:        182          0          0          0          0          0          0          0       PCI-MSI-X  eth2-rx-0
    138:        182          0          0          0          0          0          0          0       PCI-MSI-X  eth2-rx-1
    146:        182          0          0          0          0          0          0          0       PCI-MSI-X  eth2-rx-2
    154:        182          0          0          0          0          0          0          0       PCI-MSI-X  eth2-rx-3
    162:          2          0          0          0          0          0          0          0       PCI-MSI-X  eth2

    Попытаемся подгрузить драйвер igb с нужными нам параметрами, для того чтобы задействовать по 8 очередей на порт.

    modprobe igb IntMode=3,3,3,3 RSS=8,8,8,8


    FATAL: Error inserting igb (/lib/modules/2.6.18-164.6.1.1.el5PAE/kernel/drivers/net/igb/igb.ko): Unknown symbol in module, or unknown parameter (see dmesg)

    в dmesg

    igb: Unknown parameter `IntMode\'
    igb: Unknown parameter `RSS\'

    опс, драйвер не знает таких параметров :(

    Надо попробовать свежую версию драйвера igb может с ним нам повезет больше, т. к. собирать драйвер вручную было категорически лень, то вспомнился репозиторий ELREPO в котором данный драйвер присутствует.

    Устанавливаем:

    rpm -ihv http://elrepo.org/linux/elrepo/el5/i386/RPMS/kmod-igb-PAE-2.0.6-1.el5.elrepo.i686.rpm

    Загружается http://elrepo.org/linux/elrepo/el5/i386/RPMS/kmod-igb-PAE-2.0.6-1.el5.elrepo.i686.rpm
    предупреждение: /var/tmp/rpm-xfer.cvXEF5: Заголовок V3 DSA signature: NOKEY, key ID baadae52
    Подготовка...     ########################################### [100%]
       1:kmod-igb-PAE           ########################################### [100%]
    Creating the symbolic links. This may take some time ...
    Done.


    modinfo igb

    filename:       /lib/modules/2.6.18-164.6.1.1.el5PAE/weak-updates/igb/igb.ko
    version:        2.0.6
    license:        GPL
    description:    Intel(R) Gigabit Ethernet Network Driver
    author:         Intel Corporation, 
    srcversion:     AD1D1A409C0E0945FADD6A2
    alias:          pci:v00008086d000010D6sv*sd*bc*sc*i*
    alias:          pci:v00008086d000010A9sv*sd*bc*sc*i*
    alias:          pci:v00008086d000010A7sv*sd*bc*sc*i*
    alias:          pci:v00008086d000010E8sv*sd*bc*sc*i*
    alias:          pci:v00008086d0000150Dsv*sd*bc*sc*i*
    alias:          pci:v00008086d000010E7sv*sd*bc*sc*i*
    alias:          pci:v00008086d000010E6sv*sd*bc*sc*i*
    alias:          pci:v00008086d00001518sv*sd*bc*sc*i*
    alias:          pci:v00008086d0000150Asv*sd*bc*sc*i*
    alias:          pci:v00008086d000010C9sv*sd*bc*sc*i*
    depends:
    vermagic:       2.6.18-8.el5PAE SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1
    parm:           InterruptThrottleRate:Interrupt Throttling Rate (array of int)
    parm:           IntMode:Interrupt Mode (array of int)
    parm:           LLIPort:Low Latency Interrupt TCP Port (array of int)
    parm:           LLIPush:Low Latency Interrupt on TCP Push flag (array of int)
    parm:           LLISize:Low Latency Interrupt on Packet Size (array of int)
    parm:           RSS:RSS - multiqueue receive count (array of int)
    parm:           VMDQ:VMDQ - VMDq multiqueue receive (array of int)
    parm:           QueuePairs:QueuePairs - TX/RX queue pairs for interrupt handling (array of int)
    parm:           debug:Debug level (0=none, ..., 16=all) (int)

    Подгружаем драйвер с нужными параметрами

    modprobe igb IntMode=3,3,3,3 RSS=8,8,8,8

    Проверяем

    cat /proc/interrupts |grep eth2

     51:          6          0          0          0          0          0          0          0       PCI-MSI-X  eth2
     52:          5          0          0          0          0          0          0          0       PCI-MSI-X  eth2-TxRx-0
     53:         34          0          0          0          0          0          0          0       PCI-MSI-X  eth2-rx-1
     54:          8          0          0          0          0          0          0          0       PCI-MSI-X  eth2-rx-2
     59:          8          0          0          0          0          0          0          0       PCI-MSI-X  eth2-rx-3
     60:          8          0          0          0          0          0          0          0       PCI-MSI-X  eth2-rx-4
     61:         34          0          0          0          0          0          0          0       PCI-MSI-X  eth2-rx-5
     62:          8          0          0          0          0          0          0          0       PCI-MSI-X  eth2-rx-6
     67:          5          0          0          0          0          0          0          0       PCI-MSI-X  eth2-rx-7

    Теперь на каждый порт мы имеем по 8 очередей.

    Победа.

    Попытаемся заNAT-ить несколько сот мегабит трафика при штатном драйвере igb и проверим нагрузку на систему.

    Для сравнения вспомним данный обзор, в котором процессоры умирали от si (system interrupts) при трафике в 400 мегабит.

    «Дунем» через наш адаптер 400 мегабит входящего трафика, исходящий окажется в пределах 300 мегабит.


    vnstat -i eth0 -tr

    609740 packets sampled in 5 seconds
    Traffic average for eth0
    
          rx       45864.72 kB/s          61261 packets/s
          tx       29906.86 kB/s          60686 packets/s

    Посмотрим количество conntrack соединений

    sysctl -a|grep net.ipv4.netfilter.ip_conntrack_count

    net.ipv4.netfilter.ip_conntrack_count = 272495

    Посмотрим нагрузку на ядра

    top

    Cpu0  :  0.0%us,  0.0%sy,  0.0%ni, 68.4%id,  0.0%wa,  0.7%hi, 30.9%si,  0.0%st
    Cpu1  :  0.0%us,  0.0%sy,  0.0%ni, 65.6%id,  0.0%wa,  3.3%hi, 31.1%si,  0.0%st
    Cpu2  :  0.0%us,  0.0%sy,  0.0%ni, 66.7%id,  0.0%wa,  0.3%hi, 33.0%si,  0.0%st
    Cpu3  :  0.0%us,  0.0%sy,  0.0%ni, 69.7%id,  0.0%wa,  0.3%hi, 30.0%si,  0.0%st
    Cpu4  :  0.3%us,  0.0%sy,  0.0%ni, 65.1%id,  0.0%wa,  0.7%hi, 33.9%si,  0.0%st
    Cpu5  :  0.0%us,  0.0%sy,  0.0%ni, 63.8%id,  0.0%wa,  0.7%hi, 35.5%si,  0.0%st
    Cpu6  :  0.0%us,  0.0%sy,  0.0%ni, 64.7%id,  0.0%wa,  3.0%hi, 32.3%si,  0.0%st
    Cpu7  :  0.0%us,  0.0%sy,  0.0%ni, 63.7%id,  0.0%wa,  0.7%hi, 35.7%si,  0.0%st
    Mem:   4147676k total,   340000k used,  3807676k free,    40524k buffers
    Swap:  1052248k total,        0k used,  1052248k free,   123408k cached

    Как видим средняя нагрузка на CPU от system interrupts в районе 33% т.е. сервер будет в состоянии занатить 1 гигабит трафика.

    http://centos.alt.ru/?p=311