Разгрузка сетевой подсистемы Freebsd

И так в данной статье я опишу как можно немного разгрузить сетевую подсистему  по средствам оптимизации работы сетевой карты . Данный пост рассматривался для Freebsd 7.2

И так если вы имеете (см. ниже таблицу) сетевую карту третьего сорта :

Driver Name Description
bge Broadcom BCM570x/5714/5721/5722/5750/5751/5752/5789 PCI Gigabit Ethernet adapter driver
dc DEC/Intel 21143 and clone 10/100 Ethernet driver
em Intel(R) PRO/1000 Gigabit Ethernet adapter driver
fwe Ethernet emulation driver for FireWire
fwip IP over FireWire driver
fxp Intel EtherExpress PRO/100 Ethernet device driver
ixgb Intel(R) PRO/10GbE Ethernet driver for the FreeBSD operating system
nfe NVIDIA nForce MCP Ethernet driver
nge National Semiconductor PCI Gigabit Ethernet adapter driver
re RealTek 8139C+/8169/816xS/811xS/8101E PCI/PCIe Ethernet adapter driver
rl RealTek 8129/8139 Fast Ethernet device driver
sf Adaptec AIC-6915 «Starfire» PCI Fast Ethernet adapter driver
sis SiS 900, SiS 7016 and NS DP83815/DP83816 Fast Ethernet device driver
ste Sundance Technologies ST201 Fast Ethernet device driver
stge Sundance/Tamarack TC9021 Gigabit Ethernet adapter driver
vge VIA Networking Technologies VT6122 PCI Gigabit Ethernet adapter driver
vr VIA Technologies Rhine I/II/III Ethernet device driver
xl 3Com Etherlink XL and Fast Etherlink XL Ethernet device driver

 

Необходимо пересобрать ядро :

  1.  AMD 64 (64 bit) kernel is at /usr/src/sys/amd64/conf/
  2.  i386 (32 bit) kernel is at /usr/src/sys/i386/conf/

 

со следующими опциями :

 

options DEVICE_POLLING
options HZ=1000

# make buildkernel KERNCONF=GENERIC
# make installkernel KERNCONF=GENERIC

И далее включаем опрос на интерфейсе :

# ifconfig device polling
# ifconfig em0 polling

# ifconfig device -polling
# ifconfig em0 -polling

 

После чего правим /etc/rc.conf :

ifconfig_em0=»inet 10.21.111.100 netmask 255.255.255.192 media 10baseT/UTP mediaopt full-duplex polling»

Смотрим :

# sysctl -a kern.polling



kern.polling.idlepoll_sleeping: 1
kern.polling.stalled: 0
kern.polling.suspect: 0
kern.polling.phase: 4
kern.polling.enable: 0
kern.polling.handlers: 2
kern.polling.residual_burst: 0
kern.polling.pending_polls: 0
kern.polling.lost_polls: 0
kern.polling.short_ticks: 0
kern.polling.reg_frac: 20
kern.polling.user_frac: 50
kern.polling.idle_poll: 0
kern.polling.each_burst: 5
kern.polling.burst_max: 150
kern.polling.burst: 150

Результаты тестирования по средствам нагрузки интерфейса TCP\UDP трафиком , как видим есть разница , на больших обьемах и сильно нагруженных серверах этот результат будет очевиден  :

 

Test Polling Interrupt
Data Transmit 8.87 Mbits/sec 6.28 Mbits/sec
CPU load 34% 73%