首页 > 编程知识 正文

前端解决高并发的几种方式(高性能视频点播架构)

时间:2023-05-05 21:35:26 阅读:73502 作者:3088

互联网三高架构:高并发性、高性能、高可用性,简称三高(3H ) )。

在网络APP开发中,经常会看到高并发性和高性能这样的词汇。 经常听到的话,具体的意思和关系真的像你想的那样理解了吗?

让我们先来看一个例子:

一个水库,大小为1m*1m*1m=1立方米,有一个出水口,出水口每秒流出0.1立方米,该水库合并量为1立方米,出水速度为0.1立方米/秒。

如果增加一个出水口每秒流出0.1立方米,则该水库的合并量不变,但出水速度为0.2立方米/秒。

同样,增大了出水口,蓄水池的出水速度也加快了。

综上所述,并发量是容量的概念,性能是出水速度,可以得到以下结果。

增大蓄水池的纵横高度,可以提高同时性。 出水口扩大出口的大小可以提高出水的速度,也就是说提高了性能。 增加吐出口的数量是提高并行处理的能力,同样可以提高性能。 那么,与我们的计算机相比,在我们的系统中,结果如何呢?

通过增加服务器的内存大小,可以增加并发量。 随着内存的增加,可以运行更多的进程、更多的线程,还可以增加任务队列的大小。 可以通过提高cpu的时钟速度和优化程序来提高性能。 cpu速度加快,程序优化,处理单个任务的时间缩短。 通过增加多核或分布式服务器的数量,可以提高性能和并发性。 只是性能提高了,同时性也提高了吗?

如果静态地理解并发量,那就不会提高。

我想动态地理解并发量,即每单位时间可以进入的最大数量。

那么提高性能后,可以线性地提高同时量。 因为每单位时间,进来的同时也会出去。

让我们先假设一下:

单进程(php fast-cgi )内存占用10M

一个线程(java web )的内存消耗2M

一个协议(go )存储器占用20K

队列任务(nginx )的内存消耗2K

看看内存和并发量的关系吧。

内存量进程数线程数协作队列任务1g 10050050 k 2g 20010001000 k 4g 40020002000 k8g 80040004000 k从上述结果可以直观地看出不同运行模式下并发能力的巨大差异

多进程和多线程模式不仅内存开销大,而且在数量不断增加的情况下,对CPU的压力也非常大。

因此,当并发量大时,这种系统可能会变得不稳定,甚至出现故障。

假设上面计算的数据都是静态容量,如果不处理所有任务,内存一定会很快耗尽。

因此,要实现更高的并发性,需要更快的处理速度,也就是性能优化。

那么,再做一个假设吧。

目前有一台服务器,配备8核16G内存。

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

另外,假设该APP应用在多核并行运算时不存在锁定冲突。

QPS=1000ms/个请求需要时间*8

一个请求(任务)需要100ms时,可以计算为qps=(1000ms/100ms ) 8核=80个/秒

优化处理算法,将一个请求的时间缩短到10ms时,qps=(1000ms/10ms ) *8核=800个/秒

如果可以继续优化,将单个请求所需时间减少到1ms,则qps=(1000ms/1ms ) *8核心=8000个/秒

上述情况和优化的效果应该很容易理解。 对服务器资源的依赖是因为CPU的处理能力和数量很多。

在实际的网络APP应用中,系统往往依赖于mysql、redis、rest api或微服务,是IO密集型的。 根据以上的计算方式,由于cpu有富馀,所以可能不太准确。

如果IO被阻止,当然可以通过上述多进程、多线程、多协议和队列方法来打开更多任务。 它也是一种高效高效利用服务器资源的方法,可以增加并发量。

最终,我们将大部分的运算放入了APP外部的mysql、redis、rest api等服务中。

到目前为止,您已经了解了并发性、性能优化和服务器资源(服务器数量、cpu和内存)之间的关系,以及性能优化对并发性的影响。

答疑1内存越多,并发量越大可以吗?

a :大多数情况下,是的。 如上所述,在多进程、多线程模式下,如果线程过多,线程会断开时间片,CPU在上下文之间切换会变慢。 影响系统的性能。

关于协议、队列的执行模式,这个问题会好很多。 当然,协议调度、队列维护开销也一定会增加。 但是,增加的开销不会线性降低系统的性能。

2 CPU越快,APP应用性能一定越好吗?

答:绝对的。 但是,提高CPU和APP应用程序的性能可能与线性增长无关。 因为APP应用程序是IO密集型的,而APP应用程序的性能可能受IO块的影响。


3 CPU越多,应用的性能一定越好吗?

答:大部分情况是的。如果大量锁存在,性能提升可能会大打折扣,因为并行能力会被锁住,又变成单线程执行了,没有最大的发挥多CPU的作用。


4 服务器越多,并发量一定越大吗?

答:绝对的。服务器增加,CPU和内存资源相应也就越多,并发能力也就会增大,他们之间是线性相关。


5 服务器越多,性能一定越好吗?

答:大部分情况是的。但是单个服务器的效率可能会是下降的,数据一致性问题、同步问题、锁问题,这些都会导致单个服务器的效率(CPU利用率)下降,所以不是线性相关。

关于CPU利用率:
    如果只是考虑应用对CPU利用效率的话:单核=多核=多服务器

    单进程/单线程的系统对于服务器资源的利用率更高。

    到多核的系统中,就会因为锁的问题,多任务同步的问题,操作系统调度的问题,造成一定的资源浪费。而分布式系统中,这些浪费也会更严重。

6 怎样更好的更有效的利用服务器资源呢?

答:避免因为IO阻塞让CPU闲置,导致CPU的浪费;

    避免多线程间增加锁来保证同步,导致并行系统串行化;

    避免创建、销毁、维护太多进程、线程,导致操作系统浪费资源在调度上;

    避免分布式系统中多服务器的关联,比如:依赖同一个mysql,程序逻辑中使用分布式锁,导致瓶颈在mysql,分布式又变成串行化运算。


    上面说了要避免的地方,要具体怎么来避免,到具体的业务场景就需要具体分析了。

     而且有些时候,为了业务功能,或者其它方面的需求,比如:可用性、伸缩性、扩展性、安全性,不得不牺牲掉一部分性能。

 

最后,做一个总结:

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

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

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

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

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

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。