2011-12-01 118 views
5

請問Linux內核的黑客,什麼是合理的緩衝區大小爲write(2)系統調用套接字或文件,性能明智嗎?很明顯,這是一些頁面大小,但哪一個?有關係嗎?什麼是「太小」和「太大」?套接字和文件建議的緩衝區大小

+0

任何小於128千字節,因爲這是適合默認情況下,發送隊列(除非你想玩setsockopt) 。 – Damon

+1

@Damon:我不確定「什麼」是正確的答案。緩衝區至少應該一致。 – Cartesius00

+0

默認情況下大部分時間都適用於大多數人(這是合理的假設編寫網絡堆棧的人不是完全白癡)。除非您經常需要發送大量數據(真的很大),並且對延遲有嚴格的限制,否則通常沒有理由打擾。只要是「合理」的大小,只要將其複製到發送緩衝區併發送,無論它是多少。如果不是全部適合,'write'將會寫得比你要求的要少(返回金額)。無論如何,它只是起作用。 – Damon

回答

7

取決於有多大的延遲,以對等關係,比方說你有100Mbps的連接,以及50毫秒的延遲,那麼你就可以計算出

100MBps * 0.050 sec/8 = 0.625MB = 625KB 

但在Linux 2.6中默認的窗口大小約爲110KB,這將限制了你的throught圍繞2.2MBps(110KB/0.050) 所以,要解決這個問題,你可以你setsockopt

int ret, sock, buf_size; 
sock = socket(AF_INET, SOCK_STREAM, 0); 
buf_size = 625*1024; 
ret = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&buf_size, sizeof(buf_size)); 
ret = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&buf_size, sizeof(buf_size)); 
相關問題