Распараллеливание обработки пакетов

Поскольку обработка пакетов (вычисление статистики, таких как распределение IP, распределение TTL и т. Д.) Больших файлов PCAP сравнительно медленная, я хочу распараллелить ее.

Я использую библиотеку C ++ libtins для чтения и обработки пакетов:

Чтение пакетов

FileSniffer sniffer(pcap_path);
for (const auto &pkt : sniffer) {
this->process_packets(pkt);
}

Пакетная обработка (выписка)

void PcapProcessor::process_packets(const Packet &pkt) {
// packet count
packetCount++;
const PDU *pdu = pkt.pdu();

if (pdu->find_pdu<IP>()) {
const IP &ipLayer = pdu->rfind_pdu<IP>();
// IP distribution
ip_distribution[ipLayer.src_addr()]++;
ip_distribution[ipLayer.dst_addr()]++;

// TTL distribution
ttl_distribution[ipLayer.ttl()]++;

// Protocol distribution - layer 3
protocol_distribution["IP"]++;
}

// Protocol distribution - layer 4
PDU::PDUType p = pdu->inner_pdu()->pdu_type();
if (p == PDU::PDUType::TCP) {
protocol_distribution["TCP"]++;
}
if (p == PDU::PDUType::UDP) {
protocol_distribution["UDP"]++;
}
}

в то время как process_packets потребляет большую часть времени обработки. Было бы значительно экономить время, если бы он мог вызываться для нескольких пакетов параллельно. Это вообще возможно, так как количество пакетов в sniffer еще не известно? Если это так, должен std::unordered_map а также int Переменные, используемые в process_packets изменил быть потокобезопасным?

Я пытался использовать OpenMP, просто добавив #pragma openmp parallel for до цикла, что приводит к error: ‘pkt’ implicitly determined as ‘firstprivate’ has reference type #pragma omp task, Разве это не распараллеливается вообще?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]