私は現在、サーバー上で node.js をテストしており、Apache の「ab」ユーティリティを使用して非常に基本的なベンチマークを実行していましたが、頭を悩ませる結果が得られています。
そのため、セットアップと「コントロール」の簡単な背景を説明します。
- サーバーに node.js をセットアップしました。アドレスを入力すると、1 行で応答します。
"<html><body>hello</body></html>"
-ブラウザが返されるデータのタイプを認識できるように、応答のヘッダーが正しく設定されています
"Content-Type": "text/html"
これを Web ブラウザーから要求すると、すべてうまくいきます。Wireshark を使用して、ブラウザとサーバーの間のやり取りを表示しましたが、かなり正常に見えます。
Source Destination Protocol Info
10.1.10.51 | xxx.xx.xxx.xx | TCP | 50281 > http [SYN]
10.1.10.51 | xxx.xx.xxx.xx | HTTP | GET / HTTP/1.1
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50281 [SYN ACK]
10.1.10.51 | xxx.xx.xxx.xx | TCP | 50281 > http [ACK]
xxx.xx.xxx.xx | 10.1.10.51 | TCP | [TCP segment of a reassembled PDU]
10.1.10.51 | xxx.xx.xxx.xx | TCP | 50278 > http [ACK]
xxx.xx.xxx.xx | 10.1.10.51 | HTTP | HTTP/1.1 200 OK (text/html)
Apacheの「ab」を使用してまったく同じことをテストすると、問題が発生します。実行するコマンドは次のとおりです。
sudo ab -n 1 http://xxx.xx.xxx.xx/
さて、「ab」は正常に終了し、期待どおりのレポートを提供しますが、実際に node.js サーバーと Wireshark を介してトラフィックを表示すると、完全に二乗できないトラフィックがいくつか見られ
ます。リクエストは1つだけです。しかし、Wireshark でパケットを見ると、1 つの要求だけではありません。
Source Destination Protocol Info
10.1.10.51 | xxx.xx.xxx.xx | TCP | 50314 > http [SYN]
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50314 [SYN ACK]
10.1.10.51 | xxx.xx.xxx.xx | TCP | 50314 > http [ACK]
10.1.10.51 | xxx.xx.xxx.xx | HTTP | GET / HTTP/1.0
10.1.10.51 | xxx.xx.xxx.xx | HTTP | GET / HTTP/1.0 GET / HTTP/1.0 GET / HTTP/1.0 GET / HTTP...
10.1.10.51 | xxx.xx.xxx.xx | HTTP | GET / HTTP/1.0
10.1.10.51 | xxx.xx.xxx.xx | HTTP | GET / HTTP/1.0 GET / HTTP/1.0 GET / HTTP/1.0 GET / HTTP...
10.1.10.51 | xxx.xx.xxx.xx | HTTP | GET / HTTP/1.0
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50314 [ACK]
10.1.10.51 | xxx.xx.xxx.xx | HTTP | GET / HTTP/1.0 GET / HTTP/1.0 GET / HTTP/1.0 GET / HTTP...
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50314 [ACK]
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50314 [ACK]
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50314 [ACK]
10.1.10.51 | xxx.xx.xxx.xx | HTTP | GET / HTTP/1.0 GET / HTTP/1.0 GET / HTTP/1.0 GET / HTTP...
10.1.10.51 | xxx.xx.xxx.xx | HTTP | GET / HTTP/1.0 GET / HTTP/1.0 GET / HTTP/1.0 GET / HTTP...
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50314 [ACK]
xxx.xx.xxx.xx | 10.1.10.51 | TCP | [TCP segment of a reassembled PDU]
10.1.10.51 | xxx.xx.xxx.xx | HTTP | GET / HTTP/1.0
xxx.xx.xxx.xx | 10.1.10.51 | HTTP | HTTP/1.1 200 OK (text/html)
10.1.10.51 | xxx.xx.xxx.xx | TCP | 50314 > http [ACK]
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50314 [RST]
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50314 [RST]
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50314 [RST]
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50314 [RST]
xxx.xx.xxx.xx | 10.1.10.51 | TCP | http > 50314 [RST]
「ab」はプロファイリング手順の一部として追加のリクエストを行うと思いますが、node.js がすべての「GET」に応答する原因にもなっています。
これが「ab」からの「予想される」動作である場合、それはそれほど問題ではないと思いますが、想定するのではなく、確実に知りたいです。
「ab」に1 つのリクエストを指定すると、1 つのリクエストが期待されますが、このユーティリティの動作について何かが欠けている可能性があります。
マニュアルの適切なセクションへの考えやリンクをいただければ幸いです。
ありがとう。