Linux服务端最大并发数是多少?

开场白

在开始今天的文章以前,先抛一个面试题出来:html

你接触过的单机最大并发数是多少?
你认为当前正常配置的服务器物理机最大并发数能够到多少?
说说你的理解和分析。前端

思考几分钟,若是你能够有理有据地说出答案,那确实就不用再往下看了,关上手机去陪陪家人是个不错的选择。程序员

思考几分钟,若是你没有头绪或者对答案不肯定,那么你先不用着急关闭页面去玩耍,你应该继续往下看,由于这个问题很不错。面试

对于后端开发人员来讲,并发数每每和技术难度是呈正相关的,实际上也确实如此:体量决定架构。编程

服务端根据不一样业务场景会有不一样的侧重点,单纯追求高并发其实并非根本目的,高可用&稳定性更重要。后端

因此最终咱们的目的是:保证高可用高稳定的基础上追求高并发,降本增效。安全

高可用&高并发是咱们直观感觉到的,本质上这是个复杂的系统工程,每一个环节都会影响结果,每一块都值得研究和深刻。服务器

C10K问题和C10M问题

在2000年初的时候,全球互联网的规模并不大,可是当时就已经提出了C10K问题,所谓C10K就是单机1w并发问题,虽然如今不以为是个难题了,可是这在当初是颇有远见和挑战的问题。网络

C10K问题最先由Dan Kegel发布于其我的站点,原文连接以下:架构

http://www.kegel.com/c10k.html

相关资料显示Dan Kegel目前工做于Google,从1978年起开始接触计算机编程,是Winetricks和Crosstool的做者。

                    

Dan Kegel这篇文章阅读难度并不大,大白建议从事服务端开发或者对高性能网络开发有兴趣的读者尝试读一读。

在APUE第三版都没有提到epoll,因此咱们解决C10K问题的时间并不长,其中IO复用epoll/kqueue/iocp等技术对于C10k问题的解决起到了很是重要的做用。

开源大神们基于epoll/kqueue等开发了诸如libevent/libuv等网络库,从而大幅提升了高并发网络的开发效率,对于C/C++程序员来讲这些东西并不陌生。

这里简单提一下针对下一个10年的展望和挑战:C10M问题。

站在浪尖的那一批人早就开始思考让单机达到1000w并发,如今听起来感受难以想象,可是要达到这个目标,除了硬件上的提高,更重要的是对系统软件和协议栈的改造。

Errata Security的CEO Robert Graham在Shmoocon 2013大会上的演讲,大佬重要的观点是:

不要让OS内核执行全部繁重的任务:将数据包处理、内存管理、处理器调度等任务从内核转移到应用程序高效地完成,让诸如Linux这样的OS只处理控制层,数据层彻底交给应用程序来处理。

确实也是如此,难道你不以为Linux内核作了太多不应本身作的事情了吗?

近几年出现的DPDK、PFRING、NETMAP等技术也是相似的思想,如今流行的协处理器+CPU的架构也是这样的:

服务器最大并发数分析

前面提到的C10K和C10M问题都是围绕着提高服务器并发能力展开的,可是不免要问:服务器最大的并发上限是多少?

五元组

作过通讯的盆友们必定听过五元组这个概念,一个五元组能够惟一标记一个网络链接,因此要理解和分析最大并发数,就必须理解五元组:

端口&IP组合数

那么对于服务器来讲,惟一五元组数最大是多少呢?

有人说是65535,显然不是,可是之因此会有这类答案是由于当前Linux的端口号是2字节大小的short类型,总计2^16个端口,除去一些系统占用的端口,可用端口确实只剩下64000多了。

对于服务端自己来讲,DestPort数量确实有限,IP地址更不用说了,就算多张网卡,每一个网卡绑定多个IP,服务端的Port端口数和IP数的组合类型都是有限的。

对于客户端来讲,自己的端口和IP也是同样有限的,虽然这是个组合问题,可是数量仍是有限的:

                 

究竟有多大

看了前面的端口&IP的组合数计算,好像并发数并不会特别大。

错了,是真的会很大。

分析一下,前面的计算都是针对单个服务器或者客户端的,可是实际上每一个服务器会应对全网的全部客户端,那么从服务端看,源IP和源Port的数量是很是大的。

理论上服务端能够接受的客户端IP是2^32(按照IPv4计算),端口数是2^16,目前端口号仍然是16bit的,全部这个理论最大值是2^48,果真是海了去了!

实际状况

天下没有免费的午饭。

每一条链接都是要消耗系统资源的,因此实际中可能会设置最大并发数来保证服务器的安全和稳定,因此这个理论最大并发数是不可能达到的。

客户端最大链接数

理解了服务器的最大并发数是2^48,那么客户端最多能够链接多少服务器呢?

对于客户端来讲,固然能够借助于多网卡多IP来增长链接能力,咱们仍然假定客户端只有1张网卡1个IP,因为端口数的限制到2^16,再去掉系统占用的端口(好比22/23/80等),剩下可用的差很少64000。

也就是说,客户端虽然能够链接任意的目的IP和目的端口,可是客户端自身端口是有限的,因此客户端的理论最大链接数是2^16,这里算上了系统占用端口。

NAT环境下的客户端

解决前面的两个问题以后,来看另一个问题:

一个公网出口NAT服务设备最多可同时支持多少内网IP并发访问外网服务?

毕竟公网IP都是有限而且要花钱的,咱们大部分机器都是在局域网中结合NAT来进行外网访问的,因此这个场景仍是很熟悉的。

因此NAT环境下最多支持65535个并发访问外网,由于这时的客户端是NAT设备。

小结

本文经过一道面试题切入,先描述了C10K和C10M问题,进而详细说明了客户端的最大访问数和服务端的最大并发数计算和原理,最后描述了NAT场景下的访问并发数。

最后感谢各位老铁的倾情阅读。

相关文章
相关标签/搜索