полезное по линуксу и iphone собрано все интересное мне лично (методом copy-paste из инета и не пыхтите насчет копирайта я ссылки на источник ставлю)

вторник, 6 апреля 2010 г.

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


Купили такую железку Intel ServerAdapter 1000 ET Quad Port PCIe .
Intel Serv.Adapter 1000 ET Quad Pro
Смонтировали в сервер. Задача заставить данный адаптер работать в 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 гигабит трафика.

Комментариев нет:

Отправить комментарий