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

时间:2011-10-07 08:12:53

标签: c networking tcp centos benchmarking

我使用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/s\n", 32.0/(((double) (clock() - start)) / CLOCKS_PER_SEC));
      start = clock();
    }
  }

这是Linux 2.6.32上的CentOs 6.0; nload 0.7.3,gcc 4.4.4。

2 个答案:

答案 0 :(得分:3)

首先,clock()返回程序使用的 CPU时间的估计值,而不是挂钟时间 - 因此您的计算表明您每秒传输12GiB的CPU时间用过的。相反,请使用时钟ID为clock_gettime()的{​​{1}}来衡量挂钟时间。

其次,在CLOCK_MONOTONIC返回后,数据尚未被发送到网络 - 只是复制到内核缓冲区中进行发送。这将在连接开始时为您提供更高的报告传输速率。

答案 1 :(得分:1)

检查read()的返回值n可能比BUFFSZ短。

编辑:oops,应该是write()。