9

nodejs のテストを開始したばかりで、次の動作を理解するための助けが必要です。

例 #1:

var http = require('http');
http.createServer(function(req, res){
    res.writeHeader(200, {'Content-Type': 'text/plain'});
    res.end('foo');
}).listen(1001, '0.0.0.0');

例 #2:

var http = require('http');
http.createServer(function(req, res){
    res.writeHeader(200, {'Content-Type': 'text/plain'});
    res.write('foo');
    res.end('bar');
}).listen(1001, '0.0.0.0');

Chrome で応答時間をテストする場合:

例 #1 - 6 ~ 10 ミリ秒
例 #2 - 200 ~ 220 ミリ秒

ただし、nginx proxy_pass を介して両方の例をテストする場合

server{
    listen 1011;
    location / {
        proxy_pass http://127.0.0.1:1001;
    }
}

私はこれを得る:

例 #1 - 4 ~ 8 ミリ秒
例 #2 - 4 ~ 8 ミリ秒

私はnodejsまたはnginxの専門家ではありません。誰かがこれを説明できるかどうか尋ねますか?

nodejs - v.0.8.1
nginx - v.1.2.2

アップデート:

Hippo のおかげで、nginx の有無にかかわらず、サーバーで ab を使用してテストを行い、反対の結果が得られました。

nginx config proxy_cache offにも追加されました

server{
    listen 1011;
    location / {
        proxy_pass http://127.0.0.1:1001;
        proxy_cache off;
    }
}

例 #1 直接:

ab -n 1000 -c 50 http:// 127.0.0.1:1001/

    サーバー ソフトウェア:        
    サーバーのホスト名: 127.0.0.1
    サーバーポート: 1001

    ドキュメント パス: /
    ドキュメントの長さ: 65 バイト

    同時実行レベル: 50
    テストにかかった時間: 1.018 秒
    リクエストの完了: 1000
    失敗したリクエスト: 0
    書き込みエラー: 0
    合計転送: 166000 バイト
    HTML 転送: 65000 バイト
    1 秒あたりのリクエスト数: 981.96 [#/秒] (平均)
    リクエストあたりの時間: 50.919 [ms] (平均)
    リクエストあたりの時間: 1.018 [ms] (すべての同時リクエストの平均)
    転送速度: 159.18 [Kbytes/sec] 受信

    接続時間 (ミリ秒)
                  最小平均[+/- sd] 中央値最大
    接続: 0 0 0.6 0 3
    処理: 0 50 44.9 19 183
    待機中: 0 49 44.8 17 183
    合計: 1 50 44.7 19 183

例 #1 nginx:

ab -n 1000 -c 50 http:// 127.0.0.1:1011/

    サーバー ソフトウェア: nginx/1.2.2
    サーバーのホスト名: 127.0.0.1
    サーバーポート: 1011

    ドキュメント パス: /
    ドキュメントの長さ: 65 バイト

    同時実行レベル: 50
    テストにかかった時間: 1.609 秒
    リクエストの完了: 1000
    失敗したリクエスト: 0
    書き込みエラー: 0
    合計転送: 187000 バイト
    HTML 転送: 65000 バイト
    1 秒あたりのリクエスト数: 621.40 [#/秒] (平均)
    リクエストあたりの時間: 80.463 [ms] (平均)
    リクエストあたりの時間: 1.609 [ms] (すべての同時リクエストの平均)
    転送速度: 113.48 [Kbytes/sec] 受信

    接続時間 (ミリ秒)
                  最小平均[+/- sd] 中央値最大
    接続: 0 0 0.6 0 3
    処理: 2 77 44.9 96 288
    待機中: 2 77 44.8 96 288
    合計: 3 78 44.7 96 288

例 #2 直接:

ab -n 1000 -c 50 http:// 127.0.0.1:1001/

    サーバー ソフトウェア:        
    サーバーのホスト名: 127.0.0.1
    サーバーポート: 1001

    ドキュメント パス: /
    ドキュメントの長さ: 76 バイト

    同時実行レベル: 50
    テストにかかった時間: 1.257 秒
    リクエストの完了: 1000
    失敗したリクエスト: 0
    書き込みエラー: 0
    合計転送: 177000 バイト
    HTML 転送: 76000 バイト
    1 秒あたりのリクエスト数: 795.47 [#/秒] (平均)
    リクエストあたりの時間: 62.856 [ms] (平均)
    リクエストあたりの時間: 1.257 [ms] (すべての同時リクエストの平均)
    転送速度: 137.50 [Kbytes/sec] 受信

    接続時間 (ミリ秒)
                  最小平均[+/- sd] 中央値最大
    接続: 0 0 0.3 0 2
    処理: 0 60 47.8 88 193
    待機中: 0 60 47.8 87 193
    合計: 0 61 47.7 88 193

例 #2 nginx:

ab -n 1000 -c 50 http:// 127.0.0.1:1011/

    サーバー ソフトウェア: nginx/1.2.2
    サーバーのホスト名: 127.0.0.1
    サーバーポート: 1011

    ドキュメント パス: /
    ドキュメントの長さ: 76 バイト

    同時実行レベル: 50
    テストにかかった時間: 1.754 秒
    リクエストの完了: 1000
    失敗したリクエスト: 0
    書き込みエラー: 0
    合計転送: 198000 バイト
    HTML 転送: 76000 バイト
    1 秒あたりのリクエスト数: 570.03 [#/秒] (平均)
    リクエストあたりの時間: 87.715 [ms] (平均)
    リクエストあたりの時間: 1.754 [ms] (すべての同時リクエストの平均)
    転送速度: 110.22 [Kbytes/sec] 受信

    接続時間 (ミリ秒)
                  最小平均[+/- sd] 中央値最大
    接続: 0 0 0.4 0 2
    処理: 1 87 42.1 98 222
    待機中: 1 86 42.3 98 222
    合計: 1 87 42.0 98 222


結果はより論理的に見えるようになりましたが、呼び出し時に奇妙な遅延が発生しますres.write()

ばかげた質問だったと思いますが(確かにそう見えます)、このサーバー構成(Centos 6)とこの具体的なサーバー(vps)を使用すると、ブラウザーでの応答時間に大きな違いが生じます。

私の自宅のコンピューター(Ubuntu 12)では、ローカルホストからテストする古いバージョンではすべて正常に動作します。


4

2 に答える 2

5

http.js を覗いてみると、ケース 1 には nodejs 自体に特別な処理があり、ある種のショートカット最適化が行われていることがわかります。

var hot = this._headerSent === false &&
            typeof(data) === 'string' &&
            data.length > 0 &&
            this.output.length === 0 &&
            this.connection &&
            this.connection.writable &&
            this.connection._httpMessage === this;

      if (hot) {
        // Hot path. They're doing
        //   res.writeHead();
        //   res.end(blah);
        // HACKY.

        if (this.chunkedEncoding) {
          var l = Buffer.byteLength(data, encoding).toString(16);
          ret = this.connection.write(this._header + l + CRLF +
                                      data + '\r\n0\r\n' +
                                      this._trailer + '\r\n', encoding);
        } else {
          ret = this.connection.write(this._header + data, encoding);
        }
        this._headerSent = true;

      } else if (data) {
        // Normal body write.
        ret = this.write(data, encoding);
      }

      if (!hot) {
        if (this.chunkedEncoding) {
          ret = this._send('0\r\n' + this._trailer + '\r\n'); // Last chunk.
        } else {
          // Force a flush, HACK.
          ret = this._send('');
        }
      }

      this.finished = true;
于 2012-07-04T22:05:03.557 に答える
4

サンプル ファイルを取り上げ、 HTTP サーバーのパフォーマンスをベンチマークするための適切なabツールとして (Apache Benchmark) を使用しました。

例 1:

Concurrency Level:      50
Time taken for tests:   0.221 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      104000 bytes
HTML transferred:       3000 bytes
Requests per second:    4525.50 [#/sec] (mean)
Time per request:       11.049 [ms] (mean)
Time per request:       0.221 [ms] (mean, across all concurrent requests)
Transfer rate:          459.62 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.7      0       4
Processing:     1   11   6.4     10      32
Waiting:        1   11   6.4     10      32
Total:          1   11   6.7     10      33

例 2:

Concurrency Level:      50
Time taken for tests:   0.256 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      107000 bytes
HTML transferred:       6000 bytes
Requests per second:    3905.27 [#/sec] (mean)
Time per request:       12.803 [ms] (mean)
Time per request:       0.256 [ms] (mean, across all concurrent requests)
Transfer rate:          408.07 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.6      0       4
Processing:     1   12   7.0     12      34
Waiting:        1   12   6.9     12      34
Total:          1   12   7.1     12      34

ノート:

2 番目の例は、最初の例と同じくらい高速です。わずかな違いは、おそらくコード内の追加の関数呼び出しと、ドキュメント サイズが最初のものよりも大きいという事実によって引き起こされます。

于 2012-07-04T21:26:17.750 に答える