對於套接字服務器,保持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. 支持1000個連接的多少個Azure實例
- 2. 保持mysql連接打開
- 3. WCF tcp連接在進程死亡時保持打開狀態
- 4. ChannelFactory.CreateChannel()是否實際打開連接?
- 5. IOS 9當設備連接到wifi時保持TCP連接打開lte
- 6. Java保持持續的TCP連接
- 7. 保持SYSDBA連接在C++中打開
- 8. 蜻蜓8.1保持連接打開
- 9. 3g連接的開銷是多少以保持套接字打開無限期
- 10. 保持數據庫連接打開 - 良好實踐?
- 11. IPC:爲每個請求連接或保持套接字打開?
- 12. 通過ajax調用保持數據庫連接打開
- 13. TCP連接劫持
- 14. 谷歌雲HTTP(S)負載平衡器保持TCP連接打開多久?
- 15. 連接池應該比保持連接打開慢得多嗎?
- 16. 保持一個連接爲每個客戶端打開php
- 17. SqlFunction無法打開,儘管DataAccessKind.Read背景連接目前
- 18. 打開持續連接
- 19. 打開一個MySQL連接vs打開和關閉很多連接?
- 20. 在Windows Phone 7中打開TCP連接
- 21. 連接到任何URL:java.io.IOException TCP打開
- 22. 如果FF打開TCP連接49
- 23. 如何在PHP中打開TCP連接
- 24. 打開一個ssh連接並在啓動時保持打開狀態
- 25. libcurl - 保持連接「打開」上傳多個文件(FTP)
- 26. MYSQL /打開和關閉連接或保持每個瀏覽器用戶打開一個連接?
- 27. 管理多個/多個TCP連接
- 28. Facebook連接什麼信息實際上給開發者
- 29. 有關TCP連接和TCP的查詢保持活動狀態?
- 30. 春季DriverManagerDataSource打開了很多連接?
thx的細節。所以它的記憶..呃?內核內存可交換?因爲在我的情況下,如果未使用的conxns的套接字緩衝區被換出,直到它們從另一端收到信號或其他東西,它將會有所幫助。我不確定內核是如此設計的。 – Seeker 2010-07-04 06:43:30
@Seeker,AFAIK,內核內存不可插拔(但也許有一些實驗性的內核,你可以嘗試這種改變?),因爲在需要時它幾乎是實時需要的 - 而硬頁面錯誤很容易意味着不幸的內存訪問可能會比平常長40,000倍。 – 2010-07-04 14:50:56