2

在基于 RAW-socket 的数据包发送测试期间,我发现了非常恼人的症状。使用默认的 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 个数据包被发送。

我想知道出现这种情况的原因,也想知道如何解决这个问题(当然不知道是不是真的有问题)。

有人能给我一些建议、例子或对这个问题的参考吗?

最好的问候, bjlee

4

2 回答 2

1

你没有说你的数据包有多大,或者你的网络、网卡、硬件的任何特征,或者关于远程机器接收数据的任何东西。

我怀疑您应该使用ethtool来调整环形缓冲区的数量,而不是使用 /proc/sys 的东西,但不一定要调整这些缓冲区的大小。

此外,此页面是一个很好的资源。

于 2012-11-01T08:41:13.850 回答
1

我一直在处理基本相同的问题。我不小心偶然发现了一个完全违反直觉的答案,对我来说仍然没有意义,但它似乎有效。

我正在尝试越来越大的SO_SNDBUF缓冲区大小,并且疯狂地丢失数据包。由于意外超出了我的系统定义的最大值,它将SO_SNDBUF大小设置为一个非常小的数字,但奇怪的是,我不再遇到丢包问题。所以我故意设置SO_SNDBUF1,这又导致了一个非常小的数字(不确定,但我认为它实际上设置为类似1k),而且令人惊讶的是,仍然没有丢包。

如果有人可以解释这一点,我将最有兴趣听到它。以防万一,我的版本Linux is RHEL 5.11(是的,我知道,我有点落后于时代)。

于 2015-10-19T19:59:48.687 回答