起因是,工作中一些接口需要性能测试,首先考录本地代码的测试工具,因为测试工具本身的性能开销很小,更加合适,然后AB(Apache Benchmark)简单便捷,但是,AB的-p参数只支持读取一个post数据文件,然后重复发送一样的内容,在我的接口处理同样数据时,只有第一次是真正的新增,而后只是快速返回之前的数据,所以这并不能体现新增接口的性能。
为了寻求使用AB实现每次发送不同的POST数据,翻了下源代码。
AB的实现很简单,根据不同参数拿到不同的值,直接存到一堆全局变量里面。test函数负责读取一些全局变量,创建socket连接,使用非阻塞的socket,同时创建C个连接,通过-c参数指定的并发数就是这里的连接数,这里并不是多线程去请求,因为是非阻塞,所以直接循环connect即可实现并发。然后用异步的epoll方式取处理封装好的Http请求header及body。发送的次数N由参数-n指定。请求完成之后output_html_results函数或output_results函数计算请求时间之类的结果并输出。
下面来分析下-p参数,-p指定一个文件,这个文件存有Http请求的body。open_postfile函数读取文件内容。apr_file_open,apr_file_info_get,apr_file_read_full是APR库里面封装的文件操作系列函数。AB中用apr_file_read_full读取整个文件内容并存储在全局变量postdata(buffer containing data from postfile)中,然后发送的时候将其拼装到Http的Body通过Socket发送给url。
根据以上-p的原理