【问题标题】:RAW socket send: packet lossRAW套接字发送:丢包
【发布时间】:2012-10-21 17:48:45
【问题描述】:

在基于 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

【问题讨论】:

    标签: sockets send loss


    【解决方案1】:

    您没有说明您的数据包的大小或您的网络、网卡、硬件或任何有关接收数据的远程计算机的任何特征。

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

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

    【讨论】:

    • 感谢您的友好评论。我尝试了 ethtool -G rx 4096 tx 4096 并观察到 ​​tx 吞吐量翻了一番。但是最显着的增强是通过 /sbin/ifconfig eth1 txqueuelen 65536 实现的。使用此设置,tx 吞吐量最大化(大约 70,000 个数据包在 0.16 秒内被 TX)。谢谢!
    • 只是好奇,但不会有很多内容会占用内核内存或无法交换的内存。只是想知道权衡是什么,否则我们都希望 Linux 内核能够预先调整到您所做的事情。
    • 我同意。但我不知道权衡。我需要内核专家的评论。
    【解决方案2】:

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

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

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

    【讨论】:

    • 我在看类似的东西,当我增加 SO_SNDBUF 时,我丢失了数据包。就我而言,接收端是一个微控制器。我的理论是,当SNDBUF 很大时,处理器会等待一段时间让缓冲区填满,然后以突发模式发送多个。微控制器没有处理突发。当我将SNDBUF 减少到 1 时,数据包一生成就发送出去,并且微能够跟上各个数据包。
    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 2012-12-14
    • 1970-01-01
    • 2015-07-04
    • 2014-12-16
    • 1970-01-01
    • 2015-11-09
    • 1970-01-01
    相关资源
    最近更新 更多