企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 1.问题 Linux server同时可以接受多少请求 ### 2.解答 一台client 有最大只有65536个端口端口0有特殊含义,不能使用,这样可用端口最多只有65535,所以在全部作为client端的情况下,一个client最大tcp连接数为65535 上面给出的是理论上的client单机最大连接数,在实际环境中,受到机器资源、操作系统等的限制我们认为不会超过4万个 因为这里所说的4万个TCP的端口,是指源client端口,也就是你访问网站时使用的个人电脑使用的端口,而对于目的端口,也就是网站的端口server端口,使用的TCP端口也就是相同的23端口。这个意思也就意味着,4万个连接都连的是这个网站的23端口,换一个用户又可以用4万个连接连接服务器的23端口。 如果是100万个并发连接,在1个用户4万个访问的情况下,也就是25个并发的用户 ### 2.1 理论(2的48次方 TCP 并发) TCP连接四元组是源IP地址、源端口、目的IP地址和目的端口。任意一个元素发生了改变,那么就代表的是一条完全不同的连接了。 服务器一个端口理论可同时接收请求 Server最大支持接收TCP个数为2的32次方(IP地址是32位的)乘以2的16次方(port是16位的)等于2的48次方 这是两百多万亿的一个大数字。 ### 2.2 实际 (10万+ TCP并发) 事实上,真正影响Server TCP连接数量的是服务器的内存以及允许单一进程同时打开文件的数量,因为每创建一个TCP连接都要创建一个socket句柄,每个socket句柄都占用一部分系统内存,当系统内存被占用殆尽,允许的TCP并发连接数也就到了上限。一般来讲,通过增加服务器内存、修改最大文件描述符个数等,可以做到单台服务器支持10万+的TCP并发 ### 2.4 什么是句柄? 在 Linux 环境中,任何事物都是用文件来表示,设备是文件,目录是文件,socket 也是文件。用来表示所处理对象的接口和唯一接口就是文件。应用程序在读 / 写一个文件时,首先需要打开这个文件,打开的过程其实质就是在进程与文件之间建立起连接,句柄的作用就是唯一标识此连接。此后对文件的读 / 写时,目标文件就由这个句柄作为代表。最后关闭文件其实就是释放这个句柄的过程,使 得进程与文件之间的连接断开。 在默认情况下,每个进程可以调用的最大句柄数为 1024 个。超过了这个数值,进程则无法获得新的句柄 ### 2.4 限制条件 每维持一条TCP连接都需要创建一个文件对象,进程每打开一个文件(linux下一切皆文件,包括socket),都会消耗一定的内存资源,一条空的TCP 连接得消耗3KB左右内存。 如果有不怀好心的人启动一个进程来无限的创建和打开新的文件,会让服务器崩溃。 所以linux系统出于安全角度的考虑,在多个位置都限制了可打开的文件描述符的数量,包括系统级、用户级、进程级。具体方法还未研究熟悉 * 系统级:当前系统可打开的最大数量,通过fs.file-max参数可修改 /proc/sys/fs/file-max * 用户级:指定用户可打开的最大数量,修改/etc/security/limits.conf * 进程级:单个进程可打开的最大数量,通过fs.nr\_open参数可修改 /proc/sys/fs/nr\_open file-max是内核可分配的最大文件数,nr\_open是单个进程可分配的最大文件数,所以在我们使用ulimit或limits.conf来设置时,如果要超过默认的1048576值时需要先增大nr\_open值。 limits.conf文件限制着用户可以使用的最大文件数,最大线程,最大内存等资源使用量。