抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

这段时间频繁出现图床无法访问,之前为了防护攻击,杜老师选购了高防的服务器,奈何除流量攻击外,还有连接数的攻击形式。而杜老师为了保障服务稳定,将连接数设置较低。本篇文章就简单说明下一台服务器最大能支持多少条 TCP 连接。

一台服务器最大能打开的文件数

我们知道在 Linux 中一切皆文件,那么一台服务器最大能打开多少个文件呢?Linux 上能打开最大文件数量受三个参数影响,分别是 fs.file-max/soft nofile/fs.nr_open。

fs.file-max 参数描述了整个系统可以打开最大文件数量。但是 root 用户不会受该参数的限制。

soft nofile 限制单个进程上可以打开的最大文件数。不能针对不同用户配置不同的值。

fs.nr_open 限制单个进程上可以打开的最大文件数。可以针对不同用户配置不同的值。

如果想加大 soft nofile,那么 hard nofile 参数值也需一起调整。如果因为 hard nofile 参数值设置的低,那么 soft nofile 参数的值设置的再高也没有用,实际生效的值会按照二者最低来。

如果增大了 hard nofile,那么 fs.nr_open 也需要跟着一起调整。如果不小心把 hard nofile 的值设置的比 fs.nr_open 还大,那么后果比较严重。会导致该用户无法登录。

一台服务器最大能支持多少连接

我们知道 TCP 连接从根本上看其实就是客户端和服务端在内存中维护的一组内核对象,它们只要能够找到对方,那就算是一条连接。那么一台服务器最大能建立多少条连接呢?

从理论上应该是约等于两百多万亿条连接。

但是实际上由于受其它软硬件的影响,我们一台服务器不可能能建立这么多连接。

如果只以已连接状态的连接来算,那么一台服务器最大可以建立多少连接呢?以一台 4G 内存的服务器为例!

我们知道一条已连接状态的连接大约消耗 3.3K 的内存,那么通过计算可得知一台 4G 内存的服务器,可以建立百万个 TCP 连接。

上面讨论的都是建立连接的理想情况,在现实中如果有频繁的数据收发,那么一台服务器能支撑 1000 连接都算好的了,所以一台服务器能支撑多少连接还要结合具体的场景去分析。抛开业务逻辑单纯的谈并发没有太大实际意义。

一台客户端机器最多能发起多少连接

我们知道客户端每和服务端建立一个连接便会消耗掉客户端一个端口。一台机器端口数量是 65535,那么是不是说一台客户机最多和一台服务端机器建立 65535 个连接呢?

由 TCP 连接的四元组特性可知,只要四元组里某个元素不同,那就认为这是不同的 TCP 连接。

如果一台客户端仅有一个 IP,服务端也仅有一个 IP 并且仅启动一个程序,监听一个端口的情况下,客户端和这台服务端最大可建立连接条数就是 65535 个。

如一台客户端有多个 IP,服务端仅有一个 IP 并仅启动一个程序,监听一个端口的情况下,一台客户端机器最大能建立的连接条数是 n*65535 个。

如果一台客户端仅有一个 IP,服务端也仅有一个 IP 但是服务端启动多个程序,每个程序监听一个端口的情况下,一台客户端机器最大能建立的连接数量为 65535*m 个

所以,不光是一台服务端可以接收百万个 TCP 连接,一台客户端照样能发出百万个 TCP 连接。

优化 TCP 连接数策略

在网络开发中,很多人对一个基础的问题始终没有彻底搞明白,那就是一台机器最多能支撑多少条 TCP 连接。不过由于客户端和服务端对端口使用方式不同,这个问题拆开来理解要容易一些。

注意,这里说的客户端和服务端都只是角色,并不是指某一台具体的机器。如对于我们自己开发的应用程序来说,当它响应客户端请求的时候,它就是服务端。当向 MySQL 请求数据的时候,它又变成了客户端。

增加服务器的内存可以支持更多的 TCP 连接。

优化 CPU 调度可以提高服务器性能,从而支持更多的 TCP 连接。

通过修改系统的文件描述符限制,可以提高服务器支持的 TCP 连接数。

优化网络配置可以提高服务器网络带宽,从而支持更多的 TCP 连接。

评论