web-dev-qa-db-ja.com

合計帯域幅を制限せずに、個々のHTTP要求の帯域幅を制限します

tcwondershaperhtbcomcast のようなツールを見ると、これらのツールはすべて、次のレベルで動作しているようです。帯域幅を制限するためのネットワークインターフェイスまたは少なくとも「接続グループ」。接続のグループの帯域幅をではなく調整したいのですが、代わりに個々の接続の最大レートを調整したいと思います。

具体的には、個々のHTTPリクエストの最大ダウンロードレートを形成するために使用できるツールはありますか?

詳細

私が探しているのは、S3のバケットからフェッチする遅いリクエストをエミュレートすることです。データセンターから離れた場所にあるリクエストの場合、個々のアイテムのダウンロードは通常遅い(<500 kb/s)が、並行してダウンロードするとダウンロード速度が5 mb/sを超えることがわかります。

これらのリクエストにレイテンシーを追加することで、おそらくその方法の一部を得ることができます(これにより、シリアルリクエスト全体で速度が低下しますが、帯域幅全体では遅くなりません)が、より直接的な解決策があれば素晴らしいでしょう。

5
turtlemonvh

limit_ratenginx の設定は、他のレスポンダーが推奨するイカとワニスの問題のいくつかを克服しているようです。ドキュメントから:

クライアントへの応答送信の速度を制限します。レートは1秒あたりのバイト数で指定されます。ゼロ値はレート制限を無効にします。制限はリクエストごとに設定されるため、クライアントが2つの接続を同時に開くと、全体のレートは指定された制限の2倍になります。

私のシナリオでは、個々のリクエストの大きなファイルに対して転送されるダウンロードバイトの速度を制限しようとしていますwithoutクライアントの全体的な帯域幅を制限する場合、これはまさに私が必要とするものです。

いか

Squidの 遅延プール クライアントをグループ化し(通常はIPで)、バケット化されたレート制限を使用します。しかし ドキュメントでさえ

単一のHTTPリクエストの接続速度を制限することはできません。

ワニス

ワニスの vmod_vsthrottle (および同様に libvmod-throttle )は、トークンバケットアルゴリズムで機能し、任意のキーを取得します。実装は非常にクールに見えますが、トラフィックを遅くする良い方法はないようです。代わりに、制限(req/s)を超える要求は、 429 のように応答されます。

1
turtlemonvh

あなたの要件に応じて、私は提案したいと思います Varnish そしてそれは高く評価されているHTTPキャッシングサーバーです。 Webサーバー層の前に配置され、コンテンツをRAMにキャッシュするため、後続のリクエストは可能な限り迅速に処理されます。

次のリファレンス記事は、CentOのWebサーバーにワニスをインストールして構成する方法をうまく示しています。

編集する構成ファイルは、/ etc/sysconfig/varnish/ etc/varnish /の2つです。 default.vcl

編集default.vcl帯域幅の問題を最適化できます。私はすでにサーバーにインストールしています。

例として、構成は次のようになります。

backend web1 {
    .Host = "PUBLIC_IP_ADDRESS";
    .port = "80";
    .probe = {
        .url = "/";
        .interval = 5s;
        .timeout = 1s;
        .window = 5;
        .threshold = 3;
    }
}

詳細参照:CentOS6でVarnish4をキャッシュサーバーおよびロードバランサーとしてセットアップ

2