当前位置: 首页 > 科技观察

说说linux服务器的并发数?

时间:2023-03-22 10:59:35 科技观察

本文转载自微信公众号《后端技术指南针》,转载请联系后端技术指南针公众号。一、开场白在开始今天的文章之前,抛出一道面试题:你接触过的单机最大并发是多少?你觉得一台正常配置的服务器最大并发能达到多少?谈谈你的理解和分析。想一想,如果你能给出有理有据的答案,那你真的不需要再读下去了。关掉手机,与家人共度时光,是个不错的选择。想几分钟。如果您不知道或不确定答案,请不要急于关闭页面并开始游戏。你应该继续看下去,因为这个问题很好。对于后端开发人员来说,并发数往往与技术难度呈正相关,这其实也是事实:体量决定架构。服务器根据不同的业务场景会有不同的侧重点。一味追求高并发并不是根本目的。高可用性和稳定性更为重要。所以最终我们的目标是在保证高可用和高稳定性的基础上追求高并发,降本增效。高可用&高并发是我们直观的感受。从本质上讲,这是一个复杂的系统工程。每一个环节都会影响结果,每一件作品都值得研究和深入研究。2、C10K问题和C10M问题2000年初,全球互联网规模还不大,但C10K问题就是在那个时候提出来的。所谓C10K问题就是单机1w并发问题。虽然现在不认为是问题,但在当初却是一个很有远见和挑战的问题。C10K问题首先由DanKegel在他的个人网站上发布。原文链接如下:http://www.kegel.com/c10k.html相关资料显示,DanKegel目前在谷歌工作,从1978年开始接触计算机编程,他是Winetricks和Crosstool的作者,老板年轻时的照片:DanKegel的文章,不难读。大白推荐从事服务端开发或者对高性能网络开发感兴趣的读者尝试阅读。APUE第三版中没有提到epoll,所以我们好久都没有解决C10K的问题。其中IO多路复用epoll/kqueue/iocp等技术对解决C10k问题起到了非常重要的作用。开源高手基于epoll/kqueue开发了libevent/libuv等网络库,大大提高了高并发网络的开发效率,这对于C/C++程序员来说并不陌生。这里简单提一下未来10年的前景和挑战:C10M问题。站在浪潮顶端的那群人,早就开始想着让单机达到1000w并发。现在听起来不可思议,但要实现这个目标,除了硬件的提升,更重要的是系统软件和协议栈的改造。ErrataSecurityCEORobertGraham在Shmoocon2013大会上的演讲,大佬的重点是:不要让OS内核执行所有繁重的任务:将数据包处理、内存管理、处理器调度等任务从内核转移到application高效完成,让Linux这样的OS只处理控制层,数据层完全交给应用程序。确实如此。你不觉得Linux内核做了太多不该做的事情吗?近年来兴起的DPDK、PFRING、NETMAP等技术也有类似的思路。现在流行的协处理器+CPU架构也是如此:3.服务器最大并发数分析你一定听说过五元组的概念。五元组可以唯一地标记一个网络连接。因此,要理解和分析最大并发数,就必须理解五元组:在这种情况下,你基本上可以认为:理论上的最大并发数=服务器上唯一的五元组数。3.2端口&IP组合的个数那么对于服务器来说,服务器端唯一五元组的最大个数是多少?有人说是65535,显然不是,但是之所以会有这样的答案,是因为Linux目前的端口号是2个字符的section-sizedshort类型一共有2^16个端口。除去部分系统占用的端口,可用端口确实只有64000多个。对于服务器本身来说,DestPorts的数量确实是有限的。假设有多个网卡,每个网卡绑定多个IP,那么服务器上的端口数和IP数的组合也是有限制的。对于客户端,端口和IP也有限制。虽然这是一道组合题,但是数量还是有限的:3.3并发数的理论限制看了上面端口和IP组合数的计算,好像并发数不高。很大。错了,真的会很大。分析一下,前面的计算都是针对单个服务器或者客户端,但实际上每个服务器都会处理整个网络中的所有客户端,所以从服务器的角度来看,源IP和源端口的数量是非常大的。理论上,服务端可以接受的客户端IP为2^32(按IPv4计算),端口数为2^16,当前端口号仍为16bit。这一切的理论最大值是2^48,真的很大!3.4其实天下没有免费的午餐。每个连接都会消耗系统资源,所以实际中可能会设置最大并发数来保证服务器的安全和稳定,所以这个理论上的最大并发数是不可能达到的。实际上,并发数与业务直接相关。像Redis这种基于内存的服务器,10万以上的并发是没有问题的。4、客户端的最大连接数理解为服务器的最大并发数是2^48,那么客户端最多可以连接多少台服务器呢?对于客户端,当然可以使用多网卡多IP来增加连接容量,我们还是假设客户端只有一张网卡和一个IP,因为端口数限制为2^16,并且去掉系统占用的端口,剩下差不多64000个可用端口。也就是说,虽然客户端可以连接到任意目的IP和目的端口,但是客户端自身的端口是有限的,所以客户端理论上最大连接数是2^16,包括系统占用的端口。5、NAT环境下的Client解决了前面两个问题之后,再来看一个问题:一个公网出口NAT服务设备,最多可以同时访问多少个内网IP同时访问外网服务?毕竟公网IP是有限的。而且要花钱。我们的机器大部分都是在局域网中结合NAT进行外网访问的,所以这个场景还是很熟悉的。看一下内网机器访问外网时IP&端口替换和映射恢复的过程,你就会明白:因为此时客户端是NAT设备,NAT环境最多支持65535并发访问外网.6.小结本文从一道面试题开始,先描述C10K和C10M问题,然后详述client端最大访问数和server端最大并发数的计算和原理,最后描述数NAT场景下的并发访问。虽然理论上服务器端的并发数很大,但我们也不必认为并发数高就厉害。服务的复杂性不同。我们不应该根据并发数来判断业务和开发人员的水平。想象一下,echo服务明显不同于order交易服务。我们应该做的是在服务稳定、高可用的前提下,从缓存/网络/数据库等多个角度优化提升性能。