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.

[参考译文] RTOS/AM4376:TCP/IP 性能

Guru**** 2942080 points

Other Parts Discussed in Thread: AM4376

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/662061/rtos-am4376-tcp-ip-performance

器件型号:AM4376

工具/软件:TI-RTOS

您好!

我们正在开发基于 AM4376处理器的产品。 对于我们的产品、网络传输速率至关重要。
我们对处理器上的 Linux 操作系统进行了一些测试、达到了1G 之外的340Mbps (每秒位数)速率。 (TCP 连接)
然后、我们尝试使用 TI RTOS 以获得更好的速率、但是、在调整缓冲区大小后、我们可以实现的最大 TCP 速率为170Mbps (是 Linux 的一半)
我们最能提高传输速率、因为 这一千兆以太网通道中的高帧传输流量。
这是 RTOS 预期的合理速率吗? 如何提高 TCPIP 驱动程序的效率?
谢谢  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Pascal、您好!

    您能否详细说明对 TCP 吞吐量进行基准测试的过程? 您使用的是哪种软件(EMAC 驱动程序、应用程序)? 和
    您是否在 TI AM437x 平台(IDK 或 Starterkit)上获得相同的性能?

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

    所有测试均在 Starterkit 上完成。
    基本上、我使用了 NIMU_BasicExample_skAM437x_armExampleproject、除此之外、我添加了我的基准测试应用程序-类似于 Linux。
    我使用内置的守护程序来侦听 TCP 连接。 PC 程序连接到 SK、然后请求数据。
    我返回的数据是一个~1M 字节的缓冲区。 我连续执行该操作大约100次、然后计算所花费的时间。
    谢谢!
    来源:

    /*
    * FGComM.c
    *
    *创建日期:2018年1月31日
    * 作者:shaise
    *

    #include
    #include <_stack.h>

    /* UART 头文件*/
    #include
    #include


    #define FGCOMM_PORT 9999
    #define FG_LOG UART_printf
    #define ETH_PORT 1

    静态句柄 hFgComm;
    int FgCommProcess (socket s,socket (* cbfn)(PSA));

    int StartComm (空)

    IPN IpAddr;

    if (!NtIfIdx2Ip (ETH_port,&IpAddr))
    return(-1);
    hFgComm = DemonNew (sock_stream、IpAddr、FGCOMM_port、(int (*)(socket、uint32)) FgCommProcess、
    OS_TASKPRIHIGH、OS_TASKSTKNORM、0、2);
    FG_log ("\nFG 通信协议已启动。\n");
    返回0;


    空 NetPrintIPN( IPN ipaddr )

    ipaddr = htonl (ipaddr);
    FG_log ("%d.%d.%d.%d"、
    (uint8)((ipaddr>>24)&0xFF)、(uint8)((ipaddr>16)&0xFF)、
    (uint8)((ipaddr>>8)&0xFF),(uint8)(ipaddr&0xFF));



    int FgCommProcess (socket s、socket (* cbfn)(PSA))

    int optval = 1;
    int frame_size = 1280*128;
    char *帧=(char *) mmBulkAlloc (frame_size);
    struct sockaddr_in peer_addr;
    int cmd32、len32;

    if (setsockopt (s、SOL_socket、SO_REUSEADDR、(char*)&optval、sizeof (optval))< 0)
    FG_log ("setsockopt (SO_REUSEADDR) failed");
    if (setsockopt、IPPROTO_TCP、tcp_NODELAY、(char*)&optval、sizeof (optval))< 0)
    FG_log ("setsockopt (tcp_NODELAY) failed");

    FG_log ("FGComm 连接已建立。 客户:");
    getpeername (s、(struct sockaddr *)&peer_addr、&len32);
    NetPrintIPN (peer_addr.sin_addr.s_addr);
    FG_log ("\n");


    对于(;)

    if (recv (s、(char *)&cmd32、4、0)< 0)

    中断;

    if (recv (s、(char *)&len32、4、0)< 0)

    中断;


    //fG_log ("接收到的命令:%d、长度:%d\n"、cmd32、len32);

    len32 = frame_size;
    如果(send、(char *)&cmd32、4、0)< 0)
    中断;

    如果(send、(char *)&len32、4、0)< 0)
    中断;

    //如果(len >0){
    如果(发送、帧、长度32、0)< 0)
    中断;


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

    我注意到使用 PDK 中的 FTP 示例的类似 TCP 吞吐量、已提交 JIRA 来跟踪项目。 您是否对项目中的基准有任何硬性要求?

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

    您好、 Garrett

    如果可能、我们希望达到至少500Mbps。

    此致、
    Pascal

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

    很抱歉更新太晚了。 计划在下一个 PROCESSOR-SDK_05.00.00版本中解决 TCP 吞吐量问题。 我们正在尝试对 JIRA 进行优先级排序、并在修复可用时检查是否可以通过 git 存储库提前提供修复。

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

    您好、Garrett

    原型板应尽快投入生产。

    请 尽最大努力获取早期版本。

    此致

    Pascal

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

    Pascal、

    我们正在积极地处理这一问题。 我们已经比较了 AM437x IDK 和 GP EVM 上的 TCP 吞吐量结果、并使用 EMAC 驱动器对原始数据包吞吐量和 CPU 负载进行基准测试、以检查是否需要 NDK/NIMU 级别调优。

    此致、Garrett

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

    Garrett

    我明白这个问题并不容易。

    再次感谢。

    Pascal

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

    您能否尝试以下操作来查看您的设置中的吞吐量是否也在增加?
    1) 1)使用增强型无复制套接字、请参阅 spru524j.pdf 中的 F.2部分、您基本上需要将 TCP 套接字流类型从 SOCK_STREAMNC 更新为 SOCK_STREAMNC、将 recv()更新为 recvnc ()、并将 SEND ()更新为 sendnc ()。

    2)更新 PDK transport 中的描述符数量\ndk\Nimu\src\v4\cpsw_Nimu_eth.c。(您可以重建 NIMU 库或在 CCS 工程中添加文件)
    open_cfg.num_for_rx_pkt_desc = 256;
    open_cfg.num_for_TX_pkt_desc = 256;

    3) 3)您的"调整缓冲器大小"是否如下所示?
    global.pktNumFrameBufs=384;
    tcp.transmitBufSize = 65536;
    tcp.receiveBufSize = 65536;
    tcp.receiveBufLimit=65536;

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

    您好、Garrett

    我尝试测试您的解决方案以加快网络速度、但由于以下原因、我无法使其正常工作:
    要使用'sendnc'、我需要使用'getsendncbuff'预分配缓冲区。 此函数接受一个套接字和一个缓冲器长度。 但是、由于以下两个原因、此函数始终返回错误:
    缓冲区大于 MTU (我们使用1Mbyte 发送缓冲区)
    2.该功能仅在原始以太网插槽上工作,但“接受”功能返回标准插槽。 (即使 Listen 套接字是 SOCK_STREAMNC)
    也许我做了一些错误、所以如果有一个与 SOCK_STREAMNC 一起工作的简单代码示例、请告知我们。
    此致
    Pascal

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

    我们主要关注 Rx 基准测试,您在使用 recvnc()和保持 send()时是否看到吞吐量提高?

    以下代码示例基于 PDK FTP 服务器代码、无需复制 API 即可进行更新。

    静态 int32_t func_port (io_handler_t * IOH){
    IOH->DATA_SOCKET = SOCKET (AF_iNet、SOCK_STREAMNC、IPPROTO_TCP);

    int32_t ftp_filerout_write (io_handler_t * IOH、char *路径){
    //bytesRead = recv (IOH->DATA_Socket、IOH->DataBuf、DATA_buffer_size、0);
    字节 READ =(int)recvnc (IOH->data_socket,(void**)&pBuf,0,&hBuffer);
    //uart_printf ("bytesRead:%d\n"、bytesRead);

    如果(bytesRead >0)

    recvncfree (hBuffer);
    //Task_yield ();


    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Garrett
    感谢您的回复。
    我们更关注提高传输速度(将大帧从 TI ARM 发送到计算机)。
    如果发现问题、我们将继续进行测试和报告。
    此致
    Pascal