0
点赞
收藏
分享

微信扫一扫

linux 最多能创建多少个 TCP 连接?

蒸熟的土豆 2024-11-06 阅读 10

linux 最大允许TCP连接数


tcp连接四元组:源ip,源端口 <==> 目标ip,目标端口

连续对同一个目标ip及端口进行tcp连接的建立,最多建立的连接个数受服务器的端口范围限制


约束一:服务器的端口范围

ERROR: connect cannot assign requested address

linux对可使用端口范围限制

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

连续对同一ip端口建立连接,在服务器端口不够时,切换目标端口可以继续申请连接(只要四元组不重复即可)


约束二,服务器文件描述符限制

ERROR: socket too many open files

文件描述符不够用了

每一个tcp连接对应一个文件描述符

linux对可打开的文件描述符数量限制

# 系统级:当前系统可打开的最大数量
cat /proc/sys/fs/file-max
# 用户级:指定用户可打开的最大数量
cat /etc/security/limits.conf
# 进程级:单个进程可打开的最大数量
cat /proc/sys/fs/nr_open

修改单个进程可打开的最大文件描述符限制

echo 100 > /proc/sys/fs/nr_open

约束三:系统线程

在多线程并发模型下:每新建一个TCP连接都需要开启一个线程,当开启连接数量过多时,因为线程上下文切换而导致系统响应越来越慢

C10K 问题:当服务器连接数达到1万且每个连接需要消耗一个线程资源时,操作系统就会不停的忙于线程的上下文切换,导致系统崩溃

切换到IO多路复用模型


约束四:系统内存

ERROR: out of memory

每个TCP连接本身,以及连接所用到的缓冲区,都需要占用一定的内存

在系统内存足够大的情况下,最终也会因为大量TCP占用线程而导致CPU满载,从而达到瓶颈

总结

linux服务器开启最大TCP连接数?

首先在目标IP和端口固定的情况下,取决于系统对可开启端口范围的限制是多少

在端口范围最够大的情况下,取决于文件描述符的限制(三个级别:系统、用户、进程)

文件描述符限制足够大的情况下,取决于线程模型,如果是多线程模型,即一个TCP连接占用一个线程,那么可能会因为上下文切换而导致CPU满载

加入采用IO多路复用的情况下,仍然需要考虑系统内存是否足够支撑海量的TCP连接,因为每一个TCP连接会占用一些内存

最后如果系统内存也足够大,那么最终的瓶颈会是CPU的线程上下文切换,最终会导致系统卡死

举报

相关推荐

0 条评论