Polling

Что же такое 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 не хуже и более естественен.

Поэтому использовать поллинг или нет — решается путём тестов и экспериментов на производительность.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *