Поскольку обработка пакетов (вычисление статистики, таких как распределение 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
, Разве это не распараллеливается вообще?
Задача ещё не решена.
Других решений пока нет …