互联网三高架构之高并发和高性能的理解
互联网三高架构:高并发、高性能、高可用,简称三高(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
我们下面来看看内存与并发量的关系。
内存量 | 进程数 | 线程数 | 协程 | 队列任务 |
---|---|---|---|---|
1G | 100 | 500 | 50K | 500K |
2G | 200 | 1000 | 100K | 1000K |
4G | 400 | 2000 | 200K | 2000K |
8G | 800 | 4000 | 400K | 4000K |
从上面的结果中,我们可以很直观的看出来,并发能力在不同的运行模式中的巨大区别。多进程和多线程的模式,不仅是内存开销巨大,而且在数量不断增加的情况下,对 CPU 的压力也是非常巨大,这也是为什么这类系统在并发量大的情况下会很不稳定,甚至宕机。假设上边计算出来的数据,都是静态的容量,如果所有任务都不处理,那么内存肯定都是会很快就被撑爆。所以要达到更高的并发量,就需要有更快的处理速度,即做好性能优化。
下面,再来做一个假设。
我们现在有一台服务器,配置是 8 核 16G 内存。
如果我们的应用是计算密集型,纯运算的系统,如:数据索引查询、排序等操作。
而且还要假设,这个应用在多核并行运算时不存在锁竞争的情况(只读)。
QPS = 1000ms/单个请求耗时*8
- 如果单个请求(任务)耗时 100ms,那么我们可以计算出来:qps = (1000ms/100ms)*8 核 = 80 个/秒
- 如果我们优化处理的算法,单个请求耗时降低到 10ms,那么:qps = (1000ms/10ms)*8 核 = 800 个/秒
- 如果可以继续优化,将单个请求耗时降低到 1ms,那么:qps = (1000ms/1ms)*8 核 = 8000 个/秒
上面的情况和优化的效果理解起来应该很容易,因为对服务器资源的依赖更多是 CPU 的运算能力和数量。
在实际的互联网应用中,系统更多是依赖 mysql,redis,rest api 或者微服务,属于 IO 密集型。按照上面的计算方式,可能就不太准确了,因为 cpu 是有富余的。在 IO 阻塞的时候,开启更多任务的方式当然有上面多进程、多线程、多协程和队列的方式来实现,而且也是有效且更好地利用服务器资源的方法,可以达到更高的并发量,毕竟我们把大部分的运算放到了应用外部的 mysql,redis,rest api 等服务。
到此为止,我们已经知道并发量、性能优化跟服务器资源(服务器数量,cpu,内存)的关系,也知道性能优化对并发量的影响。
总结
并发量,是一个容量的概念,服务可以接受的最大任务数量,动态的看待它,还需要把性能考虑进去。
性能,是一个速度的概念,单位时间内可以处理的任务数量。
高并发和高性能是紧密相关的,提高应用的性能,是肯定可以提高系统的并发能力的。
应用性能优化的时候,对于计算密集型和 IO 密集型还是有很大差别,需要分开来考虑。
增加服务器资源(CPU、内存、服务器数量),绝大部分时候是可以提高应用的并发能力和性能(前提是应用能够支持多任务并行计算,多服务器分布式计算才行),但也是要避免其中的一些问题,才可以更好的更有效率的利用服务器资源。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: CAP 数据分布式系统 理论含义
下一篇: 谈谈自己对于 AOP 的了解
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论