Date: Thu, 21 Jun 2001 15:15:07 +0000 (UTC)
From: is@stack.net
Subject: 1,9| Re: FAQ по считанию траффика
Stepan Koltsov <yozh@niit.ru> wrote:
> is@stack.net wrote:
>>>>> divert надо использовать тогда, когда считание траффика -- первоочередная
>>>>> задача, поскольку если ipacctd не запущен, инет на работает, в противном
>>>>> случае -- tee.
>>>
>>>> И еще нужно учесть такой минус, что на каждый пакет будет происходит
>>>> два контекст свитча, которых нет в двух предыдущих схемах.
>>>
>>> Не понял.
>
>> ipfw работает в kernel mode, а divert делается в user mode.
>
>> То есть, работает какой-нибудь софт, типа апача. Тут в эзернет
>> пришёл пакет, произошёл интеррапт - управление перешло к ядру,
>> драйвер карты пакет вытащил из карточки и передал его файрволлу.
>> Файрволл посмотрел правила и дивертнул пакет ipacctd.
>> В процессе диверта произошло переключение в user mode.
>> Поскольку предыдущий процесс в юзер моде был апач, то нужно
>> установить другие page tables == сбросить tlb.
>> Пакет обрабатывается ipacctd и возвращается взад в ядро.
>> Ядро обработало пакет совсем и возвращается в апач.
>> Опять меняем page tables == сбрасываем tlb.
>
>> Ну и по ходу дела, сохраняем/восстанавливаем все регистры,
>> переключаемся из ринга 3 в ринг 0 и обратно,
>> частями или полностью теряем закэшированное в L1 и L2 кэшах.
>
>> Вот что такое контекст-свитч.
>
> Я почти понял :) Поэтому через tee работает быстрее, так? А trafd вообще не
> читает весь пакет, а только заголовок, вот оно что...
С tee быстрее, потому что оно просто копирует пакет в порт.
А уж потом этот пакет будет считан ipacсtd. В этом случае
ipacctd получает тайм слайс как обычный процесс и может обработать
несколько пакетов в течение его, хотя для каждого придется делать read().
Что касается bpf/trafd, то bpf накапливает пакеты, которые
trafd потом будет читать, то есть, схема работы как у tee/ipacctd.
--
Игорь Сысоев