下载鸥 > 网站下载 > 开发教程 > PHP

什么是高并发,与CPU,内存,分布式有什么关系

392 2021-05-24 10:00:01

收藏
什么是高并发,与CPU,内存,分布式有什么关系
我们在网站开发的过程中经常会接触到高并发这个概念,但高并发到底是什么,具体的含义你真正的理解吗?

什么是高并发,与CPU,内存,分布式有什么关系

高并发概念示例

一个蓄水池,是1m*1m*1m=1立方米大小,有一个出水口,出水口每秒钟流出0.1立方米,那么这个蓄水池的并发量是1立方米,出水速度是0.1立方米/秒。

如果增加一个出水口,都是每秒钟流出0.1立方米,那么这个蓄水池的并发量没变,但是出水速度变成了0.2立方米/秒。

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


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

1 增大蓄水池的长宽高,可以增加并发能力。

2 出水口如果扩大了出口大小,则可以提高出水的速度,也就是性能提高了。

3 增加出水口的数量,则是增加了并行处理的能力,同样可以提高性能。
 

网站开发中的高并发

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

1、增加服务器的内存大小,可以增加并发量。因为内存增加了,就可以开更多的进程,更多的线程,也可以扩大任务队列的大小。

2、提高cpu的主频速度,优化程序,可以提高性能。cpu更快了,程序优化的更好了,处理单个任务的时间也就更短了。

3、增加多核甚至分布式服务器数量,也可以提高性能,同时提高并发量。
 

性能与高并发的关系

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

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

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

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


接下来,再来具体的分析下,上面的几种结果,是不是真的可以实现呢?是不是完全正确呢?


我们先来做一个假设,单个进程内存占用10M,单个线程内存占用2M,单个协程内存占用20K,队列任务内存占用2K,我们下面来看看内存与并发量的关系。

(具体的内存占用大小在不同的应用场景中会有很大的不同,所以这里只是为了方便计算而做的一个假设)

内存量 进程数 线程数 协程 队列任务

1G 100 500 50K 500K

2G 200 1000 100K 1000K

4G 400 2000 200K 2000K

8G 800 4000 400K 4000K

对应的几种运行模式

多进程: php fast-cgi

多线程: java web

协程: go

队列: nginx

从上面的结果中,我们可以很直观的看出来,并发能力在不同的运行模式中的巨大区别。

多进程和多线程的模式,不仅是内存开销巨大,而且在数量不断增加的情况下,对CPU的压力也是非常巨大,这也是为什么这类系统在并发量大的情况下会很不稳定,甚至宕机。

上面假设中计算出来的数据,都是静态的容量,如果所有任务都不处理,那么肯定都是会很快就被撑爆。

所以要达到更高的并发量,就需要有更快的处理速度,即做好性能优化。
 

CPU与高并发的关系

如果只是考虑应用对CPU利用效率的话

单核>=多核>=多服务器

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

到多核的系统中,就会因为锁的问题,多任务同步的问题,操作系统调度的问题,造成一定的资源浪费。

而分布式系统中,这些浪费也会更严重。
 

高并发实际应用举例

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

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

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

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

如果单个请求(任务)耗时100ms,那么我们可以计算出来

qps=1000ms/100ms*8=80个/秒

如果我们优化处理的算法,单个请求耗时降低到10ms,那么

qps=1000ms/10ms*8=800个/秒

如果可以继续优化,将单个请求耗时降低到1ms,那么

qps就可以达到更高的8k。

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

在实际的互联网应用中,系统更多是依赖mysql,redis,rest api或者微服务,属于IO密集型。

按照上面的计算方式,可能就不太准确了,因为cpu是有富余的。

在IO阻塞的时候,开启更多任务的方式当然有上面多进程、多线程、多协程和队列的方式来实现。

而且也是有效的更好的利用服务器资源的方法,可以达到更高的并发量,毕竟我们把大部分的运算放到了应用外部的mysql,redis,rest api等服务。

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

关于高并发的问题

1、内存越多,并发量一定可以越大吗?

大部分情况是的。

这个问题,上面有提到过,对于多进程、多线程的模式,线程太多的时候,线程抢占时间片,CPU切换上下文会越来越慢。

对于协程、队列的运行模式,这个问题会好很多,当然协程调度、队列维护的开销,肯定也是会增加,只是增加的开销不至于对系统性能造成直线下降。

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

绝对的。

只不过CPU和应用性能提升可能不成线性增长的关系,因为应用可能是IO密集型,应用性能还会受到IO阻塞的影响。

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

大部分情况是的。

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

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

绝对的。

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

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

大部分情况是的。

但是单个服务器的效率可能会是下降的,数据一致性问题、同步问题、锁问题,这些都会导致单个服务器的效率下降,所以不是线性相关。

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

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

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

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

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

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

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

高并发概念与应用总结

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

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

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

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

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

本文地址:https://xzo.com.cn/develop/php/981.html

有帮助,很赞!

信息来源:下载鸥
导出教程 下载word版教程
发表评论 共有条评论
关于PHP

PHP是一种服务器端、跨平台、html嵌入式的脚本语言,其功能十分强大、入门简单。在过去,民间一直有说法称“PHP是最好的编程语言”,是PHP开发者对自身所使用语言的肯定。

PHP曾是最主流的网站web开发语言之一,现在也依然十分流行。

推荐PHP开发教程
PHP怎样正则匹配段落里的图片并提取图片链接?
PHP怎样正则匹配段落里的图片并提取图片链接?

在程序开发的过程中,我们可能需要提取段落里的图片用作缩略图。那么,这个正则...

19 940
PHP怎样用正则判断一个链接是内链还是外链?
PHP怎样用正则判断一个链接是内链还是外链?

在日常文章的发表过程中,由于需要引入一些外部链接达到更好的效果与体验。但...

26 1331
str_replace怎样一次性替换多个值(数组)?
str_replace怎样一次性替换多个值(数组)?

我们知道,str_replace是可以执行替换命令的,但一般是用于一对一替换,这个很好...

1 439
一句话防御首页带问号?的垃圾链接分权重
一句话防御首页带问号?的垃圾链接分权重

任何站点但凡有点流量就会遇到这种情况:首页被人用问号传了参数,恰恰还被收录...

1 492
PHP排序函数sort、asort、rsort、krsort、ksort区别与用法详解
PHP排序函数sort、asort、rsort、krsort、ksort区别与用法详解

在php中自带了大量了数组排序函数,使用起来非常简单,下面我们一一来介绍一下...

3 464
ajax发起session请求发现session无效了怎么办?
ajax发起session请求发现session无效了怎么办?

今天遇到这样一个问题:php启用了session,经过测试也发现session生效了。但在a...

1 439
php常用基础函数isset()介绍
php常用基础函数isset()介绍

isset() 函数用于检测变量是否已设置并且非 NULL。如果已经使用 unset() 释...

0 399
php正则提取字符串中的数字并打印输出
php正则提取字符串中的数字并打印输出

我们在网站开发的过程中经常需要处理数据,今天讲讲怎样用正则提取字符串中的...

0 435
推荐插件
帝国cms在线考试系统模板插件
帝国cms在线考试系统模板插件

一直没看到好用的帝国cms在线考试插件,所以自己开发了一款。在线考试插件用...

0 1258
帝国cms自动生成文章新闻目录插件下载
帝国cms自动生成文章新闻目录插件下载

用户体验是我们的需求,百度蜘蛛的认可更是我们的需求。毕竟,没有收录排名,何来...

0 1123
帝国CMS内网用户静态站点文章访客统计插件
帝国CMS内网用户静态站点文章访客统计插件

本插件适用于内网用户,可查看单篇文章访问者ip地址。如果添加访问者ip组,可查...

0 537
帝国cms百度文字识别ocr接口对接插件
帝国cms百度文字识别ocr接口对接插件

许多网站会做一些小功能小插件给客户使用以增强用户黏性,比如图片转文字,这种...

0 452
帝国cms百度AI图像无损放大api接口对接插件
帝国cms百度AI图像无损放大api接口对接插件

通过本插件,可以实现帝国cms网站对接百度云api实现图像无损放大的功能。经过...

0 438
帝国cms自动给正文关键词添加tag内链
帝国cms自动给正文关键词添加tag内链

帝国cms有自带的给关键词添加内链功能,但需要手动添加关键词,容易出现疏漏和...

0 811
帝国cms纳米数据接口(足球比赛中最新数据)
帝国cms纳米数据接口(足球比赛中最新数据)

帝国cms 对接纳米数据(www.nami.com)接口,本接口主要接收、整理足球比赛实时数...

0 319
帝国cms百度AI图像清晰度增强api接口对接插件
帝国cms百度AI图像清晰度增强api接口对接插件

通过本插件,可以实现帝国cms网站对接百度云api实现图像清晰度增强的功能。经...

0 498
客服QQ:341553759
扫码咨询 常见问题 >
官方交流群:90432500
点击加入