HTTP 時間を理解して測定すると、クライアントからサーバー、またはサーバーからサーバーの通信におけるパフォーマンスのボトルネックを発見するのに役立ちます。 この記事では、HTTP リクエストの時間オーバーヘッドについて説明し、Node.js でそれを測定する方法を示します。
HTTP 時間のオーバーヘッドを理解する前に、いくつかの基本概念を見てみましょう:
IP (インターネット プロトコル): IP は、ネットワーク アドレス指定とルーティングを含むネットワーク層プロトコルです。 IP は、1 つ以上の IP ネットワーク上のパケット ヘッダーに基づいて、送信元ホストから宛先ホストにパケットを配信する役割を果たします。 また、配信されるデータをカプセル化するパケット構造も定義します。
DNS (ドメイン ネーム サーバー): DNS は、risingstack.com などの人が読めるホスト名を機械が読める IP アドレスに解決するために使用される階層型分散命名システムです。
TCP (伝送制御プロトコル): TCP 標準は、データを交換するためにアプリケーション間でネットワーク会話を確立および維持する方法を定義します。 TCP は、IP ネットワーク経由で通信するホスト上で実行されているアプリケーション間で、信頼性が高く、順序付けられ、エラー チェックされたオクテットのストリームを提供します。 HTTP クライアントは、TCP 接続を確立することによってリクエストを開始します。
SSL/TLS (Transport Layer Security): TLS は、コンピューター ネットワーク上の通信セキュリティを提供する暗号化プロトコルです。 SSL (Secure Sockets Layer) は、TLS の前身で非推奨になりました。 TLS と SSL はどちらも証明書を使用して安全な接続を確立します。 SSL 証明書は暗号化プロトコル (TLS など) に依存せず、証明書には公開キーと秘密キーのキー ペアが含まれています。 これらのキーは連携して暗号化された接続を確立します。
次に、典型的な HTTP リクエストのタイムラインを見てみましょう:
DNS ルックアップ: DNS ルックアップの実行にかかる時間。 DNS ルックアップはドメイン名を IP アドレスに解決します。 新しいドメインごとに、DNS ルックアップの完全な往復が必要になります。 宛先がすでに IP アドレスである場合、DNS ルックアップは行われません。
TCP 接続: 送信元ホストと宛先ホストの間で TCP 接続を確立するのに必要な時間。 接続は、マルチステップ ハンドシェイク中に正しく確立される必要があります。 TCP 接続はオペレーティング システムによって管理され、基礎となる TCP 接続を確立できない場合、OS 全体の TCP 接続タイムアウトがアプリケーションのタイムアウト構成に入ります。
TLS ハンドシェイク: TLS ハンドシェイクを完了する時間です。 ハンドシェイク中に、エンドポイントは認証とキーを交換して、安全なセッションを確立または再開します。 HTTPS リクエストには TLS ハンドシェイクは必要ありません。
最初のバイトまでの時間 (TTFB): 最初の応答を待つ時間。 この時間は、サーバーがリクエストを処理して応答を配信するのを待機するのに費やした時間に加えて、サーバーとの間の遅延をキャプチャします。
コンテンツ転送: 応答データの受信にかかる時間。 応答データのサイズと利用可能なネットワーク帯域幅によって、その期間が決まります。
HTTP 時間のオーバーヘッドによるパフォーマンスのボトルネックを発見するにはどうすればよいですか?
たとえば、DNS クエリに予想より時間がかかる場合は、DNS プロバイダーまたは DNS キャッシュ設定に問題がある可能性があります。
コンテンツ配信の遅さは、大量のデータ (未使用の JSON プロパティなど) の送り返しや接続の遅さなど、非効率な対応メカニズムが原因で発生する可能性があります。
Node.js で HTTP 時間のオーバーヘッドを測定する
Node.js で HTTP 時間のオーバーヘッドを測定するには、特定のリクエスト、レスポンス、ソケット イベントをサブスクライブする必要があります。 Node.js でこれを行う方法を示す短いコード スニペットを次に示します。この例はタイミングのみに焦点を当てています:
const timings = { // use process.hrtime() as it's not a subject of clock drift startAt: process.hrtime(), dnsLookupAt: undefined, tcpConnectionAt: undefined, tlsHandshakeAt: undefined, firstByteAt: undefined, endAt: undefined } const req = http.request({ ... }, (res) => { res.once('readable', () => { timings.firstByteAt = process.hrtime() }) res.on('data', (chunk) => { responseBody += chunk }) res.on('end', () => { timings.endAt = process.hrtime() }) }) req.on('socket', (socket) => { socket.on('lookup', () => { timings.dnsLookupAt = process.hrtime() }) socket.on('connect', () => { timings.tcpConnectionAt = process.hrtime() }) socket.on('secureConnect', () => { timings.tlsHandshakeAt = process.hrtime() }) })
DNS ルックアップはドメイン名がある場合にのみ発生します:
/ There is no DNS lookup with IP address const dnsLookup = dnsLookupAt !== undefined ? getDuration(startAt, dnsLookupAt) : undefined
TCP 接続はホスト解決が発生した直後に行われます:
const tcpConnection = getDuration((dnsLookupAt || startAt), tcpConnectionAt)
TLS ハンドシェイク (SSL) は https プロトコルのみを使用できます:
// There is no TLS handshake without https const tlsHandshake = tlsHandshakeAt !== undefined ? getDuration(tcpConnectionAt, tlsHandshakeAt) : undefined
サーバーが最初のバイトの送信を開始するのを待ちます:
const firstByte = getDuration((tlsHandshakeAt || tcpConnectionAt), firstByteAt)
開始日と終了日から計算された合計期間:
const total = getDuration(startAt, endAt)
例全体を参照してください。 https://github.com/RisingStac... リポジトリをチェックしてください。
時間を測定するツール
Node を使用して HTTP 時間を測定する方法がわかったので、HTTP リクエストを理解するために使用できる既存のツールについて説明します。
リクエストモジュール
有名なリクエストモジュールには、HTTP タイミングを測定するためのメソッドが組み込まれています。 time 属性を使用して有効にできます。
const request = require('request') request({ uri: 'https://risingstack.com', method: 'GET', time: true }, (err, resp) => { console.log(err || resp.timings) })
分散トレーシング
分散トレーシング ツールを使用して HTTP タイミングを収集し、タイムライン上で視覚化できます。 こうすることで、舞台裏で何が起こっているのか、分散システムの構築に実際にどれくらいのコストがかかるのかを完全に把握できます。
RisingStack の opentracing-auto ライブラリには、OpenTracing 経由ですべての HTTP 時間を収集するためのフラグが組み込まれています。
Jaeger の opentracing-auto を使用した HTTP リクエストのタイミング。
概要
Node.js を使用して HTTP 時間を測定すると、パフォーマンスのボトルネックを見つけるのに役立ちます。 Node エコシステムは、アプリケーションからこれらのメトリクスを抽出するための優れたツールを提供します。
関連する推奨事項:
PHP で HTTP リクエストを送信するいくつかの方法を共有します
HTTPのさまざまなバージョンの主な機能の類似点と相違点の分析
以上がNode.js は HTTP に費やされた時間を測定しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。