00:00
那接下来我们再来压测我们真正的业务功能,比如我们先来压测我们的首页,那么这块首页的请求来打开看一下,诶,以前的控制台这些错误,那是我们之前在关闭请求的时候强制关闭了这个连接的错误,好,那现在来看首页,首页呢,我们看一下主要它的这个性能损失,我们自己在不压测之前,我们能考虑到,第一个我们这个首页啊,是会访问数据库来查数据,所以这一块呢肯定会慢,第二个我们这个模板引擎要将我们这个数据渲染到页面,所以这一块呢,我们也可能会慢,但是我们来看一下,我这一块呢,整个压测效果更简单,服务比起来像我们这个简单服务什么都不处理,那超级快,那先来看一下,来压测我们这个首页的杠英数据,好,那现在不全面路压,我怎么压呢?我还是先来压我们的这个首页的一级菜单,我们压自己,我这一块这个颜色标识的都是只压自己,不结合我们这些网。
01:00
端来压,结合网关肯定会越压越慢,好,我们来写一个local house,我们就来压,我们1万端口来压这个杠请求就访问自个,我们来给大家看一下,来访问自个,如果1万端口我们来访问杠请求也能访问到我们这个首页内容啊,这是首页内容,然后呢,我们来压力测试一下,好,我们在这来做一个压力测试,把之前的这个结果一定我们先清空掉,好我们来压测它这一块,结果呢,好,都没有来准备压力测试走。好,压力测试启动们,来看我们的汇总报告,汇总报告呢,每秒有260多,270多,好,我们就按两百七算,那在这来写一下们一级菜单,我们这是每秒的270,然后呢,90%的响应时间,来看一下这个时间90%呢是200多毫秒响响应,我们这个99%呢,是360毫秒响应其实看起来也挺快的,而且挺稳定的,90%是200多毫秒啊,我们来看一下是267 99%是365,哈,267,这个365。
02:09
好,我们这个单的这个一级菜单是这么一个性能报告,我们把这个停掉,包括我们要分析,我们还要连上我们这个商品服务,我们直接可以看一下它整个交互数据,我们看到它这个内存占有,包括我们看一下它的这个GCGC呢,诶老年区刚买了一次,做了一次four g c,而且呢,我们这个年轻代我们看一下,那么这个伊甸园区由于我们设置的太小了,所以呢,我们频繁的GC1以后呢,GC又没了,一满GC又没了。发生这些GC呢,也会浪费很大的时间,如果我们把这些内存调大,那肯定呢也会对性能提升一大截,这是我们的GC指标观察,包括我们还能看到实施的线程在运行,我们这有好几十个线程,我们在每一个在运行期间的,还有我们这个排队的啊,这都有,好,这是我们的这些观测指标。
03:01
我们现在呢,就能达到我们这个指标,我们现在没有过任何的中间下,包括我们来看三级分类数据,好,我把这一块呢先来停一下。那现在呢,查看的是我们这个首页内容,那再来看我们获取我们这个三期分类的这个接送数据,这个更浪费时间,如我们这个查询,这是一个嵌套式的不断去数据库来进行查询的,我们来看一下这一块有多慢,我们先来访问我们这一块的内容,先来保证能拿到这个数据走。好,就是这个结算数据,那不仅查的慢,而且呢,我们这个数据也多,返回的也慢,我们来看一下我们的这个功能,它的这个吞吐量有多少,好,我们来到这一块,我们来发送这个请求,我们把这一块呢,我们来都清空掉,好我们现在来启动起来。好,启动起来呢,那正在运行,我们也可以在这来进行监控,哎,包括我们这个网关之前如果启动过这一块变灰了,这个监控界面呢,就不动了,大家还得重新连,你就不连网关了,我们直接连到商品服务,我们来监视,我们看一下它的这个CPU,以及我们这个实时线程,线程峰值也不多,包括我们这一块内存以及垃圾回收,这个垃圾回收呢,啊,五秒多的,我们这个小GC这都有,好接下来我们来看一下我们整个压测报告,来看一下报告。
04:24
报告我们发现啊,现在这一块有点太慢了,每秒2.0,这个2.0呢,我们再来看这个聚合报告,90%是在两万多毫秒响应的,99%是在两万四的,那让他觉得这是花了24秒的时间才给我们有响应数据,实际上呢,我们看通吐量的这一块,如果能每秒有两个通吐量,相当于每秒处理两个起球,那大概每一个就是500毫秒呗,一个线程500毫秒就结束了,500毫秒就结束了,好所以我们就来看到这,那这个三级分类,这个吞吐量更离谱,好,每秒两个,每秒两个,然后这个响应时间就更不具有什么参照标准了,来放到这,包括我们这一块的响应时间,这些通吐量,大家也只能做一个参照标准,大概能反映问题就行了,因为我的这个压力测试也好,我们的这个真正服务也好,都是在同一个机器的来同时来压的话,他们肯定要线成竞争。
05:24
所以呢,我们真正压测的这个数据,不应该是我们这个机器部署到服务器以后,它真正所能承受的压力,如果大家能拿另外一台机器给我们来发送请求来压,那估计就是相对于来说比较标准的数据好,这是我们说的这个三级分类数据,能看到呢,还是比较离谱的。我们把这个数据呢,好,我们让它压测停止每秒两个啊,这个还是很受不了的,我们把它这个清空一下,所以我们这个呢,一定是要优化的,但我们能知道这一块优化大致在哪个地方呢。那对比起我们中间站的这些传输多了几十毫秒来说,他肯定所有的时间全都浪费在了业务逻辑上,所以说呢,我们的这些业务非常慢的情况下,那么肯定优化的是我们这些业务,那么能考虑到这个一级菜单的这个渲染这一块的业务。
06:17
这块的业务,它的这个慢有两处,一处查数据库,一处我们SIM live,我们进行渲染,所以呢,我们来说慢的原因,我们可以标志在后边是这两个拖慢了,它一个是DB,一个是SIM。好,然后呢,我们的这个三级分类,那这个就完全是我们这个DB拖慢了我们整个数据了,包括我们来获取首页的全量数据,什么叫首页的全量数据,那么之前已经压测过这个一级菜单了,但是呢,我们压测的这个结果,我们来可以可以看一下们来在压测这个一级菜单的时候,现在获取首页的时候来进行压力测试,那这个压力测试呢,返回的这个结果,我们来看一下结果数里边响应的这个数据,Response body,其实就是这个页面模板,但是页面模板呢,还引了非常多的这些图片,比如这些图片,这些图片实际上在我们这儿还是要渲染的,相当于要给服务器发请求,再要拿过来,所以呢,我们一个完整的请求,应该是我们整个页面给我们返回来的这个请求,所以我们在这一块呢,我们在压测的时候,我们可以让它压测我们整个页面的这个返回,那这一块怎么压测好把这一块停掉,整个页面的这个返回数据我们可以来到高级这一块。
07:32
我才让它可以包含页面里边所有的资源,让他呢自己也来下载来,那他下载这些资源的时间,他也会计算到我们吞吐量等这些内包括呢,我们并行的下载数量,比如我们可以给他限制一下,那不限制呢,那就让它有空闲线程,那就自己下载,比如我们就给它来限制一个六好,我们现在来做一个测试,来,现在来要我们页面的全量数据。就是首页的全量数据,包括我们这个静态页面,以及我们GS文件CSS以及我们的图片来测试一下走好,我们现在呢,压测开始来看一下我们的汇总报告,吞吐量呢,每秒有七点多,那这个异常挺多的,100%,异常的原因来看一下,那就是由于获取哪个数据的时候,我们来看一下这一块response body,这是有数据的来取样器的结果里边那有一个这个404,也就是说我们返回的这个页面内容,相当于他找某些图片没找到,哎,这个图片没找到,这个indi GS没找到,没找到就算了。
08:33
无所谓了,我们这个大体的整个页面的响应数据有就行了,而且这一块呢,压着压着我这也卡死了,大家在下面呢,也会经常出现这个情况,就是在压力测试期间,可能你的这个电脑如果你线程数调到太大,你会蓝屏,包括把你的网卡会压爆,导致你这个没网络等等这些原因呢,大家都直接重启电脑就行了,好,我把这个就直接一关,刚才我们看到每秒呢七个请求左右,好啊,把这个都停掉。
09:03
所以说呢,我们现在要页面的全量数据的话,那就每秒七个请求。如果只想要页面内容每秒有270,那现在我们要页面的全量数据每秒七个,那我们发现这个全量数据比我们以前要这个首页的这个数据多了一个,就是我们这个静态资源。所以啊,我们能猜到浪费了的这263个,那都浪费在静态资源的响应时间了,所以如果我们要优化,我们就得从这几个角度,那中间件,首先我们来调整我们这个中间件的一些性能,让我们中间件本身的吞吐量增大,第二个我们让网络交互的更快。我们用更先进的网卡,网线,数据传输技术,传输协议等等,我们可以来让它加大更多的这个网络的吞吐量,然后呢,包括如果我们想要优化我们的这个业务,我们会发现如果加上我们的业务,那么对比其他的影响,我们业务对我们性能的影响可能更多,所以我们优化我们业务功能,我们就不要再去考虑中间这的这些问题了。
10:14
那么业务里边呢,应该考虑的是我们目前分析的这几个,第一个DB,我们数据库的速度,第二个我们这个模板的渲染速度,那咱们这个渲染速度包括呢,我们这个静态资源,静态资源呢,由于我们要的这些CSSGS样式也得找Tom cat要,我们来可以看一下,那么这个商品服务里边呢,专门有一个静态资源文件夹,所以相当于静态资源也得找他要,他们cat还得分一些县城来处理这些,所以呢,本身并发不高。假设tomcat现在有200个线程来处理我们请求,我们真实的请求呢?要分配一个线程处理,那么静态资源还要分配线程处理。相当于我们静态资源就会剥夺很多的线程,那么整个吞吐量呢又会下去很多,所以我们来说在业务期间这些都是我们需要考虑的问题,那DB我们想要做优化那就更多了,我们周阳老师讲的我们这个MYSQL优化的整个高级课程里边呢,讲解了我们无论是MYSQL服务器的优化,包括它的索引优化等等等等。
11:23
我们都应该去来考虑上,包括我们模板的渲染速度,我们模板呢,现在用的是SIM live,我们发现啊,这个SIM live我们默认是关闭缓存的,但是在开发的时候我们一定要关闭缓存,但是在我们一旦上线以后,那就应该打开缓存来看一下打开缓存对我们这个性能有没有什么提升,来重新启动一下我们的这个商品服务。那现在来看一下,我们打开缓存的时候,我们这个数据,那么这个模板的渲染速度,除了我们这个模板渲染,它肯定是浪费CPU的,CPU要计算要差值,要把内存中的数据最终组装起来,所以这是浪费CPU的,所以如果我们CPU功能越强,那就越好,包括模板渲染呢,要提取数据内存,这也是需要的,那最重要的你看一下那这个模板的缓存,那这个模板的缓存呢,我们开发的时候给它关闭,我一旦假设这是生产环境,我们都部署到线上,我们给它打开缓存,那再来再来调试一下,来看这个一级菜单的这个渲染,打开缓存以后,我们原来的二百七是加了DB,加了我们这个C类的。
12:32
渲染我们来看现在打开缓存以后呢,有没有什么提升,好我们把这个呢,再来插入在下方插入行好我们这个首页,首页渲染我们就叫首页渲染,这个呢是开缓存的情况,开缓存,那么开锁缓存呢,我们还是这个50,我们来进行一个压力测试,好解密特,那么这个解密特呢,刚才已经崩了,我们来现在给它重新启动起来,把这个软件打开,我们来到我们的这一块的解密特bet啊。
13:05
那这个打开缓存呢,肯定对性能会有很大的提升,好我们现在来看一下,我们来进来我们的这个解密,我们来打开我们之前的这个测试,测试呢我们是个叫test plan,好我们来打开,那么这个50个线程,好我们现在来HTTP请求。我们现在访问我们的local host1万local host1万端口,1万端口,因为我们现在呢,给我们这个首页现在已经开缓存了,原来访问1万没开缓存呢,是270,我现在开缓存访问的是首页数据来看它最终的这个结果,开缓存以后怎么样走。好,现在呢,我们正在压测,包括压测的时候呢,我们也可以看一下啊,我们这个商品服务呢,之前已经停掉一次了,我们现在可以来重新连接上好。来重新把它连接上来,观察一下它里边的这些变化,这线程数呢也有提升,我们来看一下我们这一块的整个测试的汇总报告。
14:03
好,我们这是200多,我们发现开缓存倒还慢了,好我们把这个先停掉,我们把它清空,我们再来启动一下,由我们直接启动来看我们系统呢,可能有预热的一段时间,它跑起来以后呢,就可能更快了,好我们现在来重新来启动。好,那现在看我们的这个吞吐量,吞吐量呢,现在能飙到200多,280多。呃,比之前呢,相当于提升了,我们有十来个吞吐量呢,能提升十来个,那现在290多,我们来取它的这个峰值290,那说明我们这个开缓存还是有一定的提升,但是呢倒不是很大,那现在呢是290,那这个响应时间呢,我们也可以来看一下,90%是25251,百分之九十九三六五二五一。那么这个365。响应时间呢,也少了,我们这个好十几毫秒来,但是呢,我们会发现这一块的更大的原因,影响还是在我们这个查DB查数据库,那这个数据库啊,对我们这个影响也比较大,那么这个首页渲染,我们现在给它既开缓存,我们又来优化一下数据库,来看一下我们的性能影响优化数据库,那看一下这个数据库怎么优化,来分析一下。首先这个优化的时候,我们还在控制台打了这些SQ语句,那打控制台也是需要时间的,所以这些日志我们也要优化,我们在线上以后呢,我们把这个日志级别别调这么低了,我们调一个info,或者我调一个error,只打印错误日志。
15:38
所有正确的东西呢,我们都不打印了,接下来呢,我们再来看数据库。好,我们在这来说一下,现在呢是开缓存优化数据库,关日志,关日志我们把我们能想到的这一块优化,我们全部给它加上好50个线程,那数据库咋优化嘞,我们这个数据库啊,我们现在相当于在首页只调了一个方法,这个方法呢,就是查我们这个所有一级的这些分类菜单,那这些分类呢,是按照parent cid进行查询的,来circle York,我们来进来看一下parent cid。
16:13
走。好,我们来到我们的这个数据库服务们看到个我们这有一个parent cid,那这张表的数据呢,也不是很多,只有一千四百二十五行,我们不在优化数据库之前,我们所有的查询呢,那都是默认的,特别我们按照我们的cid来进行查询的时候,它比较慢,只有按照我们这个主键查,因为主键呢是有索引的,没索引呢,它就是一个全表查,它比较慢,所以呢,我们想要优化,我们可以给这个字段来加上索引,那么来加索引之前,我先来给大家做一个简单的测试,来看一下没索引的时候。我们这个性能怎么样,我在这获取一下我们当前系统的时间,比如system点来我们这个current time,好,我们在这来打印一下我们整个的这个查询耗费的时间,来out,来输出一下这个消耗时间。
17:10
这个时间呢,我们就来用当前时间,我们来减去上一步的这个时间,好,我们把这一块呢,我来复制过来,我来减去我们上一步的这个时间,我们算出它的这个总耗费时间来加上,好我们来看一下我们在没加索引的时候,我们这个耗费时间是多少,好,我们来重新启动我们这个服务,那现在来访问我们这个首页,首页呢会调用我们这个get level1can,好,那现在来看一下我们的这个效果首页,首页呢会来访问,我们现在来直接来访问首页就行了。我来回车。好,我们这个首页访问到了,我们来看一下我们这个时间,那消耗的时间呢,是1432,第二次呢,我们消耗了38,那我们再来看一下,好,我再来刷新,我们看一下它这个消耗时间六七,说明我们这个挺快的,我们只要每次这个查询,我们再来刷新,它的这个消耗时间呢,都只在11毫秒。
18:07
那如果我们给他来加上我们这个索引,比如我们来到我们p Ms category来在这有一个管理索引,好我们来给我们这个parent cid这个属性呢,我们来给它加上索引,所以类型呢,也不用显示主键这些,我就加一个普通索引,我点一个保存,那加上索引以后呢,我们再来看查询,我来刷新,我们看一下我们耗费的这个时间,好我们现在一个40,我重新来刷刷新。好,我们这一块呢,花费了这个消耗时间是三,比原来的五六,相当于省了一半时间,那这打印两遍三,这个原因就是我们刷首页的时候,那么在这首页刷出来,我们首页还会发AJS请求来获取这个数据,所以第二个三呢,是这个数据打印的,那我们现在看到加了索引呢,确实我们这个性能会提升一点,原来都是567,现在是三四,还是有变化的,然后呢,我们现在来设置,那现在呢给数据库加了索引,然后呢我们也开启了SIM live的缓存,然后我们还关闭了这个日志,那在这种情况下,我们来进行一个压力测试,好我把这一块呢全部清空,来要我们的首页数据来看有没有比较好的性能表现走好,现在呢,启动起来,来看我们的汇总报告,诶我们发现呢,此时的这个汇总报告就已经非常快了,他能达到每秒700多的整个请求的响应速率,速率好把这个停掉,现在呢是700。
19:34
35原来的这个一级菜单渲染,它每秒呢只有270,现在我们把这些全加上以后,现在它每秒呢达到了700。响应时间呢,我们也来看一下,比如我们聚合报告那90%是105 98%是183,好,我们在这呢,105和183,那我们这个首页呢,就会渲染的非常快了,比以前我们省了一半的时间,所以做相应的优化调整是非常必要的。
20:04
那正好优化了数据库以后呢,我们来再测试一下其他的这个并发量,那这个三级分类的数据获取,以前呢,每秒两个文文,说慢呢就慢在数据库了,我们是一个嵌套,不断查询,那现在加了一个数据库的索引以后,那再来测试一下它的这个并发,好我们来到这,我们来测试这个,看一下它的整个吞吐量,好我把这个复制过来,那现在来直接来进行测试,走,那还是这50个线程,我们来开始测试,来看汇总报告啊,这个汇总报告呢,还得等一会儿才能出结果,因为我们这个比较慢,那现在看到它每秒的吞吐量呢,能有七个,比以前两个能强的多一点,现在八个,那还是由于我们这个业务写的有问题,我们要循环不断的查数据库,所以呢,还是很影响的,把这个先停掉,现在呢,优化了以后,我们消耗的这个时间呢,就能短一点,好,那这个三级分类的数据获取。
21:01
那优化后呢,我就来写上八个,这是优化后的。加索引后的,而且呢,这个首页的全量数据大家也可以再来测试一下,看我们加了优化以后呢,它整个全量数据怎么样?好来获取一下全量数据,把这一块呢都来清空掉,查看结果数里边汇总报告这一块都没有好,我们现在来要首页的全量数据,全量如何要呢?来到咱们这个高级里边,我们把这一块来看一下,把这个语言我来调成中文,全量数据呢,我们来主要选中能获取所有包含的资源,比如我们来给它限制好并行的下载量。好,我们现在来进行一个测试,走好,我们现在获取首页的全量资源,来看一下我们的这个汇总报告,先来看结果数,里边有没有我们这个成功的结果,那在看这个期间呢,我们肯定还要监控我们的整个商品服务的这一块的运行状态,那么这个CPU呢,也一直是百分之五六十,那这个内存我们发现这个平繁GC,这我们这个伊甸园区太小了,平繁GC,所以我们想要优化还要调大,而且我们看那这个老年代几乎就要爆满了,所以我们一定要在这儿调整,包括我们这个垃圾回收一次。
22:15
你们看多一次也没有给他回收多少,所以我们这个垃圾回收耗费的时间呢也会非常长,所以我们想要优化我们首页的全量获取,我们一定要把商品服务的这一块要调大,但即使这个不调的过程来看一下我们这些报告里边有没有数据。我发现这个报告这一块呢,就已经卡死在这儿,那这样的原因呢,那就是我们这个目标服务器,我们这个内存太小,它每秒的吞吐量太少,导致我们这个线程一直卡在这儿,等待它的这个响应结果,所以我们的这个首页的全量数据获取,那大家在这压力测试的时候呢,我们一定要调大我们的整个内存的空间,好,那这一块呢,我们就不测了,我们把我们这个测试呢,我给大家停掉,然后呢,大家在下边来继续来测试,然后我们这个优化呢,现在就起了一个基本效果了,那我们会发现。
23:06
比起这些中间件的这些效率,我们自己真正的业务逻辑其实才是最需要优化的地方,那结合我们再来加上其他的手段,缓存,索引等等各种,那么最终呢,一定会做到我们每秒的吞吐量到达我们指定的这个要求。
我来说两句