Оценка производительности графов Netgraph.
На примере возможных схем анализа трафика, средствами ng_netflow.
В данном документе приведена простейшая методика оценки производительности графов Netgraph на примерах "сбора" трафика, проходящего в обоих направлениях, через интерфейс.
Большая часть схем представляет лишь теоретические изыскания и не испытывалась на практике.
Для анализа схем используются примитивные представления о зависимости производительности системы от количества узлов в графе.
Для упрощения, при анализе не учитывается внутреннее устройство подсистемы Netgraph и отдельных узлов.
Условные обозначения:
Длина графа -
количество узлов, через которые проходит каждый пакет, по пути через netgraph.
Для нивелирования схем узел em0: учитываться не будет.
Предполагается, что чем длиннее граф, тем больше ресурсов затрачивается на прохождение каждого пакета.
Количество операций копирования и перенаправления данных - показывает количество соответствующих операций затрачиваемых при прохождении через граф.
Чем больше операций копирования и перенаправления, тем тем больше ресурсов затрачивается при прохождении через граф. Однако, перенаправление менее ресурсоемко в сравнении с копированием.
Для упрощения, внутренне устройство узлов, рассматриваться не будет.
Копирование лишь подразумевает, что после прохождения узла создается 2 и более копии данных.
Перенаправление - обозначает, лишь то, что количество экземпляров данных остается прежним.
Узел 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_one2many может работать в 2-х режимах:
XMIT_ALL - пакет приходящий на хук one перенаправляется в один из хуков many, в остальные доставляется копия.
XMIT_ROUNDROBIN - выбор хука many производится последовательным перебором всех хуков manyX. Таким образом, в этом случае делается лишь одна операция перенаправления.XMIT_ROUNDROBIN является поведением по умолчанию.
Пакеты, приходящие на любой из хуков manyX, в обоих случаях перенаправляются в хук one.
Пакеты приходящие на любой из хуков узла
ng_hub перенаправляются в один из хуков, в остальные доставляется копия.
Длина графа при движении от em0:lower к em0:upper составляет 3 узла: tee - one2many - netflow
При этом делается 1 операция копирования и 2 перенаправления данных.
При движении в обратном направлении длина графа и количество операций копирования и перенаправления не изменяется.
Код к схеме 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
Длина графа при движении от em0:lower к em0:upper составляет 2 узла: tee - netflow
При этом делается 1 операция копирования и 1 перенаправления данных.
При движении в обратном направлении длина графа и количество операций копирования и перенаправления не изменяется.
Код к схеме 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
Длина графа при движении от em0:lower к em0:upper составляет 3 узла: split0 - netflow - split1
При этом делается 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
Длина графа при движении от em0:lower к em0:upper составляет 2 узла: hub - netflow
При этом делается 1 операция копирования и 1 перенаправления данных.
При движении в обратном направлении длина графа и количество операций копирования и перенаправления не изменяется.
Код к схеме 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
Длина графа при движении от em0:lower к em0:upper составляет 2 узла: netflow0 - netflow1
При этом делается 2 операции перенаправления данных.
При движении в обратном направлении длина графа и количество операций копирования и перенаправления не изменяется.
Код к схеме 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
Длина графа при движении от em0:lower к em0:upper составляет 3 узла: netflow - hub - netflow
При этом делается 3 операции перенаправления данных.
При движении в обратном направлении длина графа и количество операций копирования и перенаправления не изменяется.
Код к схеме 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
Длина графа при движении от em0:lower к em0:upper составляет 2 узла: netflow - netflow
При этом делается 2 операции перенаправления данных.
При движении в обратном направлении длина графа и количество операций копирования и перенаправления не изменяется.
Код к схеме 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 должны быть наиболее производительными.