3

次のような jQuery POST 呼び出しがあるとします。

$.post(url : "myserver/1", data : params, success: function () { 
    $.post(url : "myserver/2", data : params2); 
});

これにより、いくつの HTTP 接続が開かれますか? 2が開くと思います。

Web ページが Python スクリプトで行うことを (パフォーマンス テスト タイプのスクリプトとして) 複製しようとしています。私がすれば、はるかに高速です:(疑似コード)

for i in 0 to 5000:
     Open HTTP Connection
     POST
     POST
     Close HTTP Connection

for i in 0 to 5000:
     Open HTTP Connection
     POST
     Close
     Open HTTP Connection
     POST
     Close

2 番目のテストは、ブラウザーが行うことだと思います。私は本質的に、ページへの 5000 ヒット (連続) がどれだけ速いかを再現したいと考えています。明らかに、このタスクを並列化できますが、それは私がここで探しているものではありません

さて、jquery が 2 つの HTTP 接続を行っていると仮定すると、永続的な接続を維持する簡単な方法はありますか?

4

1 に答える 1

5

jQuery は接続数を制御できません。ブラウザーは好きなだけ (通常は 2 ~ 8) 開き、要求をプッシュします。2 番目の要求を開始する前に最初の要求が完了するのを待っているため、コードはおそらく 1 つの接続しか開きません。

もちろん、javascript でスレッドを使用することはできませんが、一度に好きなだけ多くの要求を開始することができます。これにより、ブラウザーが許可する接続数が最大になる可能性があります。

おそらく次のようなものが必要です。

var CONCURRENCY=4, qty = 5000, cnt = 0
function testOnce() {
  cnt = cnt + 1;
  if (cnt >= qty) { return; }
  $.post(url : "myserver/" + cnt, data : params, success: testOnce)
}
for (var i=0; i<CONCURRENCY; i++) {
  testOnce()
}

この方法でも、いくつかの接続のみを開き、それらの接続を介してすべてのリクエストを送信します。これでは、tcp のセットアップとティアダウンを含め、サーバー アプリケーションに求めているような打撃は与えられません。ブラウザーは、1 つのサーバーに打撃を与えないように特別に設計されています。要求が多すぎると、ブラウザーのネットワーク マネージャーで利用可能な接続を待機することになります。

サーバーで http keep-alive を無効にすると、さらに近づきますが、それができないか、結果に影響を与える可能性があります。無効にすると、各リクエストは強制的に新しい接続を確立します。しかし、それは非現実的なほど悲観的です。それはすべて依存します。現実的な負荷テストはそれほど簡単ではありません。しかし、多くの場合、それほど現実的である必要はありません。本当にテストしたいものは何ですか?

Wiresharkは、実際に何が起こっているかの核心を示します。

于 2012-06-28T23:22:44.753 に答える