关注
鸿蒙技术社区
,回复
【鸿蒙】
送
价值
399元
的鸿蒙
开发板套件
(数量有限,先到先得)
,还可以
免费下载
鸿蒙
入门资料
!
👇
扫码
立刻关注
👇
专注开源技术,共建鸿蒙生态
在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白。那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题。
图片来自 Pexels
很多同学看到这个问题的第一反应是 65535。原因是:“听说端口号最多有 65535 个,那长连接就最多保持 65535 个了”。
是这样的吗?还有的人说:“应该受 TCP 连接里四元组的空间大小限制,算起来是 200 多万亿个!”
如果你对这个问题也是理解的不够彻底,那么今天讲个故事讲给你听!
TCP 连接四元组是源 IP 地址、源端口、目的 IP 地址和目的端口。任意一个元素发生了改变,那么就代表的是一条完全不同的连接了。
拿我的 Nginx 举例,它的端口是固定使用 80。另外我的 IP 也是固定的,这样目的 IP 地址、目的端口都是固定的。剩下源 IP 地址、源端口是可变的。
所以理论上我的 Nginx 上最多可以建立 2 的 32 次方(ip 数)×2 的 16 次方(port 数)个连接。这是两百多万亿的一个大数字!
进程每打开一个文件(Linux 下一切皆文件,包括 Socket),都会消耗一定的内存资源。
如果有不怀好心的人启动一个进程来无限的创建和打开新的文件,会让服务器崩溃。
所以 Linux 系统出于安全角度的考虑,在多个位置都限制了可打开的文件描述符的数量,包括系统级、用户级、进程级。
这三个限制的含义和修改方式如下:
-
系统级:
当前系统可打开的最大数量,通过 fs.file-max 参数可修改。
-
用户级:
指定用户可打开的最大数量,修改 /etc/security/limits.conf。
-
进程级:
单个进程可打开的最大数量,通过 fs.nr_open 参数可修改。
我的接收缓存区大小是可以配置的,通过 sysctl 命令就可以查看: