[轉]linux下TCP鏈接佔用的資源

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

一個tcp鏈接須要:1,socket文件描述符;2,IP地址;3,端口;4,內存java

TCP鏈接的四元組:源IP 源端口 目標IP 目標端口,這四元組構成了一個惟一的tcp鏈接。linux

對於一臺服務器,咱們假設只有一個網卡,那麼就對應一個惟一的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萬鏈接的,固然,咱們也能夠經過增長內存的方式增長併發量。socket

網上也有人作過相關試驗,程序接收1024000個鏈接,共消耗7,5G內存,即每一個鏈接消耗在8K左右。tcp

參考: http://www.blogjava.net/yongboy/archive/2013/04/11/397677.html
---------------------
做者:亂碼特輕鬆
來源:CSDN
原文:https://blog.csdn.net/fox_hacker/article/details/41440561
版權聲明:本文爲博主原創文章,轉載請附上博文連接!學習

相關文章
相關標籤/搜索