對於套接字服務器,保持1000個tcp連接打開的成本是多少,但實際上只有少數客戶端正在通信?我正在使用基於單線程輪詢/選擇的服務器。另外,linux內核的最大開放套接字限制是多少(plz不給conf文件建議,我想要理論上的限制)?保持1000個tcp連接打開,儘管實際通信很少(10/20)
回答
主要的成本要高得多(典型的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數量還有其他內在限制。當然你可以配置內核來限制這個數量(以避免所有的內核內存進入套接字緩衝區;-)。
費用:socket fd;內核對應的數據結構; TCP連接元組(protocol; source:port; destination:port)及其數據結構;套接字發送和接收緩衝區;以及代碼中用於跟蹤連接的數據結構。
限取決於您的配置,但它通常比1000
由於插座可用文件描述符,極限不能超過打開文件的最大數量,您可以通過
#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
。我不知道其他平臺。
- 1. 保持打開的連接TCP/IP
- 2. 保持TCP連接打開,直到斷開連接Android
- 3. 支持1000個連接的多少個Azure實例
- 4. 保持mysql連接打開
- 5. WCF tcp連接在進程死亡時保持打開狀態
- 6. Tcp連接保持活着
- 7. ChannelFactory.CreateChannel()是否實際打開連接?
- 8. IOS 9當設備連接到wifi時保持TCP連接打開lte
- 9. 無法打開TCP連接
- 10. Java保持持續的TCP連接
- 11. 創建一個TCP套接字連接並保持連接在多個視圖中打開
- 12. gmail如何保持打開連接?
- 13. 保持SYSDBA連接在C++中打開
- 14. 保持數據庫連接打開?
- 15. 快速保持連接打開?
- 16. iOS:保持Http連接打開
- 17. 蜻蜓8.1保持連接打開
- 18. 從網絡斷開連接時保持Oracle連接打開
- 19. 3g連接的開銷是多少以保持套接字打開無限期
- 20. 保持數據庫連接打開 - 良好實踐?
- 21. IPC:爲每個請求連接或保持套接字打開?
- 22. 通過ajax調用保持數據庫連接打開
- 23. TCP連接劫持
- 24. 很少使用的貓鼬連接(保持活躍?)
- 25. 谷歌雲HTTP(S)負載平衡器保持TCP連接打開多久?
- 26. C#應該在連接池中保持打開連接
- 27. 連接池應該比保持連接打開慢得多嗎?
- 28. 保持一個連接爲每個客戶端打開php
- 29. 立即刪除數據庫,儘管打開連接
- 30. SqlFunction無法打開,儘管DataAccessKind.Read背景連接目前
thx的細節。所以它的記憶..呃?內核內存可交換?因爲在我的情況下,如果未使用的conxns的套接字緩衝區被換出,直到它們從另一端收到信號或其他東西,它將會有所幫助。我不確定內核是如此設計的。 – Seeker 2010-07-04 06:43:30
@Seeker,AFAIK,內核內存不可插拔(但也許有一些實驗性的內核,你可以嘗試這種改變?),因爲在需要時它幾乎是實時需要的 - 而硬頁面錯誤很容易意味着不幸的內存訪問可能會比平常長40,000倍。 – 2010-07-04 14:50:56