Date: Thu, 21 Jun 2001 14:17:29 +0000 (UTC)
From: is@stack.net
Subject: 6,6| Re: FAQ по считанию траффика
Stepan Koltsov <yozh@niit.ru> wrote:
>>> 3) используя ipacctd (мой любимый).
>>>
>>> ipacctd слушает на каком-нибудь порту. Весь траффик надо туда либо дивертить
>>> (divert), либо тиить (tee). При это firewall конфигурирутется приблизительно
>>> так:
>>>
>>> ipfw add allow tcp from any to ${host} 22
>>> ipfw add allow tcp ${host} 22 to any
>>> # Это надо, чтобы можно было починить когда что-то сломается.
>>> ipfw add divert ${ipacctd_port} any from any to any
>>>
>>> divert надо использовать тогда, когда считание траффика -- первоочередная
>>> задача, поскольку если ipacctd не запущен, инет на работает, в противном
>>> случае -- tee.
>
>> И еще нужно учесть такой минус, что на каждый пакет будет происходит
>> два контекст свитча, которых нет в двух предыдущих схемах.
>
> Не понял.
ipfw работает в kernel mode, а divert делается в user mode.
То есть, работает какой-нибудь софт, типа апача. Тут в эзернет
пришёл пакет, произошёл интеррапт - управление перешло к ядру,
драйвер карты пакет вытащил из карточки и передал его файрволлу.
Файрволл посмотрел правила и дивертнул пакет ipacctd.
В процессе диверта произошло переключение в user mode.
Поскольку предыдущий процесс в юзер моде был апач, то нужно
установить другие page tables == сбросить tlb.
Пакет обрабатывается ipacctd и возвращается взад в ядро.
Ядро обработало пакет совсем и возвращается в апач.
Опять меняем page tables == сбрасываем tlb.
Ну и по ходу дела, сохраняем/восстанавливаем все регистры,
переключаемся из ринга 3 в ринг 0 и обратно,
частями или полностью теряем закэшированное в L1 и L2 кэшах.
Вот что такое контекст-свитч.
--
Игорь Сысоев