为什么这个C程序比nload报告更多的吞吐量?



我用10GibE在两台机器之间运行以下C程序;程序报告12Gib/s,而nload报告9.2Gib/s(更可信)。谁能告诉我,我在程序中做错了什么?

.
.
#define BUFFSZ (4*1024)
char buffer[BUFFSZ];
.
.
  start = clock();
  while (1) {
    n = write(sockfd, buffer, BUFFSZ);
    if (n < 0)
       error("ERROR writing to socket");
    if (++blocks % (1024*1024) == 0)
    {
      blocks = 0;
      printf("32Gib at %6.2lf Gib/sn", 32.0/(((double) (clock() - start)) / CLOCKS_PER_SEC));
      start = clock();
    }
  }

这是CentOs 6.0在Linux 2.6.32;Nload 0.7.3, GCC 4.4.4

首先,clock()返回程序使用的CPU时间的估计,而不是时钟时间-因此您的计算表明您正在传输每秒使用的12GiB CPU时间。相反,使用时钟ID为CLOCK_MONOTONICclock_gettime()来测量挂钟时间。

其次,在write()返回之后,数据不一定已经被发送到网络中——只是被复制到内核缓冲区中进行发送。这将在连接开始时为您提供更高的报告传输速率。

检查read() n的返回值是否小于BUFFSZ

编辑:哎呀,这应该是write().

相关内容

  • 没有找到相关文章

最新更新