$ ./ya_get_nf_direct --help
ya_get_nf_direct - UTM ya_get_nf_direct module.
$Revision: 0.1, 23-sep-2010 $
Usage: ya_get_nf_direct [-h] [options]
Options:
-D, --directory Directory, default: /netup/utm5/db/
-b, --database Database name, (- - stdin), default: /netup/utm5/db/iptraffic_raw.dbs
-a, --account_id Account ID, default: none
-s, --src_ip=<addr>[/mask] Source Address, default: none
-d, --dst_ip=<addr>[/mask] Destination Address, default: none
-p, --src_port Source port, default: none
-P, --dst_port Destination port, default: none
-c, --tclass Traffic class, default: none
-f, --from=timestamp From timestamp/datetime, default: 0
-t, --to=timestamp To timestamp/datetime, default: current timestamp
-l, --limit Max count of rows, default: unlim
-e, --extended Print stats in extended format
-F, --filter=<filter> Apply extended filter
-S, --sqlite=<db> Dump to Sqlite database db
-h, --help Help
-v, --version Show version
Extended filters:
Logical operators: ||, &&, !, ()
Comprarsion operators: ==, !=, >, >=, <, <=
Supported expressions:
fw_id [==] addr[/mask] Netup Firewall ID
src_addr [==] addr[/mask] Source IP/Network
dst_addr [==] addr[/mask] Destination IP/Network
next_hop [==] addr[/mask] Next Hop IP/Network
i_ifx [compr] num Source interface index
o_ifx [compr] num Destination interface index
packets [compr] num Number of packets in a flow
octets [compr] num Number of octets in a flow
s_port [compr] num Source port
d_port [compr] num Destination port
flags [==] num TCP flags
prot [compr] num IP Protocol
tos [compr] num IP TOS
src_as [compr] num Source AS
dst_as [compr] num Destination AS
slink_id [compr] num UTM service link ID
account_id [compr] num UTM account ID
account_ip [==] addr[/mask] UTM accounted IP
tclass [compr] num UTM traffic class
timestamp [compr] num|datetime UTM timestamp
router_ip [==] addr[/mask] Netflow Router IP
Вот фильтрацию не мешало бы разделить на число ядер в системе.
Для четырех тредов
1) читаем из потока кратное 4 число записей (или что осталось, если близко к концу файла) и складываем во входной массив
2) стартуем треды со следующими параметрами: первый тред стартует с нулевой записи, второй - с первой, третий - со второй, четвертый - с третьей, и идут до конца массива с шагом 4, каждому треду передается указатель на свой выходной массив, в который складываются номера отфильтрованных записей
3) когда все треды отрабатывают, главный тред выбирает из входного массива записи согласно номерам из четырех выходных массивов и так собирает урожай
Главное преимущество такого решения - скорость за счет работы только с оперативной памятью и полного отсутствия синхронизации тредов. Да, все блоки динамической памяти создавайте до запуска тредов и ни в коем случае не внутри них - это будет ударом по производительности. К примеру, если будете использовать std::vector<int> в качестве выходного массива, установите ему размер до запуска треда, чтобы во время работы треда он не делал движений по изменению своего размера (а они неявные).
Кроме того, текстовое выражение фильтра лучше скомпилировать в некий байткод, быстрее будет отрабатывать. Разбор текстового выражения применительно к каждой записи - операция довольно тяжелая, и на миллионах записей это будет заметно.
Добавлено: Вт Ноя 06, 2012 9:20 am Заголовок сообщения:
Фильтрация выполняется значительно быстрее распаковки, она там вообще незаметна. Разбора текста там нет, выражение вначале преобразуется во внутреннее представление.
Вот распаковку можно распаралеллить. Хотя сейчас оно уже особо никому не надо За 2 года мне самому понадобилось воспользоваться этим фильтрм всего 1-2 раза.
Добавлено: Вт Ноя 06, 2012 10:28 am Заголовок сообщения:
Тогда и распаковку в треды. Операция ведется над группой файлов, или списком. Точно так же обработать список с шагом, равным количеству тредов. На выходе, правда, каша получится, но можно отсортировать как надо.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах