wrk 是一个类似 ab(apache bench)、jmeter 的压力测试工具,官方称它为:现代的 HTTP 基准测试工具
用 C 编写的 HTTP 协议压测工具
底层基于 epoll 和 kqueue 实现,使用了多线程和多路复用 IO(非阻塞 IO),利用异步的事件驱动框架,通过很少的线程就可以压出很大的并发量
降低测试工具本身性能开销对测试结果准确性的影响
支持使用 LuaJIT 脚本,可以执行 HTTP 请求生成、响应处理和自定义报告
它的定位
轻量级性能测试工具
仅支持 HTTP 协议
仅支持单机压测,多机器压测需要每个机器都手动执行一次 wrk 命令
不可取代 Jmeter、LR 等专业性能工具
架构&简单源码解析
在 wrk 里面,每个线程都有自己独立的 Lua 虚拟机和 Event Loop
通过命令行参数 -c 指定的连接数,会平均分给所有线程,每个新建的 socket,都会调用 fcntl 将其设置为 NONBLOCK,即非阻塞,然后托管给 Event Loop
直接使用 redis 的 Event Loop 实现,适配了不同操作系统的实现
启动的时候,每个线程都会新建一个 Lua State,并调用 luaL_dofile 加载命令行参数 -s 指定的 lua 脚本文件
如果没有自定义的 lua 脚本,wrk 默认发送的是 HTTP 1.1 GET 请求,用长连接