高性能網絡編程(一):單台服務器並發TCP連接數到底可以有多少


常識一:文件句柄限制


在linux下編寫網絡服務器程序的朋友肯定都知道每一個tcp連接都要占一個文件描述符,一旦這個文件描述符使用完了,新的連接到來返回給我們的錯誤是“Socket/File:Can't open so many files”

這時你需要明白操作系統對可以打開的最大文件數的限制。

1進程限制

執行 ulimit -n 輸出 1024,說明對於一個進程而言最多只能打開1024個文件,所以你要采用此默認配置最多也就可以並發上千個TCP連接。

臨時修改:ulimit -n 1000000,但是這種臨時修改只對當前登錄用戶目前的使用環境有效,

系統重啟或用戶退出后就會失效。

重啟后失效的修改(不過我在CentOS 6.5下測試,重啟后未發現失效),編輯 /etc/security/limits.conf 文件, 修改后內容為:

  • soft nofile 1000000
  • hard nofile 1000000

永久修改:編輯/etc/rc.local,在其后添加如下內容:

  • ulimit -SHn 1000000

2全局限制

執行 cat /proc/sys/fs/file-nr 輸出 9344 0 592026,分別為:

  • 1. 已經分配的文件句柄數,
  • 2. 已經分配但沒有使用的文件句柄數,
  • 3. 最大文件句柄數。

但在kernel 2.6版本中第二項的值總為0,這並不是一個錯誤,它實際上意味着已經分配的文件描述符無一浪費的都已經被使用了 。
我們可以把這個數值改大些,用 root 權限修改 /etc/sysctl.conf 文件:

    • fs.file-max = 1000000
    • net.ipv4.ip_conntrack_max = 1000000
    • net.ipv4.netfilter.ip_conntrack_max = 1000000

 

 

常識二:端口號范圍限制?

操作系統上端口號1024以下是系統保留的,從1024-65535是用戶使用的。

 

  • 由於每個TCP連接都要占一個端口號,所以我們最多可以有60000多個並發連接?
  • 我想有這種錯誤思路朋友不在少數吧?(其中我過去就一直這么認為)

分析一下
如何標識一個TCP連接:
系統用一個4四元組來唯一標識一個TCP連接:{local ip, local port,remote ip,remote port}

好吧,我們拿出《UNIX網絡編程:卷一》第四章中對accept的講解來看看概念性的東西,

第二個參數cliaddr代表了客戶端的ip地址和端口號而我們作為服務端實際只使用了bind時這一個端口,

說明端口號65535並不是並發量的限制

server最大tcp連接數:(good!!!!!!!!)
server通常固定在某個本地端口上監聽,等待client的連接請求。

不考慮地址重用(unix的SO_REUSEADDR選項)的情況下,即使server端有多個ip,本地監聽端口也是獨占的

因此server端tcp連接4元組中只有remote ip(也就是client ip)和remote port(客戶端port)是可變的

因此最大tcp連接為客戶端ip數×客戶端port數對IPV4,不考慮ip地址分類等因素最大tcp連接數約為:2的32次方(ip數)×2的16次方(port數),也就是server端單機最大tcp連接數約為2的48次方。

 

本文小結

上面給出的結論都是理論上的單機TCP並發連接數,實際上單機並發連接數肯定要受硬件資源(內存)、網絡資源(帶寬)的限制,至少對我們的需求現在可以做到數十萬級的並發了,你的呢?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM