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

Raf*_*ira 9 nginx jmeter load-testing

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

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

khi*_*ari 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


Lou*_*uis 8

我之前的答案有效,但它更适合所有请求都需要放慢速度的情况。从那以后,我不得不想出一个解决方案,让我只能根据具体情况打开速率限制,并提出了以下配置。在使用它之前,请务必阅读整个答案,因为有一些重要的细微差别需要了解。

    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;
    }
Run Code Online (Sandbox Code Playgroud)

重要提示:各个路径中是否存在正斜杠会产生影响。例如,proxy_pass http://django如果没有尾部斜杠,则不会执行与上面代码中的行相同的操作。

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

重要笔记:

  1. echo将模块中的指令(例如echo_sleep和)与 nginx 的库存指令混合在一起并不是一个好主意,echo_exec这会导致生成响应。我最初echo_sleep在一起并proxy_pass得到了不好的结果。这就是为什么我们有location /proxy/将股票指令与echo内容分开的块。(有关通过拆分块解决的类似冲突,请参阅此问题。)

  2. 由于工作原理,echo_exec内部和外部的两个指令是必要的。ifif

  3. internal指令阻止客户端直接请求/proxy/...URL。