我们正在开发一个基于Cyclone V的定制板,它是一个运行嵌入式Linux内核3.10-LTSI的FPGA+ARMSOC。我们的预期应用是通过TCP千兆位以太网将大量原始数据存储在内存中,在50-400 MB的范围内,发送到在Windows 7上运行的Java客户端。iperf显示,我们的板的tcp吞吐量在6xxmbit/s的范围内。问题:1.我们有一个要求,我们需要在一定的时间间隔内发送原始内存数据。那么,对于我们的案例,衡量吞吐量的正确方法是什么?目前我们只是用gettimeofday包装发送代码,如下所示:int total_sent = 0, bytes_sent = 0;gettimeofday(&t0, 0);for (total_sent = 0; total_sent < data_size;) { bytes_sent = write(conn_fd, buf + total_sent, data_size - total_sent); if (bytes_sent == -1) break; total_sent += bytes_sent;}gettimeofday(&t1, 0);unsigned long elapsed_us = (t1.tv_sec - t0.tv_sec) * 1000000 + t1.tv_usec - t0.tv_usec;double elapsed_s = (double)elapsed_us / 1000000;printf("Throughput: %f Mbit/s\n", img_size * 8 / elapsed_s / 1000000);printf("Total bytes sent: %d\n", total_sent);这是测量吞吐量的正确方法吗?2.是否可以通过两个以太网端口增加吞吐量?类似于将原始数据分成两部分并通过两个端口发送。3.在我们的情况下,提高吞吐量的最佳方法是什么?我们希望达到的最大吞吐量是1024mbit/s。 最佳答案 有几点意见:getTimeOfDay()系统调用的开销扭曲了度量。确保以太网端口驱动程序已启用NAPI。如果您想要最大吞吐量,请尝试将副本设置为零。如果您一直使用TCP,也许可以使用vmsplice()执行某些操作(请参见:vmsplice() and TCP)。为了获得最好的结果,转储TCP,使用一个带选项的包套接字( >),并实现可靠的UDP协议(例如,对于Win 7对等点的Java实现)。祝你好运关于c - 测量并提高千兆位以太网吞吐量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27540014/
10-12 00:33