我用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_MONOTONIC
的clock_gettime()
来测量挂钟时间。
其次,在write()
返回之后,数据不一定已经被发送到网络中——只是被复制到内核缓冲区中进行发送。这将在连接开始时为您提供更高的报告传输速率。
检查read() n的返回值是否小于BUFFSZ
编辑:哎呀,这应该是write().