2010-07-04 56 views
0

對於套接字服務器,保持1000個tcp連接打開的成本是多少,但實際上只有少數客戶端正在通信?我正在使用基於單線程輪詢/選擇的服務器。另外,linux內核的最大開放套接字限制是多少(plz不給conf文件建議,我想要理論上的限制)?保持1000個tcp連接打開,儘管實際通信很少(10/20)

回答

0

主要的成本要高得多(典型的TCP/IP協議棧的實現)是在發射和接收居住在內核內存緩衝區 - 推薦大小this好(如果可能過時)短文是socket buffer size = 2 * bandwidth * delay。因此,如果延遲爲100毫秒(ping時間,兩次延遲的往返行程爲200毫秒),並且帶寬大約爲千兆位/秒(爲了便於計算,稱它爲每秒100MB ;-),爲了獲得最佳性能,你需要每個套接字大約20 MB的套接字緩衝區大小(我沒有聽說過默認情況下沒有配置任何內核,但是你可以在打開套接字之前控制每個套接字的緩衝區大小......) 。

一個典型的套接字緩衝區大小可能是,比如256 KB;假設延遲時間爲100毫秒,對於高達5兆比特/秒的帶寬應該沒有問題 - 即使用該緩衝區大小和延遲時間,即使是中等質量的寬帶也不能充分利用帶寬連接(「長細管道」 - 大帶寬大延遲,所以他們的產品是相當大大 - 是臭名昭着難以充分利用)。無論如何,通過這種緩衝區大小,您可以通過保持1000個TCP套接字打開並連接(儘管無效)來佔用256 MB的內核內存。

我不認爲(至少在64位內核上)除了分配給內核(緩衝區所在的內存)的RAM數量還有其他內在限制。當然你可以配置內核來限制這個數量(以避免所有的內核內存進入套接字緩衝區;-)。

+0

thx的細節。所以它的記憶..呃?內核內存可交換?因爲在我的情況下,如果未使用的conxns的套接字緩衝區被換出,直到它們從另一端收到信號或其他東西,它將會有所幫助。我不確定內核是如此設​​計的。 – Seeker 2010-07-04 06:43:30

+0

@Seeker,AFAIK,內核內存不可插拔(但也許有一些實驗性的內核,你可以嘗試這種改變?),因爲在需要時它幾乎是實時需要的 - 而硬頁面錯誤很容易意味着不幸的內存訪問可能會比平常長40,000倍。 – 2010-07-04 14:50:56

0

費用:socket fd;內核對應的數據結構; TCP連接元組(protocol; source:port; destination:port)及其數據結構;套接字發送和接收緩衝區;以及代碼中用於跟蹤連接的數據結構。

限取決於您的配置,但它通常比1000

0

由於插座可用文件描述符,極限不能超過打開文件的最大數量,您可以通過

#include <sys/resource.h> 

struct rlimit limit; 
getrlimit(RLIMIT_NOFILE, &limit); 

/* limit.rlim_cur gives the current limit for the process. 
    This can be dynamically adjusted via setrlimit, with a maximum 
    of limit.rlim_max. They are likely equivalent already though. */ 
int max_no_files = limit.rlim_cur; 

此硬性限制獲得更多的可以調整,但如何取決於在什麼平臺上。 Linux有/etc/security/limits.conf。我不知道其他平臺。

相關問題