维持一个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
--------------------- 作者:乱码特轻松 来源:CSDN 原文:https://blog.csdn.net/fox_hacker/article/details/41440561 版权声明:本文为博主原创文章,转载请附上博文链接!