TCP-RTは、カーネルフッキングテクノロジーを使用してTCP接続上の要求と応答を識別し、要求受信時間やサービス処理時間などの情報をキャプチャするTCP監視ツールです。 TCP-RTは、HTTP/1.1 webサービス、MySQLサービス、Redisサービスなど、接続に1つの同時リクエストとレスポンスしか存在せず、カーネルバージョン4.19.91-21.al7以降のAlibaba Cloud Linux 2またはAlibaba Cloud Linux 3でのみ実行できるシナリオに適しています。 カーネルバージョン5.10.134-17以降を搭載したAlibaba Cloud Linux 3は、新しいバージョンのTCP-RTを提供します。これは、古いバージョンのTCP-RTのすべての機能を継承し、HTTPおよびTransport Layer Security (TLS) プロトコルのサポートを追加します。
TCP-RTの旧バージョンと新バージョンとの間の機能の違いを含む内容を明確にするために、tcp_rt.koを使用して旧バージョンを示し、tcprtを使用して新バージョンを示す。 TCP-RTの古いバージョンと新しいバージョンは、使用方法が異なります。
tcp_rt.ko: カーネルモジュールとして使用されます。
tcprt:
systemctl
の構成ファイルと一緒に使用され、新しい機能を提供します。
tcprtの使用を推奨します。
TCP-RTの仕組み
次の図は、1つの同時リクエストとレスポンスを運ぶTCP接続にTCP-RTが使用されるさまざまなフェーズを示しています。
上の図では、ReqNはクライアントからサーバーに送信されたN番目のリクエストを示します。 要求は、ReqN-1
およびReqN-2
パケットからなる。 サーバが第1のパケットを受信した時点をT0として記録し、サーバが第2のパケットを受信した時点をT1として記録する。 サーバは、受信した要求を処理し、RspN-1
およびRspN-2
応答パケットをクライアントに送信する。 サーバが第1の応答パケットを送信する時点は、T2として記録される。 クライアントは、応答パケットを受信すると、肯定応答 (ACK) メッセージをサーバに送信する。 サーバが最終ACKメッセージを受信した時点はT3として記録される。
記録されたTCP-RTに基づいて、次の期間を計算できます。
upload_time: リクエストのアップロードに必要な時間。
process_time: サーバーがリクエストを処理するのに必要な時間。
process_timeの値は、サーバが最後の要求パケットを受信したときに開始し、サーバが最初の応答パケットをクライアントに送信したときに終了する期間である。
download_time: データのダウンロードに必要な時間。
download_timeの値は、サーバが第1の応答パケットをクライアントに送信するときに開始し、サーバがクライアントから最終ACKメッセージを受信するときに終了する期間である。 この期間は、大量の応答データをダウンロードするために不可欠である。
情報出力
TCP-RTは、カーネル空間でTCP関連のパラメータを収集し、パラメータファイルを生成します。 パラメタファイルの出力モードと出力时间を次の表に示します。
ファイルタイプ | 出力モード | 出力時間 |
ログファイル | ログファイルは、
|
|
statsファイル | statsファイルは、/sys/kernel/debug/tcp-rtディレクトリ内のサーバーポート関連またはクライアントポート関連の統計に基づいて生成される | 統計ファイルは定期的に生成されます。 デフォルトでは、データは1分ごとに生成されます。 |
モードの解析
TCP-RTは複数の解析モードをサポートします。 ビジネス要件に基づいてTCP-RTの解析モードを設定できます。 詳細については、このトピックの「操作」セクションをご参照ください。
default: デフォルトモード。
デフォルトモードでは、TCP-RTは通常のTCPストリームを追跡します。これは、HTTP、Redis、MySQLアプリケーションなどの要求応答プロトコルアプリケーションのストリームです。
http: HTTPモード、
これはデフォルトモードで構築されています。 HTTPモードでは、TCP-RTはさらにラウンドトリップタイム (RTT) と輻輳ウィンドウをキャプチャし、Expect: 100-continueヘッダーとリクエストに対するレスポンスを含むHTTPリクエストを識別し、各Expect: 100-continueリクエストとレスポンスのペアを
R.C
レコードとしてレポートします。 詳細については、このトピックの「出力形式」をご参照ください。https: HTTPSモード、
これはHTTPモードで構築されています。 HTTPSモードでは、TCP-RTは次のTLSパケットを解析します。
tcp_rt.koはデフォルトモードのみをサポートします。 tcp_rt.koの解析モードは設定できません。
出力フォーマット
タスクのライフサイクルとTCP接続のライフサイクルは異なります。
タスクのライフサイクルは、要求と応答で構成されます。
TCP接続のライフサイクルには複数のタスクが含まれます。
ログファイル形式
ログファイルでは、レコードの各列が異なる情報セットに対応します。 サンプルのログファイルを次の図に示します。 次のセクションでは、図に示すように、左から右へのパラメータについて説明します。
V6またはV7のバージョン番号。
V6: V6はデフォルトのバージョン番号です。
V7: Rレコードは、特定の構成において追加情報を含み得る。 Rレコードのバージョン番号はV7です。
HTTPまたはHTTPS解析モードでは、Rレコードは追加のフィールドで終わり、Rレコードのバージョン番号はV7です。
R.C、R.Z、R.A、R.H、R.Fレコードなどの拡張Rレコードのバージョン番号はV7です。 拡張形式のRレコードについては、次の表を参照してください。
シナリオレコード識別子。 有効値: R、E、W、N、およびP。
R: リクエストがローカルサーバーで受信され、レスポンスが送信されると、TCP接続のRレコードが生成されます。
E: TCP接続が閉じられたときにEレコードが生成されます。
W: データ伝送中にTCPコネクションがクローズされると、Wレコードが生成される。
N: データ受信中にTCPコネクションがクローズされると、Nレコードが生成される。
P: ローカルサーバーがピアサーバーに要求を送信し、応答が送信されると、TCP接続のPレコードが生成されます。
タスクの開始時刻の秒部分。
タスクの開始時間のマイクロ秒部分。
TCP接続のピアIPアドレス。
TCP接続のピアポート。
TCP接続のローカルIPアドレス。
TCP接続のローカルポート。
異なるシナリオでは、前述のパラメータの後に異なるパラメータが続きます。 下表に、各パラメーターを説明します。
シナリオレコード識別子 | パラメーターの説明 |
R | Rレコードは、タスクの通常の開始と終了を記録します。 各TCP接続は、複数のRレコードを有することができる。
|
R.C | 説明 tcprtのみがこのタイプのレコードをサポートしています。 このタイプのレコードのバージョン番号はV7です。 このタイプのレコードは、HTTPまたはHTTPS解析モードで生成することができ、Rレコードと同じフォーマットである。 R.Cレコードは、Expect: 100-continueリクエストとレスポンスのペアで構成されるタスクを記録します。 タスクにアプリケーションデータが含まれていません。 |
R.Z | 説明 tcprtのみがこのタイプのレコードをサポートしています。 このタイプのレコードのバージョン番号はV7です。 このタイプのレコードは、HTTPS解析モードで生成することができ、Rレコードと同じフォーマットである。 R.Zレコードは、TLS 1.3 0 − RTTハンドシェイクに含まれるタスクを記録する。 |
R.A | 説明 tcprtのみがこのタイプのレコードをサポートしています。 このタイプのレコードのバージョン番号はV7です。 このタイプのレコードは、HTTPS解析モードで生成することができ、Rレコードと同じフォーマットである。 R.Aレコードは、 |
R.H | 説明 tcprtのみがこのタイプのレコードをサポートしています。 このタイプのレコードのバージョン番号はV7です。 このタイプのレコードは、HTTPS構文解析モードで生成されてもよく、追加情報で終了してもよい。 R.Hレコードは、TLSハンドシェイクに含まれるタスクを記録します。 R.Hレコードが3ウェイTLS 1.3ハンドシェイクに含まれるタスクを記録する場合、そのレコードはハンドシェイク期間で終了します。
|
R.F | 説明 tcprtのみがこのタイプのレコードをサポートしています。 このタイプのレコードのバージョン番号はV7です。 このタイプのレコードは、 R.Fレコードは、タスクに関するバイトベースの完了時間統計を記録する。 TCP-RTは, 設定ファイルに定義されているバイト単位のしきい値ステップで各タスクのレスポンスストリームを分割し, 各ステップのデータ量をバイト単位で, 完了時間をマイクロ秒単位で計算し, 計算結果をR.Fレコードの末尾に追加します。 追加された計算結果は、 |
P | Pレコードは、タスクの通常の開始および終了を記録する。 各TCP接続は、複数のPレコードを有することができる。 PはV6の新しいレコードタイプであり、クライアントからの要求情報を示します。 このレコードは、
|
E | Eレコードは、閉じたTCP接続に関する情報を記録する。
|
N | Nレコードは、タスクが応答セグメントを要求しているときに閉じられるTCP接続に関する情報を記録する。 各TCP接続は、0または1つのNレコードを有し得る。
|
W | Wレコードは、タスクが要求セグメントに応答するときに閉じられるTCP接続に関する情報を記録する。 各TCP接続は、0または1つのWレコードを有し得る。
|
R.x
レコードは拡張ログレコードです。x
は、前の表に示すように単一の文字または文字の組み合わせにすることができます。 例:R.AF
。R.A
とR.F
を示します。R.A
およびR.C
レコードは、応答データボリュームに基づいており、いくつかのエラーを含む可能性があります。接続が期待どおりに閉じられた場合、最後のタスクによって送信されたデータ量から
snd_nxt
値が差し引かれます。 タスクが完了した後にリセットパケットが受信され、リセットパケットが返されて接続が閉じられるなど、接続が異常に閉じられた場合、送信される実際のデータ量は表示された値より1バイト大きくなります
。 ほとんどの場合、タスクによって送信されるデータ量に関連するパラメータ値は有効であり、エラーのマージンは1バイトだけです。
次の期間は、このトピックの「TCP-RTの仕組み」セクションで説明されている時点に基づいて計算されます。
Rレコード (T3 - T0) 、upload_time (T1 - T0) 、およびprocess_time (T2 - T1) に記録された合計時間。 download_timeの値は、次の式を使用して計算できます。
download_time=合計時間-upload_time - process_time
統計ファイル形式
次のセクションでは、記録された左から右へのパラメータについて説明します。
レコードが生成されたタイムスタンプ。
予約フィールドです。 有効値:
all
ポート番号
Rレコードに記録されたタスクの平均期間。
Rレコードに記録されたタスクの平均レイテンシ。
送信されたパケットに対するパケット損失のパーミレージとして表されるパケット損失率。
RTTの平均値。 単位:マイクロ秒。
タスクのパーミレージは、要求によって送信されたデータ内のすべてのタスクに関して閉じられました。
タスクによって送信されたデータの平均サイズ。
タスクのリクエストを送信するための平均レイテンシ。
タスクによって受信されたデータの平均量。
タスクの数。
tcprtとtcp_rt.koの比較
項目 | tcprt | tcp_rt.ko |
ログファイルを格納するパス | 同一 | |
ログフォーマット | tcprtは拡張形式のログをサポートし、元の形式のログと互換性があります。 | |
機能管理 |
|
|
機能の設定 | 設定ファイル:
| モジュールパラメータ:
|
支えられたオペレーティングシステム | カーネルバージョン |
|
サポートされた機能 |
| デフォルトの解析モード |
操作
ビジネスシナリオに基づいてTCP-RTを使用するには、次の操作を実行します。
tcprt
カーネルバージョン5.10.134-17以降のAlibaba Cloud Linux 3
tcp_rt.ko
カーネルバージョン4.19.91-21.al7以降のAlibaba Cloud Linux 2
Alibaba Cloud Linux 3
tcprtとtcp_rt.koは同じパスを使用してログファイルを保存します。 tcprtとtcp_rt.koを同時に使用することはできません。
tcprt
tcprtをインストールして設定します。
tcprtをインストールします。
sudo yum install -y tcprt
tcprtを設定します。
/etc/tcprt-bpf/tcprt.yaml
ファイルを開きます。sudo vim /etc/tcprt/tcprt.yaml
I
キーを押してInsertモードに入り、ビジネス要件に基づいてパラメーターを設定します。グローバル、ポートごと、およびinitセクションでパラメーターを設定します。 下表に追加のパラメーターを示します。
global
パラメーター
説明
有効値
デフォルト値
ピア
ピアポートと一致するかどうかを指定します。
false: ローカルポートに一致します。
true: ピアポートに一致します。
true/false
なし
統計
統計ファイルの生成機能を有効にするかどうかを指定します。
enable/disable
disable
stats_interval
統計ファイルを生成する間隔。 単位は秒です。
整数
60
first_frame_bytes
バイトベースの完了時間統計のしきい値ステップ。 単位はバイトです。
最大4つの整数のリスト
なし
ポートごと
ポートごとのセクションは、1つ以上の要素を含むことができる。 各要素はパラメータのリストで構成され、ポート構成を指定します。 デフォルトでは、ポートごとのセクションは空です。 各要素のパラメーターを次の表に示します。
項目
説明
有効値
デフォルト値
port
ポートまたはポート範囲。
整数: 単一のポート番号を示します。
コンマ (,) で区切られた2つの整数: ポート範囲を示します。 フォーマット: <Start port number >,< End port number>
なし
ピア
指定されたポートまたはポート範囲がピアポートと一致するかどうかを指定します。
true/false
グローバルセクションのpeerパラメーターの値
モード
プロトコル解析モード。 このパラメーターをデフォルトに設定すると、tcprtはtcp_rt.koと同じ方法でTCPストリームを解析します。
デフォルト /http/https
default
first_frame
バイトベースの完了時間統計を収集するfirst_frame機能を有効にするかどうかを指定します。
enable/disable
disable
init
項目
説明
有効値
デフォルト値
log_buf_num
ログファイルのサブバッファの数。
整数
8
log_buf_size
ログファイルのサブバッファのサイズ。 単位はバイトです。
ログファイルの最大サイズは、次の式を使用して計算されます。
log_buf_num × log_buf_size
整数
262144
stats_buf_num
統計ファイルのサブバッファの数。
整数
8
stats_buf_size
統計ファイルのサブバッファのサイズ。 単位はバイトです。
統計ファイルの最大サイズは、次の式を使用して計算されます。
stats_buf_num × stats_buf_size
。整数
16384
Esc
キーを押して:wq
と入力し、enter
キーを押してファイルを保存して閉じます。tcprtを起動して、設定ファイルを自動的に解析します。
sudo systemctl start tcprt
(オプション) システム起動時に実行するようにtcprtを設定します。
sudo systemctl enable tcprt
tcprtをアンインストールします。
sudo yum remove tcprt
y
を入力し、Enterキーを押してtcprtをアンインストールします。
tcprtのサンプル設定ファイル
グローバルセクションのpeerパラメーターをfalseに設定します。これは、ローカルポートが一致することを指定します。 2つのポート構成が追加されます。
ポート443: グローバルセクションでpeerパラメーター設定を使用し、HTTPS解析モードを有効にしてから、first_frame機能を有効にします。 バイトベースの完了時間統計のしきい値ステップを100バイト、2,000バイト、および20,000バイトに設定します。
56789〜56800のポート範囲: デフォルトの解析モードを有効にし、ポート範囲がピアポートと一致するように指定します。
統計ファイルの生成機能を無効にします。
ログファイルと統計ファイルのデフォルトのサブバッファ設定を使用します。
global:
peer: false
stats: disable
stats_interval: 60
first_frame_bytes: [100, 2000, 20000, 0]
per-port:
-
port: 443
mode: https
first_frame: enable
-
port: 56789,56800
mode: default
peer: true
init:
log_buf_num: 8
log_buf_size: 262144
stats_buf_num: 8
stats_buf_size: 16384
バイトベースの完了時間は、ACKパケットを使用することによって測定される。 実際のデータ送信では、ACKパケットは、数十KBのデータなどの大量のデータに対応することがある。 ログに記録されたデータの量が、ログファイルに設定されたバイトのしきい値を超える場合があります。
tcp_rt.ko
tcp_rt.koモジュールをロードして設定します。
次のいずれかの方法を使用して、モジュールをロードおよび構成できます。
モジュールをロードするときにパラメーターを設定します。
モジュールをロードするために実行するコマンドでパラメーターを設定します。
たとえば、tcp_rt.koモジュールを読み込むために実行する次のコマンドで、lportsパラメーターを80に設定します。
sudo modprobe tcp_rt lports=80
設定が有効かどうかを確認します。
sudo cat /sys/module/tcp_rt/parameters/lports
モジュールを読み込み、パラメーターを設定します。
次のコマンドを実行してモジュールをロードします。
sudo modprobe tcp_rt
モジュールが読み込まれたら、コマンドを実行して /sys/module/tcp_rt/parameters/ ファイルのパラメーターを設定します。
たとえば、次のコマンドを実行して、ローカルポート80でリッスンするように /sys/module/tcp_rt/parameters/ fileのパラメーターを設定します。
sudo sh -c 'echo 80 > /sys/module/tcp_rt/parameters/lports'
設定が有効かどうかを確認します。
sudo cat /sys/module/tcp_rt/parameters/lports
次の表に、/sys/module/tcp_rt/parameters/ fileのパラメーターと、パラメーターを設定するために実行できるコマンドを示します。
パラメーター
説明
デフォルト値
コマンド
統計
統計ファイルを生成するかどうかを指定します。 有効な値:
0: 統計ファイルを生成しません。
1: 統計ファイルを生成します。
0
エコー0> 統計
stats_interval
統計ファイルを生成する間隔。 単位は秒です。
60
echo 60 > stats_interval
lports
データ収集に使用されるローカルサーバーポート。 最大6つのポートを指定できます。
なし
エコー80,800、8080 > lports
pports
TCP接続のピアポート。
なし
エコー80,800、8080 > pports
lports_range
ローカルサーバーのポート範囲。 <開始ポート番号>,<終了ポート番号> の形式でポート範囲を指定します。 たとえば、値80,100は80〜100のポート範囲を指定し、値1000,2000は1000〜2000のポート範囲を指定します。
なし
エコー80,100、1000,2000 >lports_range
pports_range
TCP接続のピアポート範囲。 <開始ポート番号>,<終了ポート番号> の形式でポート範囲を指定します。 たとえば、値80,100は80〜100のポート範囲を指定し、値1000,2000は1000〜2000のポート範囲を指定します。
なし
エコー80,100、1000,2000 >pports_range
log_buf_num
ログファイルのサブバッファの数。 ログファイルの最大サイズは、
log_buf_num × 256 k
の式を使用して計算されます。 このパラメーターは、モジュールをロードするときにのみ設定できます。8
modprobe tcp_rt log_buf_num=10
stats_buf_num
統計ファイルのサブバッファの数。 統計ファイルの最大サイズは、次の式を使用して計算されます。
stats_buf_num × 16 k
。 このパラメーターは、モジュールをロードするときにのみ設定できます。8
modprobe tcp_rt stats_buf_num=10
モジュールをアンインストールします。
次のコマンドを実行して
tcp-rt
モジュールを無効にし、新しい接続でTCP-RTを使用しないようにします。sudo echo 1 > /sys/kernel/debug/tcp-rt/deactivate
次のコマンドを実行して、
tcp-rt
モジュールを使用している接続がないかどうかを確認します。lsmod
tcp-rt
モジュールのUsed by
の値がコマンド出力で0
されている場合、tcp-rt
モジュールを使用している接続はありません。tcp-rt
モジュールを使用している接続がない場合は、次のコマンドを実行してtcp-rt
モジュールをアンインストールします。sudo rmmod tcp_rt
よくある質問
ログファイルのサイズが関連するパラメーター値と異なる場合はどうすればよいですか?
ls -l
コマンド出力などのコマンド出力に表示されるファイルサイズは、ファイルサイズに関連するパラメーター値よりも大きい場合があります。 これは問題ではありません。 ログファイルは、/sys
の仮想ファイルシステムに保存されます。 ls -l
コマンド出力のログファイルのサイズは、ファイル内のログの実際の容量ではなく、ログによって占有されるディスクストレージの実際の容量でもありません。 ls -lコマンド出力のログファイルのサイズは、増加し続けるログの累積ボリュームです。 ファイル内のログの実際のボリュームを表示するには、ログを別のファイルにリダイレクトします。
次の図は、ログを別のファイルにリダイレクトし、ログの実際のボリュームを表示する方法の例を示しています。 この例では、ログファイルサイズ関連パラメーターのデフォルト値は2 MBです。 cat
コマンドを実行してファイル内のログを別のファイルにリダイレクトすると、ログの実際の容量は予想どおり約2 MBであることがわかります。