2012-11-01 32 views
2

在基于RAW套接字的数据包发送测试中,我发现了非常刺激的症状。 使用默认的RAW套接字设置(特别是对于SO_SNDBUF大小), 原始套接字可毫无问题地发送100,000个数据包,但发送所有数据包需要大约8秒的时间,并且数据包被接收器进程正确接收。 这意味着通过默认设置可以实现大约10,000pps(每秒数据包)。 (我认为这是太小了数字出乎我的意料。)RAW套接字发送:数据包丢失

无论如何,增加PPS值,我增加了数据包通过调整在/ proc/SYS /网/核心/ {wmem_max,wmem_default发送缓冲区大小 }。 增加两个系统参数后,我确定了刺激症状。 尽快发送100,000个数据包,但只有3,000个数据包由接收器进程(位于远程节点)接收到 。

在发送的Linux机器上(Centos 5.2),我做了netstat -a -s和ifconfig。 Netstat显示发出了100,000个请求,但ifconfig显示 只有3000个数据包被发送。

我想知道为什么发生这种情况,我也想知道 我该如何解决这个问题(当然我不知道它是否真的是一个问题)。

有没有人可以给我一些建议,例子或对这个问题的引用?

最好的问候, bjlee

回答

1

你没有说你的包是什么规模或网络的网卡,硬件或对远程计算机接收的数据进行任何的任何特征。

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

另外,this page是一个很好的资源。

+0

感谢您的评论。 我试过ethtool -G rx 4096 tx 4096和 观察到tx troughput增加了一倍。 但是最显着的增强是通过/ sbin/ifconfig eth1 txqueuelen 65536实现的 。 使用此设置,tx吞吐量最大化为 (在0.16秒内发送大约70,000个数据包)。 谢谢! –

+0

只是好奇,但没有很多吃进内核内存或不能交换的内存。只是想知道什么是权衡,否则我们都希望Linux内核预先调整到你所做的。 – selbie

+0

我同意。但我不知道权衡。我需要来自内核专家的评论。 –

1

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

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

如果任何人都可以解释这一点,我会很乐意听到它。万一它很重要,我的版本Linux is RHEL 5.11(是的,我知道,我有点落伍了)。