在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、shein 希音、百度、网易的面试资格,遇到系列服务器相关的面试题:
一台服务器最大能支持多少条 TCP 连接?
一台服务器,最大能打开的文件数 ?
一台服务器,最大能支持多少连接?
一台客户端机器,最多能发起多少条连接?
小伙伴 没有回答好,导致面试挂了。小伙伴面试完了之后,来求助尼恩:如何才能回答得很漂亮,才能 让面试官刮目相看、口水直流。
所以,尼恩给大家做一下系统化、体系化的梳理,使得大家内力猛增,可以充分展示一下大家雄厚的 “技术肌肉”,让面试官爱到 “不能自已、口水直流”,然后实现”offer直提”。
当然,这道面试题,以及参考答案,也会收入咱们的 《尼恩Java面试宝典》V152版本PDF集群,供后面的小伙伴参考,提升大家的 3高 架构、设计、开发水平。
特别提示:尼恩的3高架构宇宙,持续升级。
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》的PDF,请到文末公号【技术自由圈】取
在Linux中,一切皆文件。
那么一台服务器最大能打开多少个文件呢?
Linux上能打开的最大文件数量受三个参数影响,分别是:
这三个参数之间还有耦合关系,所以配置值的时候还需要注意以下三点:
假设想让进程可以打开100万个文件描述符,这里用修改conf文件的方式给出一个建议。
如果日后工作里有类似的需求可以作为参考。
vim /etc/sysctl.conf
fs.file-max=1100000 // 系统级别设置成110万,多留点buffer
fs.nr_open=1100000 // 进程级别也设置成110万,因为要保证比hard nofile大
使上面的配置生效sysctl -p
vim /etc/security/limits.conf
// 用户进程级别都设置成100完
soft nofile 1000000
hard nofile 1000000
我们知道TCP连接,从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】
一组【socket内核对象】也对应着TCP四元组:源IP、源端口、目标IP、目标端口,他们只要能够找到对方,那么就算是一条连接。
网络数据的四元组:源ip地址,源端口,目标ip地址,目标端口。可以类比为收发快递上的快递单:
关于TCP协议,具体参见尼恩两篇文章:
网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!
如果网络原理的基础知识不好,基本上看了尼恩的上面两篇文章,基本也就差不了。
如果还不行,就去看看尼恩 在清华大学出版社出版的《Java高并发核心编程卷1加强版 》 。 最新的PDF电子书可以找尼恩获取。
了解了TCP链接之后,咱们来看看, 一台服务器最大能建立多少条连接呢?
2^32 (ip数) * 2^16 (端口数)
】条连接(约等于两百多万亿)。如果只以ESTABLISH状态的连接来算(这些连接只是建立,但是不收发数据也不处理相关的业务逻辑),一台服务器最大能建立多少连接呢?以一台4GB内存的服务器为例!
内存的大小
】(因为如果是)ESTABLISH状态的空闲连接,不会消耗CPU(虽然有TCP保活包传输,但这个影响非常小,可以忽略不计)。】,那么通过计算得知一台8GB内存的服务器,【
可以建立100w+的TCP连接`】(当然这里只是计算所有的连接都只建立连接但不发送和处理数据的情况,如果真实场景中有数据往来和处理(数据接收和发送都需要申请内存,数据处理便需要CPU),那便会消耗更高的内存以及占用更多的CPU,并发不可能达到100w+)。上面
讨论的都是进建立连接的理想情况
,在现实中如果有频繁的数据收发和处理(比如:压缩、加密等),那么一台服务器能支撑1000连接都算好的了,所以一台服务器能支撑多少连接还要结合具体的场景去分析,不能光靠理论值去算。抛开业务逻辑单纯的谈并发没有太大的实际意义。
服务器的开销大头往往并不是连接本身,而是每条连接上的数据收发,以及请求业务逻辑处理!!!
我们知道客户端每和服务端建立一个连接便会消耗掉client端一个端口。
一台机器的端口范围是【0 ~ 65535】,那么是不是说一台client机器最多和一台服务端机器建立65535个连接呢?
由TCP连接的四元组特性可知,只要四元组里某一个元素不同,那么就认为这是不同的TCP连接。所以需要分情况讨论:
【情况一 】如果一台client仅有一个IP,server端也仅有一个IP并且仅启动一个程序,监听一个端口的情况下,client端和这台server端最大可建立的连接条数就是 65535 个。
因为源IP固定,目标IP和端口固定,四元组中唯一可变化的就是【源端口】,【源端口】的可用范围又是【0 ~ 65535】,所以一台client机器最大能建立65535个连接。
【情况二 】如果一台client有多个IP(假设客户端有 n 个IP),server端仅有一个IP并且仅启动一个程序,监听一个端口的情况下,一台client机器最大能建立的连接条数是:n * 65535 个。
因为目标IP和端口固定,有 n 个源IP,四元组中可变化的就是【源端口】+ 【源IP】,【源端口】的可用范围又是【0 ~ 65535】,所以一个IP最大能建立65535个连接,那么n个IP最大就能建立 n * 65535个连接了。
以现在的技术,给一个client分配多个IP是非常容易的事情,只需要去联系你们网管就可以做到。
【情况三 】如果一台client仅有一个IP,server端也仅有一个IP但是server端启动多个程序,每个程序监听一个端口的情况下(比如server端启动了m个程序,监听了m个不同端口),一台client机器最大能建立的连接数量为:65535 * m。
源IP固定,目标IP固定,目标端口数量为m个,可变化的是源端口,而源端口变化范围是【0 ~ 65535】,所以一台client机器最大能建立的TCP连接数量是 65535 * m个。
其余情况类推,但是客户端的可用端口范围一般达不到65535个,受内核参数net.ipv4.ip_local_port_range
限制,如果要修改client所能使用的端口范围,可以修改这个内核参数的值。
这65535个端口里还有很多保留端口,可用端口可能只有64000个左右
总之,得到的结论是:
public static void main(String[] args) throws IOException {
SocketChannel sc = SocketChannel.open();
// 客户端还可以调用bind方法
sc.bind(new InetSocketAddress("localhost", 9999));
sc.connect(new InetSocketAddress("localhost", 8080));
System.out.println("waiting..........");
}
在epoll模型中,通过红黑树来管理epoll对象所管理的所有socket,用红黑树结构来平衡快速删除、插入、查找socket的效率。
有关epoll模型的知识,请参考尼恩的《NIO学习圣经》
在网络开发中,很多人对一个基础问题始终没有彻底搞明白,那就是一台机器最多能支撑多少条TCP连接。
不过由于客户端和服务端对端口使用方式不同,这个问题拆开来理解要容易一些。
注意,这里说的是客户端和服务端都只是角色,并不是指某一台具体的机器。例如对于我们自己开发的应用程序来说,当他响应客户端请求的时候,他就是服务端。当他向MySQL请求数据的时候,他又变成了客户端。
你在线上可能遇到过too many open files这个错误,那么你理解这个报错发生的原理吗?如果让你修复这个错误,应该如何处理呢?
需要注意这三个参数之间的关系!
因为这里要考虑的是最大数,因此先不考虑连接上的数据收发和处理,仅考虑ESTABLISH状态的空连接。那么一台服务端机器上最大可以支持多少条TCP连接?这个连接数会受哪些因素的影响?
和服务端不同的是,客户端每次建立一条连接都需要消耗一个端口。在TCP协议中,端口是一个2字节的整数,因此范围只能是0~65535。那么客户单最大只能支持65535条连接吗?有没有办法突破这个限制,有的话有哪些办法?
方式一,为客户端配置多IP 方式二,分别连接不同的服务端
假设你是系统架构师,现在老板给你一个需求,让你做一个类似友盟upush这样的产品。要在服务端机器上保持一个和客户端的长连接,绝大部分情况下连接都是空闲的,每天也就顶多推送两三次左右。总用户规模预计是1亿。那么现在请你来评估一下需要多少台服务器可以支撑这1亿条长连接。
然后,实际上的一个亿的用户,核心服务器至少100台起步。 尼恩见过大厂的大量案例,也指导过几百个大厂小伙伴改简历,做架构, 基本都是这个结论。 具体的问题,也可以来技术自由圈,找尼恩交流。
TCP相关的面试题,是非常常见的面试题。
以上的内容,如果大家能对答如流,如数家珍,基本上 面试官会被你 震惊到、吸引到。最终,让面试官爱到 “不能自已、口水直流”。offer, 也就来了。
在面试之前,建议大家系统化的刷一波 5000页 《尼恩Java面试宝典PDF》,并且在刷题过程中,如果有啥问题,大家可以来 找 40岁老架构师尼恩交流。
另外,如果没有面试机会,可以找尼恩来帮扶、领路。尼恩指导了大量的就业困难的小伙伴上岸,前段时间帮助一个40岁+就业困难小伙伴,拿到了一个年薪100W的offer。
……完整版尼恩技术圣经PDF集群,请找尼恩领取
《尼恩 架构笔记》《尼恩高并发三部曲》《尼恩Java面试宝典》PDF,请到下面公号【技术自由圈】取↓↓↓