如何得出Linux服务端的并发数数量

74次阅读
没有评论

共计 2354 个字符,预计需要花费 6 分钟才能阅读完成。

如何得出 Linux 服务端的并发数数量,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面丸趣 TV 小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

1. 开场白

在开始之前,先抛一个面试题出来:

你接触过的单机最大并发数是多少?

你认为当前正常配置的服务器物理机最大并发数可以到多少?

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

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

所以最终我们的目的是:保证高可用高稳定的基础上追求高并发,降本增效。

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

2. 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 的架构也是这样的:

3. 服务器最大并发数分析

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

3.1 五元组

做过通信的盆友们一定听过五元组这个概念,一个五元组可以唯一标记一个网络连接,所以要理解和分析最大并发数,就必须理解五元组:

这样的话,就可以基本认为:理论最大并发数 = 服务端唯一五元组数。

3.2 端口 IP 组合数

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

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

对于服务端本身来说,DestPort 数量确实有限,假定有多张网卡,每个网卡绑定多个 IP,服务端的 Port 端口数和 IP 数的组合类型也是有限的。

对于客户端来说,本身的端口和 IP 也是一样有限的,虽然这是个组合问题,但是数量还是有限的:

3.3 并发数理论极限

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

错了,是真的会很大。

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

理论上服务端可以接受的客户端 IP 是 2^32(按照 IPv4 计算), 端口数是 2^16,目前端口号仍然是 16bit 的,所有这个理论最大值是 2^48,果然很大!

3.4 实际情况

天下没有免费的午餐。

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

实际中并发数和业务是直接相关的,像 Redis 这种内存型的服务端并发十几万都是没问题的,大部分来讲几十 / 几百 / 几千 / 几万等是存在的。

4. 客户端最大连接数

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

如何得出 Linux 服务端的并发数数量

对于客户端来说,当然可以借助于多网卡多 IP 来增加连接能力,我们仍然假定客户端只有 1 张网卡 1 个 IP,由于端口数的限制到 2^16,再去掉系统占用的端口,剩下可用的差不多 64000。

如何得出 Linux 服务端的并发数数量

也就是说,客户端虽然可以连接任意的目的 IP 和目的端口,但是客户端自身端口是有限的,所以客户端的理论最大连接数是 2^16,含系统占用端口。

5. NAT 环境下的客户端

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

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

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

来看下内网机器访问外网时的 IP 端口替换和映射还原的过程,就明白了:

如何得出 Linux 服务端的并发数数量

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

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注丸趣 TV 行业资讯频道,感谢您对丸趣 TV 的支持。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计2354字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)