你好网络绝地大师,
我最近设置了 vFlow,一个来自 Verizon Digital 的开源 sFlow 收集器。收集器工作得很好,非常稳定,并且易于管理。我不能说足够多的好话。
但是有一个奇怪的问题我想问这个论坛。获得 sFlow 统计数据后,我想知道我的网络应用程序的吞吐量,这似乎很合理,对吧?为了估计一个采样流中发送的字节总数,我有代码计算以下内容:
( Size of Sampled Packet Payload ) * ( Sampling Rate )
在 sFlow 中,这些统计数据将是:
( Packet.L3.TotalLen ) * ( Sample.SamplingRate )
换句话说,如果 vFlow 对其 IP 有效负载中包含 1,500 字节的数据包进行采样,并且我的采样率为 1/64,那么我将假设整个流为:
( 1500 bytes ) * ( 64 packets in this flow ) = 96,000 bytes in this flow
简单的。但是当我使用 iPerf 进行非常基本的测量测试时,我注意到这个计算总是关闭的。并且始终保持一致的数量。通过观察数据包大小、采样率和实际发送的字节数做一些逆向工程,我意识到我真正需要的公式是这样的:
( Packet.L3.TotalLen ) * ( Sample.SamplingRate ) * ( Some constant ) = Total bytes sent
唔。
我对此进行了很多实验,使用了数据包大小。(我的生产环境使用 1/64 作为我们的通用采样率,所以我没有费心改变它。)对于那些好奇的人,以下是我发现的结果:
Packet Payload
(Bytes) Constant
==============================
100 3.456997168
300 4.647359333
500 4.971690001
1000 5.230202893
1500 5.346555979
如果绘制此图,则该线接近约 5.35。我对每种数据包大小进行了数百次单独的测试,结果非常一致;vFlow 非常稳定。
我不介意将这个神秘的常量硬连线到我的代码中来计算发送的总字节数。但我完全不明白为什么需要这个常数。 难道我原来的公式不应该足以估计总吞吐量吗?这个常数意味着什么?这是 sFlow 的事情吗?或者可能是我忽略的 vFlow(错误)配置?
任何想法都会受到广泛赞赏。谢谢!