10

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

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

4

3 回答 3

18

您可以通过添加延迟来减慢 localhost(网络)的速度。
使用ifconfig命令查看网络设备:在 localhost 上它可能是lo,在 LAN 上它的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

于 2013-02-07T19:35:23.047 回答
6

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

    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_sleep在一起proxy_pass并得到了不好的结果。这就是为什么我们有将股票指令与东西location /proxy/分开的块。(有关通过拆分块解决的类似冲突,echo请参阅此问题。)

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

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

于 2016-05-11T13:03:35.900 回答
4

我已经修改了一个 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;
            [...]
        }
    }
}

文档在这里。我不相信有一种方法可以使用这种方法来指定统一的延迟。

于 2013-10-24T12:38:05.830 回答