互联网三高架构之高并发和高性能的理解

发布于 2023-10-14 11:16:41 字数 2764 浏览 30 评论 0

互联网三高架构:高并发、高性能、高可用,简称三高(3H),互联网应用系统开发肯定经常会看到高并发和高性能这两个词,可谓是耳熟能详,而具体的含义和关系真的如你所想的,真正的理解了吗?

先来看一个例子:

一个蓄水池,是 1m1m1m=1 立方米大小,有一个出水口,出水口每秒钟流出 0.1 立方米,那么这个蓄水池的并发量是 1 立方米,出水速度是 0.1 立方米/秒。如果增加一个出水口,都是每秒钟流出 0.1 立方米,那么这个蓄水池的并发量没变,但是出水速度变成了 0.2 立方米/秒。同理,增大了出水口,蓄水池的出水速度也变快了。

上面我们很容易知道,并发量是一个容量的概念,性能就是出水速度,而且有下面这些结果。

  • 增大蓄水池的长宽高,可以增加并发能力。
  • 出水口如果扩大了出口大小,则可以提高出水的速度,也就是性能提高了。
  • 增加出水口的数量,则是增加了并行处理的能力,同样可以提高性能。

那么对照我们计算机中,我们的系统中,是怎么样的结果呢?

  • 增加服务器的内存大小,可以增加并发量。因为内存增加了,就可以开更多的进程,更多的线程,也可以扩大任务队列的大小。
  • 提高 cpu 的主频速度,优化程序,可以提高性能。cpu 更快了,程序优化的更好了,处理单个任务的时间也就更短了。
  • 增加多核甚至分布式服务器数量,也可以提高性能,同时提高并发量。

如果只是性能提高了,并发量是否也能提高呢?

如果我们静态的理解并发量,那它是不会提高的。

而我更愿意动态的来理解并发量,即:单位时间内可以进来的最大数量。

那么提高性能,是可以线性提高并发量的,因为单位时间内,进来的同时也有出去。

我们先来做一个假设:

  • 单个进程(php fast-cgi)内存占用 10M
  • 单个线程( java web)内存占用 2M
  • 单个协程(go) 内存占用 20K
  • 队列任务(nginx) 内存占用 2K

我们下面来看看内存与并发量的关系。

内存量进程数线程数协程队列任务
1G10050050K500K
2G2001000100K1000K
4G4002000200K2000K
8G8004000400K4000K

从上面的结果中,我们可以很直观的看出来,并发能力在不同的运行模式中的巨大区别。多进程和多线程的模式,不仅是内存开销巨大,而且在数量不断增加的情况下,对 CPU 的压力也是非常巨大,这也是为什么这类系统在并发量大的情况下会很不稳定,甚至宕机。假设上边计算出来的数据,都是静态的容量,如果所有任务都不处理,那么内存肯定都是会很快就被撑爆。所以要达到更高的并发量,就需要有更快的处理速度,即做好性能优化。

下面,再来做一个假设。

我们现在有一台服务器,配置是 8 核 16G 内存。

如果我们的应用是计算密集型,纯运算的系统,如:数据索引查询、排序等操作。

而且还要假设,这个应用在多核并行运算时不存在锁竞争的情况(只读)。

QPS = 1000ms/单个请求耗时*8

  1. 如果单个请求(任务)耗时 100ms,那么我们可以计算出来:qps = (1000ms/100ms)*8 核 = 80 个/秒
  2. 如果我们优化处理的算法,单个请求耗时降低到 10ms,那么:qps = (1000ms/10ms)*8 核 = 800 个/秒
  3. 如果可以继续优化,将单个请求耗时降低到 1ms,那么:qps = (1000ms/1ms)*8 核 = 8000 个/秒

上面的情况和优化的效果理解起来应该很容易,因为对服务器资源的依赖更多是 CPU 的运算能力和数量。

在实际的互联网应用中,系统更多是依赖 mysql,redis,rest api 或者微服务,属于 IO 密集型。按照上面的计算方式,可能就不太准确了,因为 cpu 是有富余的。在 IO 阻塞的时候,开启更多任务的方式当然有上面多进程、多线程、多协程和队列的方式来实现,而且也是有效且更好地利用服务器资源的方法,可以达到更高的并发量,毕竟我们把大部分的运算放到了应用外部的 mysql,redis,rest api 等服务。

到此为止,我们已经知道并发量、性能优化跟服务器资源(服务器数量,cpu,内存)的关系,也知道性能优化对并发量的影响。

总结

并发量,是一个容量的概念,服务可以接受的最大任务数量,动态的看待它,还需要把性能考虑进去。

性能,是一个速度的概念,单位时间内可以处理的任务数量。

高并发和高性能是紧密相关的,提高应用的性能,是肯定可以提高系统的并发能力的。

应用性能优化的时候,对于计算密集型和 IO 密集型还是有很大差别,需要分开来考虑。

增加服务器资源(CPU、内存、服务器数量),绝大部分时候是可以提高应用的并发能力和性能(前提是应用能够支持多任务并行计算,多服务器分布式计算才行),但也是要避免其中的一些问题,才可以更好的更有效率的利用服务器资源。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

灯下孤影

暂无简介

0 文章
0 评论
24 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文