我使用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。
答案 0 :(得分:3)
首先,clock()
返回程序使用的 CPU时间的估计值,而不是挂钟时间 - 因此您的计算表明您每秒传输12GiB的CPU时间用过的。相反,请使用时钟ID为clock_gettime()
的{{1}}来衡量挂钟时间。
其次,在CLOCK_MONOTONIC
返回后,数据尚未被发送到网络 - 只是复制到内核缓冲区中进行发送。这将在连接开始时为您提供更高的报告传输速率。
答案 1 :(得分:1)
检查read()的返回值n可能比BUFFSZ短。
编辑:oops,应该是write()。