最近笔者继续研究性能测试领域,发现了一款性能神器wrk。大家可能都比较熟悉的是Loadrunner和Jmeter,但其实wrk也相当好用。
什么是wrk?
这里有一段是来自GitHub的wrk项目的介绍英文原话:
wrk is a modern HTTP benchmarking tool capable of generating significant load when run on a single multi-core CPU. It combines a multithreaded design with scalable event notification systems such as epoll and kqueue.
大概意思就是wrk是一个基于HTTP的基准测试工具,可以用来跑单个的多核CPU,可以形成很有效的负载。它将多线程设计与可伸缩的事件通知系统,比如epoll和kQueue,结合在一起。
wrk的安装
首先介绍一下wrk的安装,在windows上安装会比较麻烦,建议用Linux系统上安装使用会非常简便。笔者就以自己的腾讯云服务器为例,进行了一次安装。
我们可以在全球最大同性交友网站找到wrk的源码和地址, 然后复制上面的地址,拷贝到我们的Linux系统上。
在命令行上输入命令:$git clone https://github.com/wg/wrk.git
这样就在我们的系统上拷贝了一份安装和源码备份,接着我们进入到新创建的wrk目录。
输入:$ cd wrk
然后我们可以从GitHub的wrk的使用说明上面可以看到:
wrk should build on most UNIX-like operating systems and architectures that have GNU make and are supported by LuaJIT and OpenSSL. Some systems may require additional CFLAGS or LDFLAGS, see the top of the Makefile for examples, in many cases simply running `make` (often `gmake` on *BSD) will do the trick.
其实安装开启的核心非常简单,只需要一个make命令就足够了,是不是足够简单?
输入:$ make
接下来就是漫长的编译过程,编译完后我们可以查看一下。
编译完成后就是要安装,最简单的方式是拷贝到bin目录来使用。
输入:$ cp wrk/usr/local/bin/
但是我的系统说不允许这样操作,有可能是腾讯云的服务器不允许我这样操作。但接着他推荐了另一个方式,我们来试试。
输入: $ sudo apt install wrk
看起来是成功执行了,等稳定下来之后我们来检查下是否安装成功了。
输入:$ wrk
OK!安装成功了!
简述wrk的工作原理
wrk实际是用了一种叫做多路复用IO(IO multiplexing)的技术。IO multiplexing这个词可能大家有点陌生,但是如果我说select/epoll,可能大家就没那么陌生。有些地方也称这种IO方式为事件驱动IO(event driven IO)。select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。
当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。
要注意的是,如果处理的连接数不是很高的话,使用select/epoll的web server不一定比使用multi-threading + blocking IO的web server性能更好,可能延迟还更大。select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接。在多路复用模型中,对于每一个socket,一般都设置成为non-blocking。
select的优势在于可以处理多个连接,不适用于单个连接。
wrk在实际案例中的运用
wrk最主要有以下的三种命令用法:
-c: 表示总共的连接数
-d: 表示要运行的测试时间
-t: 表示线程数
接下来我们进行一个小小的案例展示,首先创建一个index.html文件,往里面写一些内容,形成一个简单的网站,我用以下的命令实现:
小网站创建完成后,查看一下我们的Linux系统的Python版本是多少,笔者的是2.x版本,所以要用以下命令,来启动Python服务:
如果是3.x版本,则要输入以下命令:
$ python -m http.server 8888
同样可以启动Python服务。接下来我们另开一个终端,输入以下命令:
这样就成功访问到了我们服务器下创建的index.html文件。接下来我们尝试来用wrk来压测这个服务器文件,输入命令:
$ wrk -c20 -t2 -d10s http://localhost:8888/index.html
由于笔者的服务器是比较低端入门级的,所以不敢压太狠,所以只建立了20个连接数,2个线程数,压10秒,之后就可以在我们之前启动Python服务那个终端看到压测的过程。
压测完成后,我们回到前一个终端,就可以看到测试数据已经形成了:
我们可以看看这份迷你报告来进行分析:
Latency是表示时延,Avg是它的平均值,Stdev是一个标准差,Max是最大值,+/- Stdev是标准差范围,一般来说标准差的百分比越高,表示值和平均值的差不大,离散的也不会很大,表示Avg平均值还是相当可信。
数据里主要看到QPS的值,这个核心数据,我压出来的结果是有点压垮服务器了,1558.86应该不算高的值,实在是硬件条件不高的服务器。那QPS就是通过requests/sec运算来得出。
关于wrk的基本用法就介绍完了,更高级的玩法我们下次分解。
读更多的好书,拍更美的照片,写更酷的代码,遇见更有趣的人,愿望是实现从IT菜鸟到全栈工程师的蜕变。