【问题标题】:Using nginx to simulate slow response time for testing purposes使用 nginx 模拟慢响应时间以进行测试
【发布时间】:2013-02-07 14:01:27
【问题描述】:

我正在开发一个 facebook 画布应用程序,我想对其进行负载测试。我知道 facebook 对自动化测试的限制,所以我通过创建一个在 nginx 下服务的假 Web 应用程序并将我的 /etc/hosts 将 graph.facebook.com 指向 127.0.0.1 来模拟图形 api 调用。

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

【问题讨论】:

    标签: nginx jmeter load-testing


    【解决方案1】:

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

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

      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

    【讨论】:

    • 很遗憾,tc 仅适用于 Linux,但不会出现在 OS X 上。
    【解决方案2】:

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

        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 指令混合不是一个好主意。我最初有echo_sleepproxy_pass 并得到了不好的结果。这就是为什么我们有 location /proxy/ 块将股票指令与 echo 东西隔离开来。 (有关通过拆分块解决的类似冲突,请参阅此issue。)

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

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

    【讨论】:

      【解决方案3】:

      我已经修改了一个 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。我不相信有办法使用这种方法指定统一的延迟。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        • 2021-07-21
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 2017-02-13
        • 2012-02-17
        相关资源
        最近更新 更多