1. 程式人生 > >linux下TCP連線佔用的資源

linux下TCP連線佔用的資源

維持一個tcp連線需要佔用哪些資源,下面就總結一下最近學習的內容,不足之處,請讀者多多指正。

一個tcp連線需要:1,socket檔案描述符;2,IP地址;3,埠;4,記憶體

TCP連線的四元組:源IP 源埠 目標IP 目標埠,這四元組構成了一個唯一的tcp連線。

對於一臺伺服器,我們假設只有一個網絡卡,那麼就對應一個唯一的IP地址,而監聽埠,我們可以在1024-65535之間任選一個。通過這個監聽埠,我們接收來自客戶端的連線請求。那麼,它的IP、埠已經確定了,下面就是討論socket檔案描述符合記憶體了。

對於檔案描述符fd,每個tcp連線佔用一個,那麼一個檔案描述符下的檔案大約佔1K位元組,而核心對這塊也有說明,檔案描述符建議最多佔用10%的記憶體,如果是8G記憶體,那麼就相當於800M即80000,80萬個檔案描述符,當然,這個資料也可以通過linux引數調優進行調節,我在之前的一篇章節中也有討論到,請大家參考:http://blog.csdn.net/fox_hacker/article/details/41148115

而對於記憶體,tcp連線歸根結底需要雙方接收和傳送資料,那麼就需要一個讀緩衝區和寫緩衝區,這兩個buffer在linux下最小為4096位元組,可通過cat /proc/sys/net/ipv4/tcp_rmem和cat /proc/sys/net/ipv4/tcp_wmem來檢視。所以,一個tcp連線最小佔用記憶體為4096+4096 = 8k,那麼對於一個8G記憶體的機器,在不考慮其他限制下,最多支援的併發量為:8*1024*1024/8 約等於100萬。此數字為純理論上限數值,在實際中,由於linux kernel對一些資源的限制,加上程式的業務處理,所以,8G記憶體是很難達到100萬連線的,當然,我們也可以通過增加記憶體的方式增加併發量。

網上也有人做過相關試驗,程式接收1024000個連線,共消耗7,5G記憶體,即每個連線消耗在8K左右。

參考: http://www.blogjava.net/yongboy/archive/2013/04/11/397677.html