使用nginx模拟缓慢的响应时间以进行测试

时间:2013-02-07 14:01:27

标签: nginx jmeter load-testing

我正在开发一个facebook canvas应用程序,我想加载测试它。我知道facebook对自动化测试的限制,所以我通过创建一个在nginx下提供的虚假Web应用程序并将我的/ etc / hosts更改为指向graph.facebook.com到127.0.0.1来模拟图形api调用。

我正在使用jmeter对应用程序进行加载测试,模拟工作正常。现在我想模拟慢图api响应,看看它们如何影响我的应用程序。如何配置nginx以便为发送到模拟graph.facebook.com应用程序的每个请求插入延迟?

3 个答案:

答案 0 :(得分:12)

您可以通过添加延迟来降低localhost(网络)的速度 使用ifconfig命令查看网络设备:在localhost上可能是lo,在LAN上是eth0

  • 添加延迟使用此命令(在lo网络设备上添加1000毫秒延迟)

    tc qdisc add dev lo root netem delay 1000ms

  • 改变延迟使用这个

    tc qdisc change dev lo root netem delay 1ms

  • 查看当前延迟

    tc qdisc show dev lo

  • 并删除延迟

    tc qdisc del dev lo root netem delay 1000ms

答案 1 :(得分:3)

我之前的回答有效,但它更适合所有请求都需要放慢速度的情况。我已经提出了一个解决方案,只允许我根据具体情况打开速率限制,并提出以下配置。在使用之前一定要阅读完整的答案,因为要了解重要的细微差别。

    location / {
        if (-f somewhere/sensible/LIMIT) {
           echo_sleep 1;
           # Yes, we need this here too.
           echo_exec /proxy$request_uri;
        }

        echo_exec /proxy$request_uri;
    }

    location /proxy/ {
        internal;
        # Ultimately, all this goes to a Django server.
        proxy_pass http://django/;
        proxy_set_header Host            $http_host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }

重要提示:各种路径中是否存在正斜杠会产生影响。例如,proxy_pass http://django没有尾部斜杠,做与上面代码中的行相同的事情。

操作原理很简单。如果文件somewhere/sensible/LIMIT存在,则匹配location /的请求会暂停一秒钟,然后再继续。所以在我的测试套件中,当我想要网络减速时,我创建了文件,当我想删除减速时,我将其删除。 (我有清理代码,可以在每次测试之间删除它。)理论上我更喜欢使用变量而不是文件,但问题是每个请求都会重新初始化变量。所以我们不能有一个location块来设置一个变量来转动限制,而另一个块来关闭它。 (这是我尝试过的第一件事,由于变量的生命周期而失败了)。可能会使用Perl模块或Lua来保存变量或者使用cookie,但我决定不再使用这些路径。

重要说明:

  1. echo模块(如echo_sleepecho_exec)中的指令与nginx的stock指令混合,导致生成a响应。我最初与echo_sleep一起proxy_pass并得到了糟糕的结果。这就是为什么我们有location /proxy/块将股票指令与echo的东西隔离开来的原因。 (有关通过拆分块解决的类似冲突,请参阅此issue。)

  2. 由于echo_exec的工作方式,if内外的两个if指令是必需的。

  3. internal指令阻止客户直接请求/proxy/...个网址。

答案 2 :(得分:2)

我修改了一个nginx配置,使用limit_req_zonelimit_req来引入延迟。以下内容将服务速率降低到每秒20个请求(rate=20r/s)。我已设置burst=1000,以便我的应用程序无法获得503响应。

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=20r/s;
    [...]
    server {
        [...]
        location / {
            limit_req zone=one burst=1000;
            [...]
        }
    }
}

文档为here。我不相信有办法用这种方法指定统一延迟。