一、关于tcp连接
当一个进程需要与远程建立tcp连接时,需要找os申请,这时,需要4个信息:
源ip,源端口,目标ip,目标端口
如:123.126.45.68,(),110.242.68.3,80
其中源端口由os分配一个可用的数字(0-65535),最后os会返回给进程一个文件描述符,如:5,后面进程与目标进行通信时,对着文件描述符读写就好了。
二、端口号
一直重复上述过程,直到connect cannot assign requested address,表示端口号不够用了。
问题:此时一共创建了63977个tcp连接,但端口号是16位的,原则上可以创建65535个tcp连接,为什么就不够用了呢?
原因:linux对可使用的端口进行限制,可以用cat /proc/sys/net/ipv4/ip_local查看,显示1024 65000。可以通过在/etc/sysctl.conf中进行修改,增加一行net.ipv4.ip_local_port_range = 60000 60009,再使用sysctl -p /etc/sysctl.conf使其生效,这样你就只有10个端口可用了
三、文件描述符
创建一个tcp连接,需要4个信息,但如果我换一个目标端口,则又可以建立一个新的tcp连接。
一直重复上述过程,直到socket too many open files,表示文件描述符不够了。因为一个tcp连接 ,就要分配一个socket,而linux对打开的文件描述符有三方面的限制:
1、系统级:当前系统可打开的最大数量,通过cat /proc/sys/fs/file-max查看
100000
2、用户级:当前用户可打开的最大数量,通过cat /etc/security/limits.conf查看
100000
3、进程级:当前进程可打开的最大数量,通过cat /proc/sys/fs/nr_open查看
soft nproc 100000
hard nproc 100000
可以使用echo 100 > /proc/sys/fs/nr_open去修改最大文件描述符的数量
四、线程
修改了文件描述符的数量后,继续创建tcp连接。但是发现,os创建tcp连接时,效率越来越低,原因是,每创建一个tcp连接,需要一个线程来提供服务,十多万个线程上下文切换,导致效率低下。
此时可以通过修改IO多路复用的方式,使用少量的线程来管理大量的socket连接。
五、内存
使用了IO多路复用,又快速的创建起tcp连接来,直到:out of memory,内存溢出。每个tcp连接本身,以及这个连接所用到的缓冲区,都要占用一定内存,此时内存已被占满
六、CPU
kill掉了一些用不到的进程,新腾出了内存空间,又快速的创建起tcp连接来,直到CPU占用率已经快到100%。此时进程已经完全卡顿,无法使用。

总结
每个tcp连接都需要:
1、内存资源
2、CPU资源
3、端口号资源
4、文件描述符资源
5、线程资源

容器 tcp 对外连接数 tcp连接数量_多路复用