00:00
那么我们的一个系统,它能够承受的QPS是多少?那我们是不是心里应该有数,然后再去把这个项目上线,对吧?所以啊,就要配合一系列的测试工具,在我们项目上线之前呢,先进行一次压测,以避免上线之后呢,我们心里没数啊,一旦来了这个问题之后呢,也没做限制,一下就把这个系统给打垮了。那有同学可能会想,那我如果不做限制的话,是不是可以接受更多的请求,对吧?啊,那其实呃,一是这个嗯,尽可能的接受更多请求,第二就是平稳的运行,一般来说,我们作为项目管理者来说,更期望的是安全稳定,少出事是吧。那么就是需要在这个线上,在在上线啊之前,我们先去做一层限制,那具体这个数据我们的QP限制成多少,我们先呃这个经历一次这个压测得到结果,那现在比较常用的压测的工具,给大家这个介绍一个叫jamier的这个jamiter啊,它是阿帕奇的这个呃。
01:00
官方的开源项目,这个项目呢,也很多年了,那使用起来呢,嗯。并不是特别的复杂,但它并没有那么简单啊,呃,它是一个带有图形化的这个呃,测试工具之前。给大家做那个呃,压测例子的时候用的是AB test。那个也是阿帕奇出的阿帕奇奔驰对吧?那这个是阿帕奇的jami特,呃比较好用,而且这个能够展示的这个鲍贝尔的,呃,结果的方式呢,也非常多啊,它可以从各种维度去给我们展示这个压缩的结果数据,那这个工具的官方网站在这儿,那可以在官网上给它给下载下来,这是一个Java开发的工具啊,你电脑上得先装好这个JDK才可以,然后在这儿download load release。然后在这他也写了require Java8.0以上,你至少要装个这个,呃,JDK8.0,然后在这儿下载好之后呢,嗯,我这已经下载好了,大家可以看一下。就是这么一个压缩包,还不小,这有70多兆,大家都知道Java的软件都挺大的,那你把它解压开之后呢?
02:08
啊,这就是它的这个目录,然后这是个这是它的这个可执行目录,然后我们执行这个jater.bat啊,然后这个。嗯。这meter就能运行起来了。那这就是G特这个界面,那一会我们就用它去压测咱们这个服务器,以及这个限流的效果啊,那QPS和这个呃压测工具已经给大家介绍完了,那么接下来呢,我们去研究一下呃,如何去呃限制住这个流量。那在这个官方啊,它提供了两个模块去限流,我们先来聊第一个,也就是这个,呃,它的这个re EQ这个模块所对应的算法呢,就是呃,漏斗算法,或者叫漏筒算法,具体这个算法究竟啥意思呢?我们先给大家做完实验,然后呢,呃再给大家讲。这个模块的官方文档在这儿,我们可以在这上面呢,看到它能够配置的一切的详细的信息。
03:04
就在这儿,嗯。这个的配置啊,呃,它是基于这个HTTP这个模块的,然后基于这个server,具体的每一个R下的这个,呃,Location我们去去限制这个流量,那我们先给他给配置起来,我们看看效果。嗯,在这呢,我们打开配置文件。本几?然后在这呢,把它这个配置啊,咱先给它粘过来,我们看一下。在HTTP模块下之前我们还有这个stream,这个可以先不管啊。找一个底儿这儿吧。然后在location下呢,我们去具体去做这个限速。
04:01
然后把这个root给它打开,把这个没用的呢,给它都给删了。呃,这个呢,也先不要。然后我们看一下这个配置。呃,首先呢是limit r EQ zoom,然后去调取这个限速的模块,然后这这边呢,跟着一个Dollar,这很明显是N的一个内部变量啊,它叫bary remote a DR啊,它指的就是我们远程的这个,呃,连接的这个客户端的,呃,客户端地址其实就是IP地址,呃在后边跟的是这个zone。这个zone呢,呃,后边跟了一个名称,就指的就是我们所配置的这一条,这个限速指令,给它起了一个名称,那以便于我们下边的限速的时候呢,去使用这套规则啊,然后冒号10M,这指的是十兆。在启动之后啊,它会申请十兆的内存空间去记录这些,呃,远程的地址啊,作为这个缓冲区去使用啊,然后这个。
05:01
ER-S指的就是在一秒之内能够接受的请求,R就是request,一个REQUEST1秒就是每秒只接受一个请求。然后前面这个bary remote address,这可以去取一些其他的参数,比如说我们的user agent,以以某些其他这种标识,呃,去分类这个用户来达到这个限速的效果。那除了这个bary remote a drr之外呢,还有我们还可以直接使用这个remote a DR,但是它是占用字节数大小的区别,Baary啊,这是最原始的这种二进制数据。然后这个如果不带binary的话啊,那么它就会这个以这个字符字符的字符串的形式呢,去记录到我们这个十兆的这个缓存区里啊,这是区别用bary的速度比较小,不是它这个呃,大小会比较小一些,能记录的东西呢也会更多一些。那这是这条规则能把它配置好之后,这不需要额外的模块啊呃,不,这不需要额外的去编译咱们这个NG格斯拉,因为它已经内嵌在咱们的这个NG格里了,接下来呢,我们去重启一下这个NG格,我们看看这个限速模块它有没有起到效果。
06:09
来我们看呢,这是这个我们刚刚打开的这个G密特啊呃,讲道理,你现在啊配置的如果是QPS等于一的话,那你现在这个拿浏览器就能测出来。你看101,然后我再刷新。报错了,看见了吗?只要你超过这个速度之后呢,它就会报错来,你看你刷刷他报的错误是503。啊,指的就是当时呢,当前呢,我没法响应你啊,这是我服务器里边呢,呃,做了一层限制啊。超过了一秒,然后就503了,如果你一秒一下慢一点就没问题。啊,你说间隔稍微长一点。那我们在这个测试工具里,我们看一下这个测试工具究竟怎么用。我们打开之后呢,这是一个空白的这么一个面板,什么都没有,在这个text text text plan里边呢,我们先ADD一个这个threes啊,然后这加一个three group threead,这个three group啊表示这个线程组,然后可以这个去发动请求的这个最小单位是以线成为单位的,然后在然后在这里边呢,我们可以看到这么几个这个重要的参数。
07:22
啊,上面的就是名称和这个这个一些其他的这个呃,摘要什么的,这可以不填,这下面的是number of threeads啊,这指的就是并发请求的用户数啊,我们并发请求启动多少个线程在这儿,现在是一对吧,我们可以给它改成十啊,十个线程同时去请求,这指的是这十个线程呢,在多长时间同时把它给启动起来。啊,我们的在这儿呢,就一就可以了,然后这边呢,是最后一个是这个loop count,这loop count就是循环的次数啊,循环一一,如果要是一的话,就是发十的请求infinity,这就是无限次的循环,我们现在呢,先给它设置成一,我们看一下效果。
08:03
然后在这three的下,很明显我们现在还没有这个添加这个,呃,网址对吧啊。在这这在这里边呢,我们可以添加一个这儿啊,在这儿啊htp request加一个HTP请求,然后在这儿呢,就能填上我们这个地址了,注意在这个,呃,这个位置啊,你填填这个域名或者是IP协议呢,是在前面放着的。默认就是HTP协议,我们不需要管,然后端口是八零。然后发送的是get请求,如果有pass的话,在这里边再跟上,我们现在是没有。然后点击这个绿色的按钮,你看点一下。这是它提示你要不要save save一下你当前这个测试的,呃,这个这个plan啊,如果不想save的话,那直接就可以了啊,点一个否,大家看运行完结结这个结束了,在jater里。发送请求和查看结果是在两个地儿或者在多个地儿。我们点这个HTTP是快在这点ADD。
09:04
在这在这找到这个listener,这里边就能够有一有好多可以选择这个查看结果集,就是这次测试结果集这种方式啊,首先第一个是viewor tree这几个比较常用的,给大家加上,大家看一下。然后还有这个,呃,Summary report聚合的这种。然后还有一个这个view result in table啊,我们把这三个给它打开,剩下的同学们可以自己去看一看,打开之后你看我们再跑一下这十个请求。诶,大家看一二三四五六七八九十对吧,十个请求全都发完了,只有第一个请求啊,是这个响应成功的,剩下全是503,为什么呢?因为我们在这儿限速了,对不对。哎,不是这这这个我们在这限速了,对不对啊QPS是一,然后呢,我们在呃。
10:00
这个这个这这这个这个result tree里边呢,可以看到每一个具体请求里边,包括它发送请求以及这个响应的内容,然后在这个summary里边呢,可以看到这个聚合。啊,在这里边我们可以看到。有这些这个标签,我们简单给大家解释一下啊,这个label呢,呃,指的就是这个这个标签,具体我们发送的哪类请求,比如我这发了这个htp request和这个total total就是所有的不光是这htp request就是合计数,相当于现在我们只有一个,所以它这它这两行的展示的结果是一样的。这是样本个数,一共发送了多少个,我们我们在这儿能够呃配置的就是呃十个十个这个并发的这个线程,然后呢,来一次,那么这儿呢,就是十个请求对吧啊。然后这这几个啊,都是它的这个响应时间啊,这个平均数最小最大啊,以及这个中位值什么的,然后这个arrow的百分比发送完结果之后,发生错误的概率有多少,现在呢是达到90%。
11:08
啊,然后这是吞吐量,这个吞吐量指的就是QPS,哎,你看现在是11对吧,啊,这QPS11每秒。能达到11个啊,但是现在因为我们测试样本个数实在是太少了,才发了十个这个请求,对吧,所以他这个能够我们展示出来这个数据的结果啊,肯定是不准确的啊,然后再看这receive KB,然后大KB斜杠美S,这指的是我们的这个接收数据的这个吞吐量,这个吞吐量指的QPS,这指的就是呃。这个这个网络消耗的吞吐,他收了多少,发了多少啊平均啊,这个这个这个大小。这是一系列的参数,我们需要关心的有这么几个,首先呢,第一个呢,就是这个,呃,它的QPS的值啊,第二个呢,就是它的这个,呃,接收数据的这个大小和发送数据大小。QPS值呢,表示它这个系统现在能够请求的并发量是多少,然后这个啊,这边这个网络传输数据包的大小,这个表示是当前传输的速度或者叫速率。
12:11
啊,为什么要看这个你的这个并发量,如果要是一旦要没上去的话,比如说我们现在压测某一个系统就在QPS就到1500,它怎么都上不去了,我怎么调都上不去,你这会儿一定要一在测试完之后,一定要看一眼这儿它的吞吐量是不是已经达到了上限,这个上限是有我们的网卡,呃,来这个。设置的,就比如说我是百兆网卡,那我这个传输的速度应该是多少,是不是除以八对吧,大概是12兆左右,如果这已经到了12兆,就达到了这个100兆网卡的瓶颈了,那这会儿你的这个请求肯定是再也发不出去了,或者在响应的你也接不着了,所以这个网络吞吐量啊,这也是比较关键的一个指标啊,以及这个响应延迟,我们不能光看它的QPS高,然后延迟很也很高,这也不行,另外就是报错率嘛,对吧。然后再有这个呢,呃,Result in table是可以更直观的看到我们哪些请求成功的,哪些请求失败了,以及呃,用了哪个线程和。
13:08
开始时间和结束时间啊,他就是精确到这个毫秒级别的,那么这是这个测试工具,那我们接下来啊,稍微的这个呃,给他一点压力,稍微多一点,请求我们在这儿看。嗯。我们先看这个标签吧,然后这两有两个小扫把,每次发新请求之前啊,最好是把这个历史的历史的这个结果。我们先把它给清掉,那现在清的是这个table的这个还没清。那你如果要是点这个大扫把或者两个扫把就是clean all了,把所有的结果全都给清了。然后我们在这儿勾上这个。Infinity就是无限次的请求,我们再看这个结果来走。速度非常快,啪一下的全都出来了,对吧,然后在这里边我们能看到发的真实的请求究竟有多少个,N多个是吧,然后这是这个,呃,Result in table,我们能看到他请求成功的就只有一个,剩下全失败了,然后我们再看这个聚合的来,我们再把它给清了。
14:14
来发送这个请发请求走。啊,现在的这个吞吐量极高,大家看。呃,他的这个,呃,我们先停一下啊。他能够完成的QPS极高,现在已经到了1万多了,对吧,一万一的QPS了。大家也看到啊,我现在是宿主主机,向我的虚拟机发请求,虚拟机的配置极低,这都能到1万的QPS啊,QPS非常高对吧?为什么能达到这么高呢?一是N这个的性能高,第二就是它有好多它都这它都这个这个都报错了对吧?这些QPS里边呢,有很多无效的QPS,那如果不想看见这个无效的QPS,就是arrow的这一部分。
15:01
那在计算这个吞吐量和接收量的时候,这这这个网网络吞吐量的时候,能不能能不能只显示正确的呢?这个也可以的,就是在这儿大家看这有这个arrows和这个successes啊,一个是请求成功的,一个是请求失败的。如果你勾上它在发请求的时候,这是在统计的时候呢,就只统计成功的请求的QPS是多少了,然后把这个勾给勾上之后,把这个结果给它清掉,然后我们再发一次。哎,怎么没勾上来再来。然后清掉。这勾给它勾上啊,然后再来。哎,瞬间就下来了,大家看QPS达到了1.2之多,1.1,然后随着时间的变化,慢慢的它就会变到或者说趋近于我们所配置的这个QPS等于一,大家看到了吧。然后在这呢,我们给它停掉,然后再看到到这个table,这我们来看一下。
16:04
成功的就是第一个每秒会有一个成功的,对吧?啊,如果在这儿也勾上这个success,那我们就可以看到它每秒才会,每隔一秒才会弹出来一个,然后在这儿清掉,然后再跑。两一个两个三个,大家看这个时间,我现在是北京时间18:13 52秒,53秒,54秒,55秒,56秒,57秒,已经非常严格的去给我们去执行限速了,对吧,每秒才能够成功一个,这是这个,呃,我们的限速的最基本的配置也是基于这个,呃。漏桶算法最基本的配置。
我来说两句