1、前言
  近工作需要测试nginx反向代理的性能,于是找了一些http测试工具,例如经典的Apache的ab、siege、wrk。wrk使用多线程事件驱动方式,支持lua脚本扩展。关于wrk介绍可以参考:https://github.com/wg/wrk。测试http的性能,主要关注的是QPS(每秒处理的请求数目),QPS越高说明web站点的性能越好。测试这个参数,需要工具能够发生多个连接。涉及到网络编程的一些知识,如何同时使用connect建立多个连接,如何控制connect超时,如何判断fd可读还是可写。linux网络套接字默认都是阻塞的,使用阻塞的套接字很难实现大量的请求,需要使用非阻塞,快速创建连接,轮询连接的状态来出来网络事件。
  自己对这些地方不求甚解,如有借此机会分析一下wrk的源码,如何发送大量的并发连接,学习一下常见的网络编程框架。
  2、wrk的基本介绍
  wrk支持多线程,每个线程之间是独立的,线程中使用经典的事件驱动模型来创建连接、处理连接,wrk支持参数配置,主要是参数如下:

  wrk使用如下:

  3、wrk使用技术介绍
  wrk是一个典型的linux客户端网络程序,能够创建和处理大量的并发连接,使用的技术有多线程,网络编程、http协议解析、ssl协议,lua脚本引擎。wrk使用了redis的事件驱动库,关于事件驱动模型(一般是由事件收集器、事件发送器和事件处理器三部分组成基本单元组成),可以参考:https://gist.github.com/jcouyang/9914091
  事件驱动模型是为了解决传统服务器与网络工作负载的需求的不匹配,实现高度可伸缩服务器,并降低内存开销。事情驱动模型更改了连接到服务器的方式。所有的连接都由事件循环管理,每个连接触发一个在事件循环进程中运行的事件,而不是为每个连接生成一个新的OS线程,并为其分配一些配套内存。因此不用担心出现死锁,而且不会直接调用阻塞资源,而采用异步的方式来实现非阻塞式I/O。通过事件驱动模型是的在相同配置的服务器能接受更多的并发请求,实现可伸缩的服务器。