服务端的性能测试(二)

通过上一篇的讲解,我们已经了解了一些性能测试的指标了,也知道性能测试的主要手段是通过发生出一些模拟真实业务的请求来造成压力对被测系统进行不停的加压,在这同时监控被测服务器的各项性能指标,分析被测服务器在不同压力的测试下的表现,找出其可以突破的性能瓶颈。

        那么,如何对系统进行性能测试,又如何对服务器的各种指标数据进行监控呢?这里,就不得不提到性能测试工具了。

        在这之前,我们可以尝试着先试想下在没有性能测试工具的前提下,如何对一个系统进行一次压力测试

        假设现在我们要对一个接口进行一次性能测试,模拟在15个用户在线使用这个接口返回的数据是否可以在一个可接受的时间内返回正确的数据。

        理所当然的,我们可以想到测试的必要条件有如下几点:

  • 15个线程同时并发运行,产生访问压力

  • 1个线程协调程序,对15个线程的协调控制,实现并发操作

  • 1个数据记录线程,对每一个线程的操作耗时数据进行记录、监控、汇总和分析

  • 1个服务器资源监控线程,对15个线程访问服务器的时长和服务器的性能指标进行汇总,计算其平均值

        可以看出,要通过手动来进行性能测试,过程中上极其繁琐,需要投入的时间和资源非常多,而且这仅仅是一个很简单的场景,没有进行一些复杂操作。设想,如果要进行数万并发,服务器有好几十台,显而易见,这种情况下是完全不可能通过一个简单的程序或者脚本可以解决的。这就是性能测试工具存在的原因和用处。

        性能测试工具市面上有很多,除了我们耳熟能详的LoadRunner、Jmeter等测试工具,还有一些知名度不高但是有一些自己优点的性能测试工具,比如今天我给大家推荐一款有特点性能测试工具:Locust

  目前阶段,Locust工具在国内的普遍性还是很低的,多数测试同学可能之前都没有了解过这款工具。为了便于理解,我先将Locust和LoadRunner、Jmeter这类大众耳熟能详的性能测试工具进行简单对比。

\ LoadRunner Jmeter Locust
授权方式 收费 开源免费 开源免费
开发语言 C/Java Java Python
测试脚本形式 C/Java GUI Python
并发机制 进程/线程 线程 协程
单机并发能力
分布式压力 支持 支持 支持
资源监控 支持 不支持 不支持
报告与分析 完善 简单图表 简单图表
支持二次开发 不支持 支持 支持

        那么对于这个工具的优缺点大家一目了然。Locust的最大优点就是这个工具可以实现一个单机超高的并发量。一个性能测试的工具核心就是要有一个好的压力发生器,那么不同于LoadRunner、Jmeter这些工具,Locust采用的并发机制为协程。使用多线程模拟多个并发用户时候,线程数会随着并发数量的增加而一直增加,但是在不同的线程之间来回切换是需要占用资源的,线程的等待和io的阻塞会无法避免的导致并发的效率下降。正是因为如此才用进程和线程的机制会难以模拟出较高并发的的压力,而协程的优势则在于,避免系统的资源调度,从而大幅的提高了性能。正常的情况下单台测试机器可以产生数千的并发压力,这是LoadRunner、Jmeter都无法实现的。

        另一方面的优点是模拟用户操作的便捷,对测试脚本的友好性,Locust采用Pure Python脚本描述,对于测试同学十分容易接受,并且http请求完全基于Requests库。了解Requests库的同学都知道,python官方明确推荐使用的库。简洁易用但是功能却十分强大,很多其他编程语言的http库都会借鉴Requests的思想和模式。个人觉得这是最好用的http库。除了http协议,Locust也可以测试其它任意协议,只需使用Python调用对应的库进行发送请求即可。

        有了一个相对不错的引擎,外部的包装就显得很简陋,对于Locust的缺点也是很明显:在性能指标监控和测试报告图表方面比较缺失,不过好在是Locust的核心代码数量少,并且开源的,有兴趣的同学可以将其包装并且封装成自己想要的样子。

posted @ 2017-08-21 09:05  张老师的小黑屋  阅读(492)  评论(0编辑  收藏  举报