This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/AM5728:UDP 丢包问题

Guru**** 2540720 points
Other Parts Discussed in Thread: AM5728

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/572047/linux-am5728-udp-packet-drop-issue

器件型号:AM5728

工具/软件:Linux

大家好、

(运行最新的 SDK 到目前为止的 ti-processor-sdk-linux-am57xx-evm-03.01.00.06)

我必须使用 UDP 来完成我的项目、我将在 AM5728 EVM 上测试 UDP 功能。

我的配置:AM5728通过千兆位电缆直接连接到 VM 中的主机 Linux PC。 我的主机应用程序以每秒500个数据包的速度(通过不同的端口)向 EVM 发送18KB 和13KB 数据包。 总传输速度为15.5Mb/s

接收器侧(EVM)在接收数据时没有问题、只是当用户输入(触摸屏、键盘、鼠标等)时、我会看到一个即时丢包。

我还看到少量的丢包、甚至只是启动"TOP"来监控 CPU 使用情况。 每百万个数据包中、它会丢弃80-100个数据包。

在没有任何用户输入或任何其他应用程序运行的情况下、UDP 每百万丢弃1或2个数据包。

问题:  

1) 1) 是否预计会发生、因为用户输入事件可能需要在系统上花费太多时间?  

2) 2) 如果我使用 UDP 中断/事件而不是 while ()、它会解决这个问题吗?

EVM 端的伪代码:  

main()
{
while (1){

如果((recv_len_1 = recvfrom (s1、buf1、BUFLEN_1、0、(struct sockaddr *)&si_Other_1、&slen_1))=-1)
裸片("recvfrom ()");
其他
readbuffer1();
如果((recv_len_2 = recvfrom (s2、buf2、BUFLEN_2、0、(struct sockadr *)&si_Other_2、&slen_2))=-1)
裸片("recvfrom ()");
其他
readbuffer2();
} 

空芯片(char * s)

镜;
退出(1);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    以太网专家已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    要回答您的问题、是的、用户输入总是会产生影响、我认为您还不需要从 while 循环中进行更改。 有许多后台守护程序会影响性能。  您使用 iperf 进行测试还是仅使用您显示的应用程序片段?

    我想看到几 个网络状态结果。 如果您可以随这些命令的结果附加一个文本文件、我假设您使用的是 eth0:

    ethtool -S eth0     

    CAT /proc/net/snmp

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢你的答复。

    我只使用我的测试应用。  

    以下是这些命令的文本文件。 希望他们能提供帮助。

    e2e.ti.com/.../1.txte2e.ti.com/.../2.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您发布控制台日志。

    我需要两件事。 一个是 RX DMA 溢出、这是由于 RX 描述符耗尽而丢弃的数据包、在这里不会发生这种情况。 第二个原因是网络堆栈可能由于各种原因而丢弃它们。 通常、调整网络堆栈缓冲有助于缓解这种情况。 调整网络堆栈不是驱动 程序设置,而是用户空间设置。 以下是一些命令、您可以尝试增大网络缓冲区大小以开始使用、对于您的产品、您必须为您的应用找到正确的设置。 如果这可以解决问题、请将此帖子标记为已验证的答案。

    sysctl -w net.core.netdev_max_backlog=20000

    sysctl -w net.ipv4.udp_mem='17565 87380 50331648'

    sysctl net.ipv4.udp_mem

    sysctl -w net.core.rmem_max=50331648

    sysctl net.core.rmem_max

    sysctl -w net.core.rmem_default=50331648

    sysctl -w net.ipv1.route.flush=1

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你。 这个解决方案解决了问题。 在更改这些参数后、我看不到任何数据包丢失。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉、使用触摸屏时仍然出现丢包问题。

    只有在我几秒钟没有触摸它之后、它才会发生。 如果我继续使用触摸屏、则只会出现一个丢包、不再出现丢包。

    我使用 iperf 进行了类似的测试、结果类似。 当我触摸屏幕时、我得到了单个丢包。


    您有什么想法吗?