TCP-RT は、カーネルレベルのイベントトラッキングを活用して TCP 接続におけるリクエストと応答を特定し、リクエスト受信時刻やサービス処理時間などの関連メトリックを収集する TCP 監視ツールです。TCP-RT は、HTTP/1.1、MySQL、Redis などのサービスのように、単一の接続上で同時実行されるリクエストと応答が 1 対のみ存在するシナリオに適用可能です。対応する OS は Alibaba Cloud Linux 2(カーネルバージョン 4.19.91-21.al7 以降)または Alibaba Cloud Linux 3 です。Alibaba Cloud Linux 3(カーネルバージョン 5.10.134-17 以降)では、従来の機能をすべて維持しつつ、HTTP/TLS プロトコルへの対応を追加した新バージョンの TCP-RT を提供します。
各バージョンを明確に区別するため、本ドキュメントでは、旧バージョンを tcp_rt.ko、新バージョンを tcprt と表記します。主な相違点は以下のとおりです:
tcp_rt.ko:カーネルモジュールとして使用されます。
tcprt:
systemctlおよび設定ファイルを用いて操作され、追加機能を提供します。
可能な限り、tcprt をご使用ください。
仕組み
ローカルモード(サーバー視点)
TCP サービスが 1 対の同時実行リクエストと応答を処理する場合のタイムラインを、以下の図に示します。
クライアントからサーバーへ送信される N 番目のリクエスト(ReqN)は、ReqN-1 および ReqN-2 の 2 つのパケットで構成されます。サーバーは、最初のパケットの到着時刻を T0、2 番目のパケットの到着時刻を T1 として記録します。サーバーがリクエスト全体を受信後、処理を行い、RspN-1 および RspN-2 の 2 つの応答パケットを送信します。サーバーは、最初の応答パケットの送信時刻を T2 として記録します。クライアントが応答を受信後、サーバーへ ACK を返信します。サーバーは、最終的な ACK を受信した時刻を T3 として記録します。
これらのタイムスタンプに基づき、TCP-RT は以下のメトリックを算出します:
upload_time:ユーザーがアップロードリクエストを開始した時刻。
process_time:サーバーの処理時間。
これは、サーバーが最後のリクエストパケットを受信した時刻から、最初の応答パケットの送信を開始した時刻までの間隔です。
download_time:データダウンロード時間。
これは、サーバーが応答パケットの送信を開始した時刻から、クライアントからの最終 ACK を受信した時刻までの間隔です。このメトリックは、大規模なデータ応答において重要です。
ピアモード(クライアント視点)
TCP サービスが 1 対の同時実行リクエストと応答を処理する場合のタイムラインを、以下の図に示します。
クライアントからサーバーへ送信される N 番目のリクエスト(ReqN)は、ReqN-1 および ReqN-2 の 2 つのデータパケットで構成されます。サーバーは、最初のパケットの受信時刻を T0、2 番目のパケットの受信時刻を T1 として記録します。リクエストを受信・処理した後、サーバーはクライアントへ RspN-1 および RspN-2 の 2 つの応答パケットを送信します。サーバーは、最初の応答パケットの送信時刻を T2 として記録します。クライアントが応答パケットを受信後、サーバーへ ACK を送信し、サーバーは最終 ACK の受信時刻を T3 として記録します。
これらのタイムスタンプに基づき、TCP-RT は以下のメトリックを算出します:
upload_time:ユーザーがアップロードリクエストを発行した時刻。
process_time:サーバーの処理時間。
これは、クライアントが最後のリクエストパケットを送信した時刻から、クライアントが最初の応答パケットを受信した時刻までの間隔です。
download_time:データダウンロード時間。
これは、クライアントが最初の応答パケットを受信した時刻から、最後の応答パケットを受信した時刻までの間隔です。
出力詳細
TCP-RT はカーネルモードで TCP サービスのメトリックを収集し、以下の表に示す形式で出力します。
ファイル種別 | 出力方法 | 出力タイミング |
ログファイル |
|
|
Stats ファイル | ポート(サーバーポートまたはクライアントポート)ごとに集計されたデータが、/sys/kernel/debug/tcp-rt 下の | 定期的に出力されます。デフォルトの間隔は 1 分です。 |
解析モード
TCP-RT は、設定可能な複数の解析モードをサポートしています。詳細については、「TCP-RT の使用方法」をご参照ください。
default:デフォルトモード。
HTTP、Redis、MySQL など、リクエスト/応答パターンに従う汎用 TCP ストリームを解析します。
http:拡張 HTTP 解析モード。
このモードはデフォルトモードを基盤として構築されており、往復レイテンシ(RTT)および輻輳ウィンドウのメトリックを報告します。また、HTTP の「Expect: 100-continue」プロセスを検出し、100-continue リクエストおよびその応答を
R.Cレコードとしてログに記録します。詳細については、「出力形式」をご参照ください。Enhanced HTTPS
このモードは http モードを基盤として構築されており、Transport Layer Security(TLS)メッセージの解析を追加でサポートします。
tcp_rt.ko の解析モードは設定不可であり、デフォルトモードのみをサポートします。
出力形式
TASK および TCP ライフサイクルの定義。
TASK:完全なリクエストおよび応答のサイクルを表します。
TCP ライフサイクルには複数の TASKs が含まれています。
ログファイル形式
ログファイルでは、レコード内の各カラムが 1 つの情報を表します。以下の図はサンプルログエントリを示しています。
カラムは左から右へ順に以下のように説明されます:
バージョン番号。値は V6 または V7 です。
V6:デフォルトバージョン。
V7:特定の設定に基づいて生成される R 型レコードに追加フィールドが含まれる場合に使用されます。これには以下のレコードが該当します:
http または https 解析モードでの R ログは、末尾フィールドを含むため V7 を使用します。
R.C、R.Z、R.A、R.H、R.F などの拡張 R ログ形式は V7 を使用します。詳細については、以下の表をご参照ください。
レコードタイプ識別子。値は R、E、W、N、P のいずれかです。
R:リクエストがローカルサーバーに到達し、TCP サービス内でリクエストおよび応答のサイクルが完了した際に生成されるレコードです。
E:接続が閉じられた際に生成されるレコードです。
W:応答送信中に接続が閉じられた際に生成されるレコードです。
N:リクエスト受信中に接続が閉じられた際に生成されるレコードです。
P:ローカルサーバーがリモートサーバーへリクエストを送信し、TCP サービス内でリクエストおよび応答のサイクルが完了した際に生成されるレコードです。
TASK 開始時刻の秒部分。
TASK 開始時刻のマイクロ秒部分。
TCP 接続のリモート IP アドレス。
TCP 接続のリモートポート。
TCP 接続のローカル IP アドレス。
TCP 接続のローカルポート。
追加フィールドはレコードタイプに応じて含まれます。詳細については、以下の表をご参照ください。
シナリオ ID | フィールド説明 |
R | このレコードは、TASK の正常な開始および終了を示します。単一の TCP 接続には複数の R レコードが存在する可能性があります。
|
R.C | 説明 tcprt(V7)でのみサポートされます。 http/https 解析モードで出現する可能性があります。R レコードの形式と一致します。 「Expect: 100-continue」リクエスト(アプリケーションデータを含まない)によってトリガーされた TASK を示します。 |
R.Z | 説明 tcprt(V7)でのみサポートされます。 https 解析モードで出現する可能性があります。R レコードの形式と一致します。 TLS 1.3 の 0-RTT ハンドシェイクに属する TASK を示します。 |
R.A | 説明 tcprt(V7)でのみサポートされます。 https 解析モードで出現する可能性があります。R レコードの形式と一致します。 この TASK には |
R.H | 説明 tcprt(V7)でのみサポートされます。 https 解析モードで出現する可能性があります。R レコードには末尾フィールドが含まれることがあります。 この TASK は TLS ハンドシェイクフェーズに属することを示します。TLS 1.3(3 ウェイハンドシェイク)の場合、ログにはマイクロ秒単位のハンドシェイク所要時間が記録されます。 末尾フィールドの形式: |
R.F | 説明 tcprt(V7)でのみサポートされます。
この TASK は、バイトしきい値による完了時間統計 をトリガーします。設定ファイルで定義されたバイトしきい値に基づき、応答データストリームがステップに分割され、各ステップのデータ量および完了時間がレコードに追加されます(単位:バイトおよび μs)。 末尾フィールドの形式: |
P | このレコードは、TASK の正常な開始および終了を示します。単一の TCP サービスには複数の P レコードが存在する可能性があります。P レコードは V6 で導入され、アウトバウンドのクライアントリクエストをキャプチャするために追加されました。これらは、
|
E | このレコードは TCP 接続の閉じられることを示します。各 TCP 接続には正確に 1 つの E レコードがあります。
|
N | このレコードは、リクエストセグメント受信中に TCP 接続が閉じられた場合に出現します。接続には 0 個または 1 個の N レコードが存在する可能性があります。
|
W | このレコードは、応答セグメント送信中に TCP 接続が閉じられた場合に出現します。接続には 0 個または 1 個の W レコードが存在する可能性があります。
|
拡張ログタイプは
R.x形式を使用し、xは単一文字または複数文字の組み合わせになります。たとえば、R.AFはAおよびFの両方が適用されることを示します。R.AおよびR.Cのログは応答データ量を判定基準としており、若干の誤検知が発生する可能性があります。上記の表で TASK が送信したデータ量を示すメトリックについて、接続の最終 TASK の場合、通常の処理時に接続終了(FIN)を考慮して
snd_nxt値から 1 を減算します。ただし、接続が異常に閉じられた場合(たとえば、TASK 完了後に異常終了メッセージ(RST)を受信し、resetに応じて接続が終了した場合)、実際に送信されたデータ量は表示値より 1 バイト大きくなります。通常、TASK が送信したデータ量に関連するパラメーター値は正確であり、誤差は最大で 1 バイトです。
3 つの時間フェーズは、「仕組み」に示されています:
R レコードは総所要時間(T0 から T3)、アップロード遅延(upload_time、T0 から T1)、およびサービス遅延(process_time、T1 から T2)を報告します。ダウンロード時間(download_time)は以下の数式で算出できます:
download_time = total_time - upload_time - process_time
Stats ファイル形式
カラムは左から右へ順に以下のように説明されます:
レコードが出力されたタイムスタンプ。
予約済みフィールド。値は常に
allです。ポート番号。
R レコードから得られる TASK の平均総所要時間。
R レコードから得られる TASK の平均サービス遅延。
パケット損失率(‰ 単位)。
平均 RTT(マイクロ秒単位、μs)。
リクエスト送信中に閉じられた TASK の割合(‰ 単位)。
TASK ごとの平均送信データ量。
TASK の平均アップロード遅延。
TASK ごとの平均受信データ量。
統計に含まれる TASK 数。
tcprt と tcp_rt.ko のバージョン差異
比較項目 | tcprt | tcp_rt.ko |
ログファイルパス | 同一 | |
ログ形式 | tcprt は下位互換性を維持しつつ、ログ形式を拡張しています。 | |
機能管理 |
|
|
機能構成 | 設定ファイル:
| モジュールパラメーター:
|
システム要件 | Alibaba Cloud Linux 3(カーネルバージョン |
|
機能 |
| default 解析モードのみをサポート。 |
機能の使用方法
ご利用の環境に応じて、以下のいずれかの方法を選択してください:
tcprt
Alibaba Cloud Linux 3(カーネルバージョン 5.10.134-17 以降)向け。
tcp_rt.ko
Alibaba Cloud Linux 2(カーネルバージョン 4.19.91-21.al7 以降)向け。
Alibaba Cloud Linux 3.
両者ともログファイルパスが同一であるため、同時に実行することはできません。どちらか一方のみを実行できます。
tcprt
インストールおよび構成手順。
tcprt をインストールします。
sudo yum install -y tcprttcprt を構成します。
/etc/tcprt-bpf/tcprt.yamlファイルを開きます。sudo vim /etc/tcprt/tcprt.yamliキーを押して編集モードに入り、必要に応じてパラメーターを構成します。構成ファイルには、global、per-port、init の 3 つのセクションがあります。各セクションの内容は以下の表に示します。
global
パラメーター
説明
値
デフォルト
peer
tcprt のデフォルトポートマッチングモード。
false:ローカルポートをマッチします。
true:リモートポートをマッチします。
true/false
未設定
stats
stats ログ出力を有効化します。
enable/disable
disable
stats_interval
stats 出力間隔。単位:s。
整数
60
first_frame_bytes
完了時間統計のバイトしきい値。単位:バイト。
最大 4 個の整数のリスト
未設定
per port
このセクションはデフォルトで空のリストです。各要素はポート構成を定義します。
パラメーター
説明
値
デフォルト
port
ポート番号または範囲。
ポート番号を表す整数。
カンマで区切られた 2 つの整数:閉区間のポート範囲。
なし
peer
このポート(または範囲)のマッチングモード。
true/false
グローバルピアリング構成
mode
プロトコル解析モード。default は tcp_rt.ko の動作と一致します。
default/http/https
default
first_frame
バイトしきい値による完了時間統計を有効化します。
enable/disable
disable
初期化します。
パラメーター
説明
値
デフォルト
log_buf_num
ログファイル用サブバッファーの数。
整数
8
log_buf_size
各ログサブバッファーのサイズ。単位:バイト。
最大ログファイルサイズは
log_buf_num * log_buf_sizeです。整数
262144
stats_buf_num
stats ファイル用サブバッファーの数。
整数
8
stats_buf_size
各 stats サブバッファーのサイズ。単位:バイト。
最大 stats ファイルサイズは
stats_buf_num * stats_buf_sizeです。整数
16384
ファイル編集後、
Escキーを押し、:wqを入力してEnterキーを押してファイルを保存します。サービスを起動して、設定を自動的に読み込みます。
sudo systemctl start tcprt(任意)ブート時に自動起動を有効化できます。
sudo systemctl enable tcprt
tcprt のアンインストール。
sudo yum remove tcprtyを入力し、Enter キーを押して、アンインストールを確認してください。
tcprt 構成例
peer パラメーターを false に設定し、デフォルトでローカルポートをマッチさせるようにします。2 つのポート構成を追加します:
ポート 443(完全一致):ローカルポートをマッチさせるために HTTPS 解析を有効化します。バイトしきい値による完了時間統計(first_frame 機能)を有効化し、しきい値を 100、2000、20000 バイトに設定します。
ポート範囲 56789~56800:デフォルトの TCP 解析を使用し、リモートポートをマッチさせます。
stats 機能を無効化します。
ログおよび stats のデフォルトバッファーサイズを使用します。
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 パケットを用いてトラッキングされます。実際には、1 つの ACK パケットが数十 KB のような大量のデータを承認することがあります。そのため、ログに記録されるデータ量は、構成されたバイトしきい値を超えることがあります。
tcp_rt.ko
モジュールの読み込みおよび構成。
以下のいずれかの方法をご利用ください。
モジュール読み込み時にパラメーターを構成します。
tcp_rt モジュールを読み込み、パラメーターを構成します。
例:tcp_rt モジュールを読み込み、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 を監視します。
sudo sh -c 'echo 80 > /sys/module/tcp_rt/parameters/lports'構成を確認します。
sudo cat /sys/module/tcp_rt/parameters/lportsパラメーターおよびコマンドの説明は、以下の表に示します。
パラメーター
説明
デフォルト
コマンド
stats
stats 出力を有効化します:
0: いいえ。
1: はい。
0
echo 0 > statsstats_interval
stats 出力間隔。単位:s。
60
echo 60 > stats_intervallports
監視対象のローカルサーバーポート(最大 6 個)。
なし
echo 80,800,8080 > lportspports
TCP 接続のリモートポート。
なし
echo 80,800,8080 > pportslports_range
ローカルサーバーポートの範囲。範囲ごとに 2 つの数字を指定します。例:80–100 および 1000–2000 を構成します。
なし
echo 80,100,1000,2000 >lports_rangepports_range
リモートポートの範囲。範囲ごとに 2 つの数字を指定します。例:80–100 および 1000–2000 を構成します。
なし
echo 80,100,1000,2000 >pports_rangelog_buf_num
最大ログファイルサイズは
log_buf_num * 256 kです。モジュール読み込み時のみ構成可能です。8
modprobe tcp_rt log_buf_num=10stats_buf_num
最大 stats ファイルサイズは
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モジュールを使用している接続がないことを確認します。lsmodUsed byの値がtcp-rtモジュールに対して0の場合、tcp-rtを使用している接続はありません。接続が
tcp-rtモジュールを使用していない場合、以下のコマンドを実行してtcp-rtモジュールをアンインストールします。sudo rmmod tcp_rt
よくある質問
ログファイルサイズが構成と異なる
ls -l などのコマンドで表示されるファイルサイズが、構成されたサイズよりも大きい場合があります。これは正常です。ログファイルは /sys 仮想ファイルシステムに格納されています。したがって、ls -l コマンドは実際のディスク使用率を反映しません(これらのファイルはディスク領域を消費しません)。表示されるサイズは累積ログ量を表しており、時間とともに増加します。実際のログサイズを確認するには、ログを通常のファイルにリダイレクトして、そのファイルを確認してください。
以下の図は、デフォルト設定(2 MB)の例を示しています。cat コマンドを用いてログ内容をファイルにリダイレクトした場合、ファイルの実際のサイズは期待通り約 2 MB になります。
