1

介绍

我正在编写一个应用程序,它需要能够跟踪网络流量的谨慎配置文件的吞吐量(当然,使用 libpcap)。基本思想是在每个常规采样间隔期间累积字节和数据包计数器,并使用它来计算大约 1 秒间隔的平均吞吐量。

细节

每个数据点都由远程地址和远程端口来区分。他们将在由以下结构组成的循环缓冲区中存储(非常短的)样本历史记录:

typedef struct {
  struct timeval ts_start;  // Time at the start of this sample
  size_t packets;           // packet count during this sample
  size_t bytes;             // byte count during this sample
} Sample;

我最初的想法是用 STL 和 Boost 做一些类似于以下的事情:

typedef std::pair<unsigned long /* addr */, unsigned short /* port */> PeerSpec;
typedef boost::circular_buffer<Sample> DataPoint;
std::map<PeerSpec, DataPoint> tracked_peers;

每个循环缓冲区将有少量元素,该数量定义为1 + summary_interval / sample_period. 我在想,如果摘要间隔为 1 秒,那么 250-1000 毫秒的采样周期是合适的(意味着每个数据点有 2-5 个历史样本)。

tracked_peers当在捕获中观察到此类流量时,每个数据点都将被实例化并动态添加到地图中。自然,我的 pcap 回调会逐个数据包地更新计数器。

问题

以这种方式这样做是疯狂/不明智/不可能吗?我担心它可能不够快,无法跟上数据包捕获的速度。我需要注意任何复制语义吗?我认为这应该是合适的,只要我不导致每次更新都复制整个循环缓冲区。我问是因为我不确定我是否完全掌握所有含义。

4

0 回答 0