TCP连接应该有多少?? - 图1
image.png

TCP连接应该有多少?? - 图3
这个 5 表示文件描述符,linux 下一切皆文件,你待会和你那个目标 IP 进行 TCP 通信的时候,就对着这个文件描述符读写就好啦
TCP连接应该有多少?? - 图4

一 端口号

TCP连接应该有多少?? - 图5

  1. [root]# cat /proc/sys/net/ipv4/ip_local_port_range
  2. 1024 65000

TCP连接应该有多少?? - 图6
,建立一个 TCP 连接,需要将通信两端的套接字(socket)进行绑定,如下:源 IP 地址:源端口号 <——> 目标 IP 地址:目标端口号只要这套绑定关系构成的四元组不重复即可,刚刚端口号不够用了,是因为我一直对同一个目标IP和端口建立连接,那我换一个目标端口号试试。

二 文件描述符

TCP连接应该有多少?? - 图7

废话,你看看你都建了多少个TCP连接了!每建立一个TCP连接,我就得分配给你一个文件描述符,linux 对可打开的文件描述符的数量分别作了三个方面的限制。”
系统级:当前系统可打开的最大数量,通过 cat /proc/sys/fs/file-max 查看
用户级:指定用户可打开的最大数量,通过 cat /etc/security/limits.conf 查看
进程级:单个进程可打开的最大数量,通过 cat /proc/sys/fs/nr_open 查看

TCP连接应该有多少?? - 图8TCP连接应该有多少?? - 图9

  1. [root ~]# cat /proc/sys/fs/file-max
  2. 100000
  3. [root ~]# cat /proc/sys/fs/nr_open
  4. 100000
  5. [root ~]# cat /etc/security/limits.conf
  6. ...
  7. * soft nproc 100000
  8. * hard nproc 100000

TCP连接应该有多少?? - 图10

  1. echo 100 > /proc/sys/fs/nr_open

“原来如此,我这就去把各种文件描述符限制都改大一点,也不多,就在后面加个0吧”

三 线程

老操也忍不住了,”小进啊你还好意思说我,你知不知道你每建一个TCP连接都需要消耗一个线程来为你服务?现在我和CPU老大那里都忙得不可开交了,一直在为你这好几十万个线程不停地进行上下文切换,我们精力有限啊,自然就没法像以前那么快为你服务了。”
TCP连接应该有多少?? - 图11
你现在这种每建一个TCP连接就创建一个线程的方式,是最传统的多线程并发模型,早期的操作系统也只支持这种方式。但现在我进化了,我还支持 IO 多路复用的方式,简单说就是一个线程可以管理多个 TCP 连接的资源,这样你就可以用少量的线程来管理大量的 TCP 连接了。
TCP连接应该有多少?? - 图12

四 内存

TCP连接应该有多少?? - 图13
“这个错误叫内存溢出,每个TCP连接本身,以及这个连接所用到的缓冲区,都是需要占用一定内存的,现在内存已经被你占满了,不够用了,所以报了这个错。”
TCP连接应该有多少?? - 图14

五 CPU

“差不多了,我劝你就此收手吧,现在 CPU 的占用率已经快到 100% 了。”
TCP连接应该有多少?? - 图15