在上周的性能测试任务中,我遇到了一个问题,折腾了许久。问了一圈,最终解决了。记录一下,感谢耐心给予帮助的大佬们。

事情的起因是这样的:我在用 Jmeter 做压测时发现有一个接口的性能表现很奇怪,这是一个查询接口,tps 从第一分钟达到峰值后开始逐渐降低,同时 CPU 和内存的占用也逐步降低,始终达不到压测的水平。在排查了慢 sql,带宽等常规问题后,未果(这个问题先埋个坑,等我搞明白了再另行介绍)。研发给了我一个条 curl 语句,说你压一下这个接口试试吧,我一看这个命令,长这样:

curl --user abc:111111 -X GET http://192.166.123.456:8081/_search?query=Code=11000020211152B35

乍一看就是个普通的 get 请求么,只不过多了一个访问 ES 的用户名密码罢了,遂将它转入到 jmeter 里,新建一个 http 请求,把参数按下面这样配置:

结果一执行就傻眼了,失败。

400 bad request,说明我这个请求参数写错了,不能这么搞。在排除了不是 search?query=Code=11000020211152B35 这样奇怪的请求形式之后(是的你没看错,这个 key 是 query,value 是 Code=xxxxxxxxxxx,无语)。问题应该还是出在用户名密码的传参上面。

如果这样传参不行,那还有哪些方式呢?搜索一番后我发现在配置元件里有这么一个东西:登录配置元件。长这样:

看起来非常符合要求的样子,但是很可惜,还是 400 bad request。说明我们这个尝试方向也是不对的图片。

一个 get 请求能有多复杂呢,又不像 post 请求那样那么种传参形式。这个参数无非就是 url,header 里这些。已经尝试了两种方式,那还有 header 没有试过,那就再试试呗,但是 header 里要传 key 和 value 这种形式,我又犯了难,到底应该是把用户名当 key 密码当 value,还是遵循传统 username/password 这种分别传呢?二者都尝试过后,统统 400,bad request 图片。

这种问题,问研发他也没办法。因为研发不会用 jmeter,而请求又没有打到服务器上,日志也没有,排错也就无从查起,只能自己想办法解决。在询问了群里一圈大佬之后,有人给我出了一个主意:你看看 postman 是咋实现的?

果不其然,在这里我发现了问题的关键:

在 postman 里,会把这个用户名密码作为一组参数进行加密,放在 Authorization 这个 key 下通过 header 进行传参:

既然如此,问题似乎就很明朗了。没想到在这一步我还是栽了个坑:

还是不行吗,我都快绝望了。没想到就在这山穷水尽之际,没想到问题竟意外地解决了:

我一开始把 Authorization 字段放在了线程组下面的总体信息头管理器下,然后还漏掉了加密字符串前面的 “Basic” 前缀,结果理所当然的失败了 400.

最后我在 http 请求下面又另外新建了一个信息头管理器,把 Authorization 参数放在这里,再次尝试,请求成功。

以上就是我通过将一个带有用户参数的 curl 命令 get 请求转化成 jmeter 压测脚本的问题排查过程。如果觉得有所帮助,欢迎关注我的专栏和同名公众号。


↙↙↙阅读原文可查看相关链接,并与作者交流