2011-10-07 50 views
1

我使用10GibE在兩臺機器之間運行以下C程序;該程序報告12Gib/s,而nload報告(更可信)9.2Gib/s。任何人都可以告訴我我在做什麼錯誤的程序?這個C程序爲什麼報告比nload更多的吞吐量?

. 
. 
#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

難道是你的程序正在測量吞吐量*進入*系統緩衝區和nload是測量它的整個* out *? – spraff

+0

@spraff你的評論是真實的,如果套接字在非阻塞模式下打開。 – crazyjul

+0

@Fixee你能提供socket的開放代碼嗎? – crazyjul

回答

3

首先,clock()返回由程序,而不是掛鐘時間使用的CPU時間的估計 - 所以你的計算表​​明您每CPU時間秒使用傳送12GiB。相反,使用clock_gettime()和時鐘ID CLOCK_MONOTONIC來測量掛鐘時間。

其次,write()返回後,數據不一定已發送到網絡 - 只是複製到內核緩衝區發送。這會在連接開始時爲您提供更高的報告傳輸速率。

+0

更改爲'clock_gettime()'使程序報告正確的吞吐量。 – Fixee

1

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

編輯:哎呀,那應該是寫()。