Сетевые интерфейсы в FreeBSD

Cетевые карты Intel em

Для начала требуется добавить возможность чипам сетевых интерфейсов 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