在基于RAW套接字的数据包发送测试期间,我发现了非常恼人的症状。 使用默认的RAW套接字设置(特别是对于SO_SNDBUF大小), 原始套接字发送100,000个数据包没有问题,但花了大约8秒 发送所有数据包,接收进程正确接收数据包。 这意味着默认设置可以达到大约10,000 pps(每秒数据包)。 (我认为这个数字太小,与我的期望相反。)
无论如何,为了增加pps值,我增加了数据包发送缓冲区的大小 通过调整/ proc / sys / net / core / {wmem_max,wmem_default}。 在增加两个系统参数后,我发现了刺激性症状。 立即发送100,000个数据包,但只有3,000个数据包 接收器进程接收(位于远程节点)。
在发送Linux盒子(Centos 5.2)时,我做了netstat -a -s和ifconfig。 Netstat显示发出了100,000个请求,但ifconfig显示了这一点 只有3,000个数据包被TX。
我想知道发生这种情况的原因,我也想知道 我怎样才能解决这个问题(当然我不知道这是不是真的有问题)。
有人能给我一些建议,例子或对这个问题的参考吗?
祝你好运, bjlee
答案 0 :(得分:1)
您没有说明您的数据包的大小或网络,NIC,硬件或接收数据的远程机器的任何特征的任何特征。
我怀疑你应该使用ethtool来调整环形缓冲区的数量,而不是使用/ proc / sys的东西,而不是那些缓冲区的大小。
此外,this page是一个很好的资源。
答案 1 :(得分:1)
我刚刚解决了同样的问题。我不小心偶然发现了一个完全反直觉的答案,这个答案对我来说仍然没有意义,但似乎有效。
我正在尝试越来越大的SO_SNDBUF
缓冲区大小,并且像疯了一样丢失数据包。通过意外地超出我的系统定义的最大值,它将SO_SNDBUF
大小设置为一个非常小的数字,但奇怪的是,我不再有丢包问题。所以我故意将SO_SNDBUF
设置为1
,这又导致了一个非常小的数字(不确定,但我认为它实际上将它设置为类似1k
),而且令人惊讶的是,仍然没有丢包。
如果有人能够解释这一点,我最感兴趣的是听到它。如果它很重要,我的版本Linux is RHEL 5.11
(是的,我知道,我有点落后于时代)。