不知不觉,维护 boomer 已经两年了。说来也奇怪,接到的性能测试需求,一般都是私有协议的,很难直接用 jmeter 这类通用的工具,一般只能基于 boomer 自己写一个。前不久需要压测 Flume 的 Avro Source,这货偏偏没有一个 Go 的客户端!

由于时间紧,只好用 Java 写一个简单版的命令行工具。事后研究一下 Avro 的 ipc 协议,写了一个玩票性质的 avroipc。最近,索性又写了一个 Java 版的 boomer,即 locust4j。灵感来自一位印度哥们写的 nomadacris,得到他的同意,直接就用了他写的 msgpack 相关序列化和反序列化的代码。实现上,基本上是从 boomer 翻译过来的,除了用线程替代 Goroutine,用 ConcurrentLinkedQueue 替代 channel。

So,现在也可以用 Java 来写 locust 的 slave 部分了,即用 Java 来写压测逻辑。无论是 Go 还是 Java,性能方面都能碾压原生的 Python 实现。boomer 和 locust4j,都是从队列中取出用户侧上报的测试结果,统计汇总后再定时上报的。从测试情况来看,locust4j 统计的性能比 boomer 还要厉害。空跑一个死循环的情况下,在我的 MBP 上可以跑到 200w 的 RPS,boomer 只能到 50w。但很少单实例能压到这么高的 RPS,大部分情况下,CPU 和内存都是实际的压测代码在使用。一般压测服务端,Go 标准库用起来更爽一点,如果是 Java,还要去找一个能利用非阻塞 IO 的客户端,不然线程都阻塞在 IO 操作上了,也快不起来。

目前 locust 的 1.0.0 版本已经发布到 maven 的中心库,用 maven 的项目,声明一下即可使用。

<dependency>
    <groupId>com.github.myzhan</groupId>
    <artifactId>locust4j</artifactId>
    <version>1.0.0</version>
</dependency>

如果不用 maven,可以在 release 页面 下一个预先编译好的 jar 包。

在代码库中,有一个用于测试的小程序,里面包含了所有 locust4j 提供的 API。

由于 JVM 中 JIT 和 GC 的存在,locust4j 收集到的响应时间,有可能是错的,用的时候需要注意。JIT 会导致响应时间逐渐变短,GC 会导致响应时间偶尔变长。实际的结果,需要参考被测程序的反应。

Enjoy!