Купили такую железку 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
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
Комментариев нет:
Отправить комментарий