Что же такое polling?
Это опрос сетевой карточки по таймеру. Проще говоря периодические опросы позволяют быстрее обрабатывать пакеты. Подробнее можно прочесть в инете. Мы же рассмотрим настройку polling’a в FreeBSD 8.1. Кстати, замечу, что некоторые опции изменили названия, по сравнению с версией 7.Х и младше.
Тестовый стенд: FreeBSD 8.1 i386, CPU Intel Xeon 4 CPUs
1) Вступление.
Polling имеет смысл включать на сетевых Intel (em, igb). Полный список поддерживаемых карт можно посмотреть в man polling На остальных системах мы либо не получим прироста либо можем получить баги. Поэтому будьте внимательны при включении.
2) Включение поллинга в ядре
Что бы иметь возможность наслаждаться поллингом, нужно пересобрать ядро с такими параметрами:
options DEVICE_POLLING
options HZ=1000
Примечание.
Параметр HZ (частота срабатывания планировщика, чем больше, тем чаще срабатывает планировщик) рекомендуют ставить не меньше 1000.
3) Включение поллинга в сетевой карте
После пересборки ядра поллинг включен НЕ БУДЕТ. Его нужно будет включить ещё в самой сетевой карточке:
# ifconfig em0 | grep options
options=20db<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC>
# ifconfig em0 polling
# ifconfig em0 | grep options
options=20db<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,POLLING,VLAN_HWCSUM,WOL_MAGIC>
Теперь видно, что polling включён. Добавим в /etc/rc.conf параметр polling, что бы при загрузке он тоже включался:
#grep em0 /etc/rc.conf
ifconfig_em0="inet 10.1.5.5 netmask 255.255.0.0 polling"
4) Переменные sysctl
Вот список переменных sysctl, которые отвечают за polling:
kern.hz: 1000
kern.polling.idlepoll_sleeping: 1
kern.polling.stalled: 14
kern.polling.suspect: 0
kern.polling.phase: 0
kern.polling.handlers: 1
kern.polling.residual_burst: 0
kern.polling.pending_polls: 0
kern.polling.lost_polls: 1400
kern.polling.short_ticks: 405
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
5) Использование polling’a.
Тесное применение поллинг нашёл в PPPoE сервере mpd. При использовании поллинга заметно снижается нагрузка на CPU. В этом случае выставляем такие переменные:
kern.polling.enable=1
kern.polling.user_frac=10
Последнее означает что система будет делить ресурсы CPU в соотношении userland/kernel как 10/90. По умолчанию это значение 50/50.
Ложка дёгтя.
Как заявляют разработчики – они уходят от polling’a. Вот выдержка из письма от Константина Белоусова
Текущая архитектура FreeBSD обрабатывает прерывания от устройств, и, в частности, сетевых карт, в специально запущенных для этого нитках.
Нить блокирована, единственное действие кода обработки прерывания – разблокировка нити. Вот кусочек вывода ps auxww на машине, с которой я
это пишу:root 218 0.0 0.0 0 8 ?? WL 9:46PM 0:00.79 [irq20: rl0 fwohci0]
root 220 0.0 0.0 0 8 ?? WL 9:46PM 0:05.69 [irq22: skc0 ath0]Почти все современные сетевые адаптеры для 1000baseTx имеет feature называемую “interrupt coalescing”, задерживающую вызов прерывания до заполнения Rx кольца адаптера.
Третье обстоятельство – это так называемый direct dispatch. Если вы помните, докладчик упоминал об отдельном процессе netisr, предназначенном для обработки Rx фреймов. Причина существования netisr
– тот факт, что прерывание от Rx может прийти в момент, когда процессор уже выполняет сетевой код, и полная обработка пакета из interrupt handler привела бы к рекурсивному входу в сетевой стек. Альтернативой
было бы поднять приоритет процессора до splnet (в терминах OpenBSD), но это бы означало, что прерывания блокированы на длительное время.Но, поскольку FreeBSD выполняет настоящий обработчик прерывания в отдельной нитке, то netisr не нужен. Все обработка входящего пакета можеть произойти без дорогостоящего переключения контекста. Это и есть direct dispatch. Direct dispatch включен по умолчанию на FreeBSD >= 7:
net.isr.direct: 1Нетрудно видеть, что комбинация всех трех упомянутых архитектурных элементов эквивалентна pollingу и даже эффективнее его.
Конечно, есть сетевые карты, для которых polling выигрывает, но тенденция состоит в том, что direct dispatch не хуже и более естественен.
Поэтому использовать поллинг или нет – решается путём тестов и экспериментов на производительность.