Для начала требуется добавить возможность чипам сетевых интерфейсов Intel em генерировать более чем 8000 прерываний в секунду, т.к. зашитое по-умолчанию производителем значение hw.em.max_interrupt_rate в некоторых системах катастрофически не хватает. Для этого мы применим патч для устройства e1000.
Сделаем дамп исходников девайса, на случай проблем и ошибок, чтобы можно было произвести откат к прежнему драйверу.
# mkdir /root/drivers # cp -Rp /usr/src/sys/dev/e1000/ /root/drivers/e1000/
Скачиваем патч и распакуем соответствующий системе патч для драйвера устройства em.
# cd /tmp # wget http://wiki.onsever.ru/_media/freebsd/em_sysctl.diff.gz (для FreeBSD 8.2) # wget http://wiki.onsever.ru/_media/freebsd/em_sysctl-8.3.diff.gz (для FreeBSD >= 8.3) # wget http://wiki.onsever.ru/_media/freebsd/em_sysctl-9.2.diff.gz (для FreeBSD 9.2) # gunzip em_sysctl.diff.gz
Применяем патч.
# cp em_sysctl.diff /usr/src/ # cd /usr/src/ # patch < em_sysctl.diff
На экране наблюдаем процесс применения патча:
Hmm... Looks like a unified diff to me... The text leading up to this was: -------------------------- |--- sys/dev/e1000/if_em.h.orig 2010-12-30 11:18:14.000000000 +0600 |+++ sys/dev/e1000/if_em.h 2010-12-30 11:27:17.000000000 +0600 -------------------------- Patching file sys/dev/e1000/if_em.h using Plan A... Hunk #1 succeeded at 436. Hmm... The next patch looks like a unified diff to me... The text leading up to this was: -------------------------- |--- sys/dev/e1000/if_em.c.orig 2010-12-30 11:18:14.000000000 +0600 |+++ sys/dev/e1000/if_em.c 2010-12-30 11:27:17.000000000 +0600 -------------------------- Patching file sys/dev/e1000/if_em.c using Plan A... Hunk #1 succeeded at 365. Hunk #2 succeeded at 456. Hunk #3 succeeded at 1284. Hunk #4 succeeded at 2352 (offset 13 lines). Hunk #5 succeeded at 4076 (offset -3 lines). Hunk #6 succeeded at 4115 (offset 13 lines). done
Дальше, соответственно, пересобираем ядро системы.
# cd /usr/src/ # make buildkernel KERNCONF=CORE-IPFW-DUMMYNET && make installkernel KERNCONF=CORE-IPFW-DUMMYNET
После этого в /boot/loader.conf добавляем следующие значения (индивидуальные параметры).
hw.em.max_interrupt_rate=32000 hw.em.rxd=4096 hw.em.txd=4096
Далее в /etc/sysctl.conf добавляем следующие значения (индивидуальные параметры).
dev.em.0.rx_int_delay=200 dev.em.0.tx_int_delay=200 dev.em.0.rx_abs_int_delay=4000 dev.em.0.tx_abs_int_delay=4000 dev.em.0.rx_processing_limit=4096
После рестарта системы проверяем dmesg на наличие ошибок и sysctl-переменные.
# sysctl -a | grep em.0