Оценка производительности графов Netgraph.

На примере возможных схем анализа трафика, средствами ng_netflow.

В данном документе приведена простейшая методика оценки производительности графов Netgraph на примерах "сбора" трафика, проходящего в обоих направлениях, через интерфейс.

Большая часть схем представляет лишь теоретические изыскания и не испытывалась на практике.
Для анализа схем используются примитивные представления о зависимости производительности системы от количества узлов в графе.
Для упрощения, при анализе не учитывается внутреннее устройство подсистемы Netgraph и отдельных узлов.

Условные обозначения:
ng_netflow
Узел ng_netflow имеет 3 типа хуков: ifaceX, outX, export
При прохождении пакета в направлении ifaceX - outX, анализируются заголовки пакета. Информация о пакете заносится функцией hash_insert() в hash-таблицу. При достижении определенных условий функция export_send() формирует пакет netflow и отравляет в хук export.

Однако, при нормальных условиях, количество пакетов отправляемых в хук export значительно меньше количества пакетов, проходящих через узел в направлении ifaceX - outX. Таким образом, вкладом export_send() можно пренебречь.
Можно считать, что производится лишь операция перенаправления.

При прохождении пакета в направлении outX - ifaceX, данные сразу перенаправляются в хук ifaceX.

Таким образом, при прохождении трафика через узел ng_netflow производится
0 операций копирования
1 операция перенаправления данных.
ng_tee
ng_one2many
Узел ng_one2many может работать в 2-х режимах:
XMIT_ALL - пакет приходящий на хук one перенаправляется в один из хуков many, в остальные доставляется копия.

XMIT_ROUNDROBIN - выбор хука many производится последовательным перебором всех хуков manyX. Таким образом, в этом случае делается лишь одна операция перенаправления.XMIT_ROUNDROBIN является поведением по умолчанию.

Пакеты, приходящие на любой из хуков manyX, в обоих случаях перенаправляются в хук one.
ng_hub


Пакеты приходящие на любой из хуков узла ng_hub перенаправляются в один из хуков, в остальные доставляется копия.
ng_split
Схема 1
Код к схеме 1:
ngctl -f- <<-SEQ
    mkpeer em0: tee lower left
    name em0:lower tee
    connect tee: em0: right upper

    mkpeer tee: one2many left2right many0
    name tee:left2right one2many
    connect tee: one2many: right2left many1

    mkpeer one2many: netflow one iface0
    name one2many:one netflow

    mkpeer netflow: ksocket export inet/dgram/udp
    name netflow:export ksocket
    msg ksocket: connect inet/10.0.0.1:4444
SEQ
Схема 2
Код к схеме 2:
ngctl -f- <<-SEQ
    mkpeer em0: tee lower left
    name em0:lower tee
    connect tee: em0: right upper

    mkpeer tee: netflow left2right iface0
    name tee:left2right netflow
    connect tee: netflow: right2left iface1

    mkpeer netflow: ksocket export inet/dgram/udp
    name netflow:export ksocket
    msg ksocket: connect inet/10.0.0.1:4444
SEQ
Схема 3
Код к схеме 3:
ngctl -f- <<-SEQ
    mkpeer em0: split lower mixed
    name em0:lower splitlow

    mkpeer split0: netflow  out iface0
    name split0:iface0 netflow
    connect netflow: split0: out1 in

    mkpeer netflow: split iface1 out
    name netflow:out split1
    connect split1: netflow: in out0

    connect split1: em0: mixed upper

    mkpeer netflow: ksocket export inet/dgram/udp
    name netflow:export ksocket
    msg ksocket: connect inet/10.0.0.1:4444
SEQ
Схема 4
Код к схеме 4:
ngctl -f- <<-SEQ
    mkpeer em0: hub lower hook0
    name em0:lower hub
    connect hub: em0: hook1 upper

    mkpeer hub: netflow hook2 iface0
    name hub:hook2 netflow

    mkpeer netflow: ksocket export inet/dgram/udp
    name netflow:export ksocket
    msg ksocket: connect inet/10.0.0.1:4444
SEQ
Схема 5
Код к схеме 5:
ngctl -f- <<-SEQ
    mkpeer em0: netflow lower iface0
    name em0:lower netflow0

    mkpeer netflow0: netflow out0 out0
    name netflow0:out0 netflow1

    connect netflow1: em0: iface0 upper
    mkpeer netflow0: one2many export many1
    name netflow0:export one2many
    connect netflow1: one2many: export many0

    mkpeer one2many: ksocket one inet/dgram/udp
    name one2many:one ksocket
    msg ksocket: connect inet/10.0.0.1:4444
SEQ
Схема 6
Код к схеме 6:
ngctl -f- <<-SEQ
    mkpeer em0: netflow lower iface0
    name em0:lower netflow

    mkpeer netflow: hub out0 hook0
    name netflow:out0 hub

    connect hub: netflow: hook1 out1
    connect netflow: em0: iface1 upper

    mkpeer netflow: ksocket export inet/dgram/udp
    name netflow:export ksocket
    msg ksocket: connect inet/10.0.0.1:4444
SEQ
Схема 7
Код к схеме 7:
ngctl -f- <<-SEQ
    mkpeer em0: netflow lower iface0
    name em0:lower netflow
    connect netflow: em0: iface1 upper

    connect netflow: netflow: out0 out1

    mkpeer netflow: ksocket export inet/dgram/udp
    name netflow:export ksocket
    msg ksocket: connect inet/10.0.0.1:4444
SEQ
Приведенный метод анализа позволяет простыми средствами оценить ресурсоемкость графа Netgraph.
Исходя из изложенных соображений

Схемы 2 и 4 равнозначны.
Схемы 3 и 6 равнозначны.
Схемы 5 и 7 равнозначны.

Схема 1 должна быть наименее производительной.
Схемы 5 и 7 должны быть наиболее производительными.