Jmeter模拟流量并避免429错误

92次阅读
没有评论

问题描述

正在使用Jmeter来研究一些Web服务的性能和容量需求。Jmeter通过向Web服务的URL发送流量来测试服务的性能,流量的速率逐渐增加,以确定服务的失败点。目前,这个流量是由CI/CD流水线中的单台机器生成的。

在真正对资源进行压力测试之前,Web服务器会响应HTTP 429错误。

用户想知道是否有办法在每个连接中设置一些数据,以强制每个连接被视为新连接,而不是被服务器禁止访问。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户提供的信息,这个问题是由Nginx的速率限制功能引起的。解决方案是配置Nginx的速率限制功能,以允许生成流量的URL不受限制。

根据Nginx的文档,可以通过配置白名单来实现。可以将白名单配置为允许特定IP地址的流量不受速率限制。

以下是一个示例配置,用于设置连接的速率限制:

limit_req_zone $binary_remote_addr zone=flood:10m rate=12r/s;
limit_req_zone $binary_remote_addr zone=bot:10m rate=200r/m;
limit_req_status 429;
limit_conn_zone $binary_remote_addr zone=connperip:10m;
limit_conn_status 429;

上面的配置设置了连接的速率限制。可以通过使用键值映射来创建白名单,以模拟布尔条件:

geo $limit {
    default 1;
    10.0.0.0/8 0;
    192.168.0.0/24 0;
}
map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

如果远程地址在白名单中,则会移除速率限制(将其设置为0):

limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;
server {
    location / {
        limit_req zone=req_zone burst=10 nodelay;

方案2

使用脚本或工具来模拟新连接可能会增加复杂性,并且需要确保白名单设置正确。

另一种方法是编写脚本或使用工具来模拟新连接。可以使用Jmeter的BeanShell脚本或其他编程语言来实现这个目标。以下是一个示例BeanShell脚本,可以在每个连接中设置一个新的随机值:

import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy;
import org.apache.jmeter.protocol.http.util.HTTPArgument;

// 获取当前请求的HTTPSamplerProxy
HTTPSamplerProxy sampler = ctx.getCurrentSampler();

// 创建一个新的HeaderManager
HeaderManager headerManager = new HeaderManager();
headerManager.setName("New Header Manager");

// 创建一个新的HTTPArgument,设置一个新的随机值
HTTPArgument argument = new HTTPArgument();
argument.setName("New Argument");
argument.setValue(UUID.randomUUID().toString());
argument.setAlwaysEncoded(false);

// 将HTTPArgument添加到HeaderManager中
headerManager.add(argument);

// 将HeaderManager设置为当前请求的HeaderManager
sampler.setHeaderManager(headerManager);

在这个示例中,我们使用BeanShell脚本来获取当前请求的HTTPSamplerProxy,并创建一个新的HeaderManager。然后,我们创建一个新的HTTPArgument,并将其添加到HeaderManager中。最后,我们将HeaderManager设置为当前请求的HeaderManager。

请注意,这只是一个示例,具体的实现可能因Jmeter版本和具体需求而有所不同。

以上是两种解决方案,根据具体情况选择适合的方法来模拟新连接,以避免被服务器禁止访问。

总结

在使用Jmeter进行性能测试时,如果遇到Web服务器返回HTTP 429错误的情况,可以通过配置Nginx的速率限制功能来解决这个问题。另外,还可以使用脚本或工具来模拟新连接,以避免被服务器禁止访问。根据具体情况选择适合的解决方案。

正文完