C套接字编程:最大化localhost上的吞吐量/带宽(我只获得3 Gbit / s而不是23GBit / s)

我想创建一个C服务器/客户端,通过我的localhost上的TCP套接字通信最大化吞吐量.作为准备,我使用iperf来了解i7 MacBookPro上的最大带宽.

------------------------------------------------------------
Server listening on TCP port 5001
TCP window size:  256 KByte (default)
------------------------------------------------------------
[  4] local 127.0.0.1 port 5001 connected with 127.0.0.1 port 51583
[  4]  0.0-120.0 sec   329 GBytes  23.6 Gbits/sec

没有任何调整,ipref告诉我,我可以达到至少23.2 GBit / s.然后我做了我自己的C服务器/客户端实现,你可以在这里找到完整的代码:https://gist.github.com/1116635

我的代码我基本上每次读/写操作传输一个1024bytes的int数组.所以我在服务器上的发送循环如下所示:

   int n;

   int x[256];

   //fill int array
   for (int i=0;i<256;i++)
   {
       x[i]=i;
   }

   for (int i=0;i<(4*1024*1024);i++)
   {
       n = write(sock,x,sizeof(x));
       if (n < 0) error("ERROR writing to socket");
   }

我在客户端上的接收循环如下所示:

int x[256]; 

for (int i=0;i<(4*1024*1024);i++)
{
    n = read(sockfd,x,((sizeof(int)*256)));
    if (n < 0) error("ERROR reading from socket");
}

正如在标题中提到的,运行它(使用-O3编译)会导致以下执行时间大约为3 GBit / s:

./client 127.0.0.1 1234
Elapsed time for Reading 4GigaBytes of data over socket on localhost: 9578ms

我在哪里松开带宽,我做错了什么?再次,完整的代码可以在这里看到:https://gist.github.com/1116635

任何帮助表示赞赏!

最佳答案
我之前的回答是错误的.我测试了你的程序,结果如下.

>如果我运行原始客户端,我会得到0m7.763s
>如果我使用4倍大的缓冲区,我得到0m5.209s
>使用原始缓冲区8次,我得到0m3.780s

我只改变了客户端.我怀疑如果你也改变了服务器,可以挤压更多的性能.

事实上,我得到的结果与你完全不同(0m7.763s vs 9578ms)也表明这是由执行的系统调用次数引起的(因为我们有不同的处理器……).要挤出更多性能:

>使用scater-gather I / O(readv和writev)
>使用零拷贝机制:splice(2),sendfile(2)

转载注明原文:C套接字编程:最大化localhost上的吞吐量/带宽(我只获得3 Gbit / s而不是23GBit / s) - 代码日志