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

标签 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。

最佳答案

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

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

关于c - 为什么这个 C 程序报告的吞吐量比 nload 高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684623/

相关文章:

c++ - 使用 epoll 边缘触发时套接字上的数据过多

c - 忽略文件 lib.a,文件是为存档构建的,不是被链接的体系结构 (x86_64)

c - 如何打印图形的路径(c 编程)

algorithm - 在伪代码中使用动态二维数组或 HashMap ?

c# - 如何在单帧期间检查互联网可用性?

sockets - 如何使用单线程在 TCP 上实现全双工 channel ?

c++ - 关于sizeof用法的问题

c - "continue"到底是什么作用?

networking - Golang使用sftp golang库将远程文件复制到本地文件夹

c# - 通过套接字作为HTTP服务器正确接收请求数据