我在两台具有 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_MONOTONIC
的 clock_gettime()
来测量挂钟时间。
其次,在 write()
返回后,数据不一定已发送到网络 - 只是复制到内核缓冲区以供发送。这将在连接开始时为您提供更高的报告传输速率。
关于c - 为什么这个 C 程序报告的吞吐量比 nload 高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684623/