10

私は Facebook キャンバス アプリケーションを開発しており、負荷テストを行いたいと考えています。自動テストに対する Facebook の制限を認識しているので、nginx で提供される偽の Web アプリケーションを作成し、/etc/hosts を変更して、graph.facebook.com が 127.0.0.1 を指すようにすることで、グラフ API 呼び出しをシミュレートしました。

jmeter を使用してアプリケーションの負荷テストを行っていますが、シミュレーションは問題なく動作しています。ここで、遅いグラフ API 応答をシミュレートし、それらがアプリケーションにどのように影響するかを確認したいと考えています。シミュレートされたgraph.facebook.comアプリケーションに送信される各リクエストに遅延を挿入するようにnginxを構成するにはどうすればよいですか?

4

3 に答える 3

18

遅延を追加することで、localhost (ネットワーク) の速度を遅くすることができます。
コマンドを使用ifconfigしてネットワーク デバイスを表示します。ローカルホストでは可能性が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

于 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 /するリクエストは次に進む前に 1 秒間一時停止されます。したがって、私のテスト スイートでは、ネットワークのスローダウンが必要な場合はファイルを作成し、スローダウンを解消したい場合はファイルを削除します。(そして、各テスト間でそれを削除するクリーンアップコードがあります。)理論的には、ファイルよりも変数を使用することを好みますが、問題は、変数がリクエストごとに再初期化されることです。したがってlocation、変数を設定して制限を無効にし、別の変数を無効にするブロックを持つことはできません。(これは私が最初に試したもので、変数の有効期間が原因で失敗しました)。Perl モジュールまたは Lua を使用して変数を保持したり、Cookie をいじったりすることはおそらく可能ですが、私はこれらのルートをたどらないことにしました。

重要事項:

  1. echoモジュールからのディレクティブ (echo_sleepや などecho_exec) を、応答を生成する nginx のストック ディレクティブと混合することはお勧めできません。私は最初にecho_sleep一緒にいてproxy_pass、悪い結果を得ました。そのため、株式ディレクティブをスタッフlocation /proxy/から分離するブロックがあります。(ブロックを分割することで解決された同様の競合については、echoこの問題を参照してください。)

  2. echo_execの内側と外側の 2 つのディレクティブは、if仕組み上必要ifです。

  3. このディレクティブは、クライアントがURLinternalを直接要求するのを防ぎます。/proxy/...

于 2016-05-11T13:03:35.900 に答える