1. 端口号限制?
首先,不存在由于端口号限制 65535 个的说法,因为目标端的ip和端口是无限的。
当然, Linux 对可使用的端口范围是有具体限制的,具体可以用如下命令查看:
[root]# cat /proc/sys/net/ipv4/ip_local_port_range
1024 65000
这个限制可以 vim /etc/sysctl.conf 这个文件进行修改,我们在这个文件里添加一行记录:
net.ipv4.ip_local_port_range = 60000 60009
保存好后执行 sysctl -p /etc/sysctl.conf 使其生效。
2. 文件描述符的限制?
系统级:当前系统可打开的最大数量,通过 cat /proc/sys/fs/file-max 查看
用户级:指定用户可打开的最大数量,通过 cat /etc/security/limits.conf 查看
进程级:单个进程可打开的最大数量,通过 cat /proc/sys/fs/nr_open 查看
[root ~]# cat /proc/sys/fs/file-max
100000
[root ~]# cat /proc/sys/fs/nr_open
100000
[root ~]# cat /etc/security/limits.conf
...
* soft nproc 100000
* hard nproc 100000
修改单个进程可打开的最大文件描述符限制为100,可以这样:
echo 100 > /proc/sys/fs/nr_open
理论上文件描述符可以设置的足够大。
3. 线程数的限制?
每建一个TCP连接就创建一个线程的方式,是最传统的多线程并发模型,早期的操作系统也只支持这种方式。
C10K 问题: 当服务器连接数达到 1 万且每个连接都需要消耗一个线程资源时,操作系统就会不停地忙于线程的上下文切换,最终导致系统崩溃。
但是:
现在的操作系统都支持 IO 多路复用的方式,简单说就是一个线程可以管理多个 TCP 连接的资源,这样就可以用少量的线程来管理大量的 TCP 连接了。
4. 内存的限制?
这个错误叫内存溢出,每个TCP连接本身,以及这个连接所用到的缓冲区,都是需要占用一定内存的
5. CPU的限制?
6. 总结一下,创建tcp连接需要的资源:
网友评论