一百萬個併發TCP會話可能是困難的:如果你依賴於標準connect(2)
套接字API來創建功能,您要使用的物理內存很多:每個環節都需要一個struct inet_sock
,其中包括struct sock
,其中包括struct sock_common
。
我很快就猜到大小:struct sock_common
需要大約58個字節。 struct sock
需要大約278個字節。 struct inet_sock
需要大約70個字節。
這是387兆字節的數據之前,你有收到和發送緩衝區。 (對於某些信息,請參閱tcp_mem
,tcp_rmem
,tcp_wmem
在tcp(7)
。)
如果你選擇走這條路,我建議設定每個插槽的內存控制低,因爲他們去。如果4096是您設置的最低值,我不會感到驚訝。 (SK_MEM_QUANTUM
是PAGE_SIZE
,存儲到sysctl_tcp_rmem[0]
和sysctl_tcp_wmem[0]
。)
這就是內存另外八個千兆字節 - 四爲接收發送緩衝區緩存,四。
這就是除了系統需要您的程序打開一百萬個文件描述符。 (見/proc/sys/fs/file-max
在proc(5)
)
所有這些記憶是而非可交換 - 內核銷內存 - 所以你真的只有64位計算機上處理這個問題,至少8千兆字節記憶。大概10-12會做得更好。由Paketto Keiretsu tools採取
一種方法是打開原始連接,執行所有使用單個原始套接字的TCP三次握手,並嘗試計算什麼是需要的,而不是儲存,處理更大量的數據比平時。嘗試儘可能少地存儲每個連接,並且不要使用簡單的列表或結構樹。
的Paketto的Keiretsu工具上次在2003年左右更新,所以他們仍然可能無法擴展到上萬元的好,但他們肯定是我的出發點,如果這是我的問題解決了。
百萬*同時*連接? – thkala
您是否嘗試過['iperf'](http://sourceforge.net/projects/iperf/)工具? –
我不知道iperf在這種情況下會有幫助嗎? – nikhilelite