Несмотря на пафосный отказ компании Yandex использовать настоящую систему на своих серверах, счастливые обладатели FreeBSD 8.x еще могут насладится драйверами от Yandex, или, как говорят в определенных кругах, «новыми интересными драйверами от Эльдара».  На сайте доступна версия 7.1.9, датированная  25 февраля 2011 г. Из нового интересного:

main features
-------------

RX queue is being processed w/more than one thread. Use "sysctl dev.em.X.rx_kthreads" to alter number of threads.

TX interrupts has been removed because it's not neccessary actually. That's why interrupt rate has been reduced twice at least.

TX queue cleaning has been moved to seperate kthread. em_start uses mtx_trylock instead of mtx_lock. That's why em_start locks less.

+ RX queues' priority may be altered thru sysctl. System seems to be more stable if RX scheduled w/less priority.

+ RX interrupt stay masked if there is no thread ready to catch interrupt. The hint reduces context switching under load.

NOTES:
1) do not forget to do "sysctl net.isr.direct=1" if you want to see more SMP.
2) turn off polling. We didn't touch this part of code yet.

Доработаны прерывания входящих пакетов, исключены прерывания исходящих пакетов. Ну ладно, скачиваем драйвер, собираем и устанавливаем его.

# fetch http://people.yandex-team.ru/~wawa/em-7.1.9-RELENG8-yandex-1.36.2.17.2.25.tar.gz
em-7.1.9-RELENG8-yandex-1.36.2.17.2.25.tar.gz 100% of  316 kB  153 kBps
# tar -xf em-7.1.9-RELENG8-yandex-1.36.2.17.2.25.tar.gz

Собрать драйвер отдельно не получится, там нет Makefile, содержимое директории ./em-7.1.9-RELENG8-yandex-1.36.2.17.2.25 необходимо скопировать в директорию /usr/src/sys/dev/e1000 и пересобрать ядро. После сборки получаем новый драйвер.

dev.em.0.%desc: Intel(R) PRO/1000 Network Connection 7.1.9.Yandex[$Revision: 1.36.2.17.2.25 $]

И, собственно, два потока.

dev.em.0.rx_kthread_priority: 127
dev.em.0.rx_kthread_prio_inc: 4
dev.em.0.rx_kthreads: 2
dev.em.0.rx_kth_bind: 123456

Посмотрим деление пакетов драйвером, подавая на сетевой адаптер тестовый трафик в виде mirror-а с порта коммутатора, через который прогоняется 2 потока, генерируемые с помощью iperf.

Вот такое вот распределение нагрузки по ядрам. Сложно сказать, что распределение стало более равномерным. Какие то пакеты конечно поступают во вторую очередь. Но в целом неубедительно. Поэтому делаем «ход пешкой», снижаем частоту процессора через механизм cpufreq, так делать некорректно и некрасиво, но в нашем случае можно. Итак, снижаем частоту по черному — с 2.6 GHz до 650 mHz — и повторяем эксперимент.

Невооруженным глазом видно, что драйвер «от Эльдара» уступает оригинальному драйверу от Intel. Нет ни малейшего смысла использовать его на серверах с FreeBSD 8.0, увы…

Как рекомендацию, для высокопроизводительных маршрутизаторов можно обозначить необходимость установки сетевых адаптеров управляемых драйвером em равным количеству ядер процессора. Либо необходимо использовать более новые адаптеры , управляемые драйвером igb, в которых очереди и так реализованы аппаратно.
P.S. При выгрузке драйвера от Yandex посредством kldunload, система аварийного перегружается.