本帖最后由 ye1234567 于 2023-12-2 15:38 编辑
1,iPerf 与JPerf
在开始讲解网络测速之前,让我们先来了解下测速的利器:iPerf。这个工具可不仅仅局限于Windows、Linux、Mac、Android或iOS等平台,它可是个全能的网络性能测试专家。凭借其强大的功能,我们可以测试TCP和UDP(我们通常不对UDP进行测速)的带宽质量和最大TCP带宽。而且,它不仅可以根据不同的参数进行测试,还可以精准地报告带宽、延迟抖动以及数据包丢失的情况。这使得我们能够利用iPerf来评估各种网络设备如路由器、防火墙、交换机的性能。 虽然iPerf非常实用,但对于那些不熟悉命令行的人来说,可能会觉得有些困难。幸运的是,还有一款名为JPerf的图形界面程序,它极大地简化了原本复杂的命令行参数构造。而且,JPerf还具备保存测试结果并将结果实时图形化的功能,使得结果更加直观易懂。当然,作为iPerf的完美搭档,JPerf同样拥有iPerf的所有功能。该软件下载地址是:https://iperf.fr/iperf -download.php。如下图所示。
双击上图"jperf.bat"文件即可打开JPerf软件。 2,测试网络速度 正点原子最新发布的lwIP例程中,提供两个测试网络速度的例程,它们分布用作于裸机测试和freeRTOS测试,例程如下所示。
这些实验都是使用了lwIP提供的lwiperf源代码实现的,实际上它是一个简单的性能测量客户端/服务器,用于检测PHY芯片的收发带宽。我们根据收发的带宽来计算网络速度是多少?以YT8512C或LAN8720A这两款PHY芯片为例,它们都支持10Mbps和100Mbps,如果将其换算成MB/s,那么就是1.25MB/s和12.5MB/s(MB/s单位非常常见,我们日常生活中软件下载速度的单位就是MB/s、KB/s或者B/s)。 下面作者以裸机例程为例,将代码下载到对应的正点原子开发板中,然后在“server address”文本框中输入DHCP获取成功的IP地址,然后按下“Run IPerf”按键测试收发带宽。如下图所示。
从上图可以看到,此次测试的带宽为94831Kbits/sec左右,换算成Mbits/sec单位为94.831Mbits/sec(约等于95Mbps (Mbps = Mbit/s)),接着把94.831Mbits/sec换算成MB/s(下载速度=宽带值/8),即11.853875MB/s(这个值已经接近12.5MB/s了)。 3,提高LwIP 网络传输的速度 如果按照lwIP默认的配置,是不可能达到我们实验所显示的速度的,因为还没有进行优化,因此肯定也是不稳定的。下面我们来看看优化的参数。首先,网速必然受限于硬件,只有硬件很好,软件才能优化得更好。网卡肯定需要选择好一点的网卡。然后,在工程中的stm32f4xx_hal_config.h文件中配置以太网发送和接收的缓冲区大小,默认是4,我们可以稍微改大一点,具体见以下代码。 - #define ETH_TX_DESC_CNT 5U //以太网TX描述符,代表有多少个发送队列
- #define ETH_RX_DESC_CNT 5U //以太网RX描述符,代表有多少个接收队列
复制代码此外,还需在lwipopts.h 文件中配置lwIP 的参数,具体见下述代码。首先,我们需要为LwIP管理的内存分配较大的空间。当发送数据存储在ROM 或静态存储区时,我们还需要将MEMP_NUM_PBUF 宏定义的值调大一些。当然,发送缓冲区大小和发送缓冲区队列长度决定了发送速度的大小,这需要根据不同的需求进行配置,并可能需要进行不断的调试。对于接收数据的配置,我们应该设定TCP 缓冲队列中的报文段数量以及TCP 接收窗口大小,特别是接收窗口的大小,因为它可以直接影响数据的接收速度。 - /* 内存堆heap 大小 */
- #define MEM_SIZE (30*1024)
- /* memp 结构的pbuf 数量, 如果应用从ROM 或者静态存储区发送大量数据时
- 这个值应该设置大一点 */
- #define MEMP_NUM_PBUF 25
- /* 最多同时在TCP 缓冲队列中的报文段数量 */
- #define MEMP_NUM_TCP_SEG 150
- /* 内存池大小 */
- #define PBUF_POOL_SIZE 65
- /* 每个pbuf 内存池大小 */
- #define PBUF_POOL_BUFSIZE 1524
- /* 最大TCP 报文段,TCP_MSS = (MTU - IP 报头大小- TCP 报头大小 */
- #define TCP_MSS (1500 - 40)
- /* TCP 发送缓冲区大小(字节) */
- #define TCP_SND_BUF (11*TCP_MSS)
- /* TCP 发送缓冲区队列的最大长度 */
- #define TCP_SND_QUEUELEN (8* TCP_SND_BUF/TCP_MSS)
- /* TCP 接收窗口大小 */
- #define TCP_WND (30*TCP_MSS)
复制代码 当然,除了这些配置之外,为了让整个LwIP能够高速平稳地运行,还需要进行其他优化。例如,我们应该使用中断的方式接收数据,这样就可以省去CPU查询数据的操作。另外,我们应该增大内核邮箱的容量,这样在接收到数据之后,就可以顺利地将数据投递给内核,而不会因为无法投递而阻塞。同时,内核线程的优先级应该设置得更高一些,以便及时处理这些数据。 此外,我们也可以独立使用一个新的发送线程。这样,内核就不需要调用底层网卡函数,可以专心处理数据。发送数据的事情则交由发送线程去处理。同时,在处理数据的时候,应该避免使用串口打印信息,因为串口是一个速度较慢的外设。 关于提高LwIP网络传输的速度,还有很多方面需要优化,这也跟具体的使用环境有关系,不能一概而论。这里只是给出一些优化方向,具体怎么实现还需要大家亲身实践去调试。
|