文件描述符限制
- 系统级别限制:操作系统会设置一个全局的文件描述符限制,控制整个系统能同时打开的最大文件数
- 用户级别限制:每个用户会有一个文件描述符的限制,控制这个用户能够同时打开的最大文件数
- 进程级别限制:每个进程也会有一个文件描述符的限制,控制单个进程能够同时打开的最大文件数
服务器 TCP 连接数量上限
一个服务端的 TCP 网络应用,理论上可以支持的最大连接数量是多少?
其中服务端 IP、服务端 Port 已经固定了 (就是监听的 TCP 程序),所以理论的连接数量上限就取决于 (客户端 IP * 客户端 Port) 的组合数量了。
当然如果服务端程序监听 1 ~ 65535 的所有端口号,理论的连接数量上限就变为:
当然实际情况下肯定达不到这样的上限数量,原因有三:
- IP 地址中有分类地址 (A, B, C 类)、内网地址、保留地址 (D, E 类),其中后两者无法用于公网通信
- 某些端口会被保留,仅供专门程序使用,例如 DNS (53), HTTPS (443)
- 服务器内存大小有上限,一个 TCP 套接字会关联内存缓冲区、文件描述符等资源
综上所述,一个服务端的 TCP 网络应用,可以支持的最大连接数量主要取决于其内存大小 (内核参数都已经调优的情况下)。
如何测试?
在测试设备不充足的情况下,如何测试百万连接数量场景?核心思路:突破 TCP 四元组限制即可。
- 客户端配置多个 IP, 这样每个 IP 地址就有大约 64K 个端口号可以使用,向服务端发起连接之前,绑定不同的 IP 地址 即可
- 服务端监听多个端口号,客户端只需要连接不同的服务端号口即可
too many open files
首先来看一个高并发场景下的 “经典问题”: too many open files, 产生这个问题的根本原因是: 短时间内打开大量网络 (文件) 连接,超过了操作系统对单个进程允许打开的文件描述符(file descriptor)数量限制。
想要单机支持 100 万链接,需要调优哪些参数呢?
解决方案
Soft open files 是 Linux 系统参数,影响系统单个进程能够打开最大的文件句柄数量。
表示单个进程同时最多只能维持 1024 个网络 (例如 TCP) 连接。
可以通过增大该参数,来支持更大的网络连接数量。
(1) 临时性调整
只在当前会话 (终端) 中有效,退出或重启后失效
(2) 永久性设置
修改配置文件 /etc/security/limits.conf:
运行 sysctl -p 命令生效,重启之后仍然有效。
(3) 其他设置
单个进程打开的文件描述符数量 不能超过 操作系统所有进程文件描述符数量 (/proc/sys/fs/file-max), 所以需要修改对应的值:
运行 sysctl -p 命令生效,重启之后仍然有效。
(4) 查看配置
Linux 内核参数调优
想要单机支持 100 万链接,除了刚才的 文件描述符数量 参数调优之外,还需要针对部分内核参数进行调优。
打开系统配置文件 /etc/sysctl.conf,增加 (或修改) 以下配置数据,参数名称及其作用已经写在了注释中。
运行 sysctl -p 命令生效,重启之后仍然有效。
注意事项
如果系统已经使用了参数 net.ipv4.tcp_syncookies, 参数 net.ipv4.tcp_max_syn_backlog 将自动失效。
客户端参数
当服务器充当 “客户端角色” 时 (例如代理服务器),连接后端服务器器时,每个连接需要分配一个临时端口号。