介绍
我正在编写一个应用程序,它需要能够跟踪网络流量的谨慎配置文件的吞吐量(当然,使用 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 回调会逐个数据包地更新计数器。
问题
以这种方式这样做是疯狂/不明智/不可能吗?我担心它可能不够快,无法跟上数据包捕获的速度。我需要注意任何复制语义吗?我认为这应该是合适的,只要我不导致每次更新都复制整个循环缓冲区。我问是因为我不确定我是否完全掌握所有含义。