TCP-RT是一款TCP監控工具,採用核心埋點技術識別TCP串連中的請求與響應,捕獲請求接收及服務處理時間等相關資訊。TCP-RT適用於單個串連上僅存在一個並發請求與響應的情境(例如HTTP/1.1、MySQL、Redis等服務),要求系統為Alibaba Cloud Linux 2(核心4.19.91-21.al7及以上版本)或Alibaba Cloud Linux 3。Alibaba Cloud Linux 3(核心5.10.134-17及以上版本)提供了新版本的TCP-RT,在繼承了原版本特性的基礎上增加了對HTTP/TLS協議的支援。
為便於區分,在涉及新老版本功能差異時,將以tcp_rt.ko代指老版本,tcprt代指新版本。二者核心差異在:
tcp_rt.ko:以核心模組形式使用。
tcprt:通過
systemctl
配合設定檔使用,新增若干功能。
建議您優先使用tcprt。
功能原理
當TCP的服務情境為一個並發的請求與響應時,各個階段如下圖所示。
用戶端(Client)向服務端(Server)發送的第N個請求(request)表示為ReqN,該請求由ReqN-1
和ReqN-2
兩個資料包組成。服務端收到第一個包的時間被記錄為T0,第二個包的時間被記錄為T1。服務端收到請求後進行處理,完成處理後會向用戶端發送兩個響應的資料包RspN-1
和RspN-2
,服務端發送第一個包的時間被記錄為T2。用戶端收到響應包後會發送確認資訊ACK給伺服器,服務端收到最後一個ACK的時間被記錄為T3。
TCP-RT基於以上的時間點的記錄,可以計算出以下有意義的資訊:
upload_time:使用者請求上傳所使用的時間。
process_time:服務端的處理時間。
服務端從收到最後一個請求的資料包開始,到服務端向用戶端開始發送響應的資料包為止,這段時間為服務端的處理時間。
download_time:資料下載時間。
從服務端向用戶端發送響應的資料包開始,到服務端收到用戶端最後一個ACK為止,這段時間為資料下載時間。對於下載比較大的資料響應,該資訊的擷取較為重要。
資訊輸出說明
TCP-RT在核心態採集TCP服務的相關參數並輸出,下表說明了檔案的輸出方式與輸出時間點。
檔案類型 | 輸出方式 | 輸出時間 |
log檔案 | 以
|
|
stats檔案 | 該資料是基於連接埠(服務端連接埠或用戶端連接埠)進行資料匯總後,輸出到/sys/kernel/debug/tcp-rt路徑下的 | 定時輸出。預設為一分鐘輸出一次。 |
解析模式說明
TCP-RT支援多種解析模式,使用者可自行配置。具體操作,請參見功能使用。
default:預設模式。
基於通用TCP流進行解析,TCP流可以是HTTP、Redis、Mysql等符合請求/響應行為的協議。
http:HTTP增強。
在default模式基礎上,額外報告RTT和擁塞視窗資訊,並且識別HTTP協議的“Expect: 100-continue”處理過程。將100-continue請求及其響應報告為一條
R.C
類型記錄。更多資訊,請參見輸出格式說明。https:HTTPS增強。
在http模式的基礎上,額外增加了TLS部分報文解析。
tcp_rt.ko的解析模式不可配置,僅支援default模式。
輸出格式說明
TASK與TCP生命週期釋義。
TASK表示一次完整的請求+響應(request+response)。
TCP生命週期中包含多個TASK。
log檔案格式說明
在log檔案中,每條記錄的每一列都對應了不同的資訊。log檔案內容樣本如下圖所示。按照從左至右的順序,每一列參數說明如下:
版本號碼,目前為V6或V7。
V6:預設版本號碼。
V7:對R類型記錄,特定配置下可能出現額外內容,標記為V7。具體包括:
http、https解析模式下R日誌版本為V7,因為末尾帶有附加欄位。
R日誌擴充格式下,版本為V7,包括R.C、R.Z、R.A、R.H、R.F,具體含義見下表。
記錄情境標識,目前分為R、E、W、N、P五種類型。
R:請求到本機伺服器的情況下,在一個TCP服務中完成一次請求+響應產生一條該記錄。
E:串連關閉的情況下,產生一條該記錄。
W:串連在發送資料過程中被關閉的情況下,產生一條該記錄。
N:串連在接收資料過程中被關閉的情況下,產生一條該記錄。
P:本機伺服器請求對端伺服器的情況下,在一個TCP服務中完成一次請求+響應產生一條該記錄。
TASK開始時間,開始時間的秒部分。
TASK開始時間,開始時間的微秒部分。
TCP串連的對端IP地址。
TCP串連的對端連接埠。
TCP串連的本地IP地址。
TCP串連的本地連接埠。
以上參數後面銜接不同記錄情境標識的不同參數。說明如下表所示。
記錄情境標識 | 參數說明 |
R | 該記錄是TASK正常啟動和關閉的記錄,每個TCP串連可以有多個R記錄。
|
R.C | 說明 僅tcprt支援,版本號碼為V7。 http、https解析模式下可能出現,格式同R記錄。 表示TASK為“Expect: 100-continue”引入(該TASK不帶有應用資料)。 |
R.Z | 說明 僅tcprt支援,版本號碼為V7。 https解析模式下可能出現,格式同R記錄。 表示TASK屬於TLS 1.3 0RTT握手。 |
R.A | 說明 僅tcprt支援,版本號碼為V7。 https解析模式下可能出現,格式同R記錄。 表示TASK中含有 |
R.H | 說明 僅tcprt支援,版本號碼為V7。 https解析模式下可能出現,R記錄末尾可能附加額外內容。 表示TASK屬於TLS握手階段。若是TLS 1.3(三向交握),日誌末尾將報告握手耗時,單位:us。 末尾附加內容格式為 |
R.F | 說明 僅tcprt支援,版本號碼為V7。 開啟 表示TASK觸發按位元組數的完成時間統計。根據設定檔定義的位元組數閾值階梯,劃分每個TASK響應資料流,統計各階梯的資料量與完成時間,附加於記錄末尾,單位分別為bytes和us。 末尾附加內容格式為 |
P | 該記錄是TASK正常啟動和關閉的記錄,每個TCP服務可以有多個P記錄。P是V6版本中新增的記錄,表述的是用戶端對外請求時的資訊。只有配置了選項
|
E | 該記錄是TCP被關閉的記錄。每個TCP串連都有1個E記錄,配置了選項
|
N | 該記錄是在TASK請求接收報文段(segment)過程中,TCP被關閉情境下的記錄。每個TCP串連可能有一個N記錄或沒有。
|
W | 該記錄是在TASK響應發送的報文段(segment)過程中,TCP被關閉情境的記錄。每個TCP串連可能有1個W記錄或沒有。
|
擴充日誌類型以
R.x
格式標記,其中x
可以是單個字元(如上表),也可以是多個字元的組合。比如R.AF
即表示A
和F
同時生效。R.A
和R.C
類型日誌,以響應資料量為判據,因此可能存在少量誤判。在上表涉及TASK發送資料量的這類資訊中,如果是串連的最後一個TASK,正常處理會減去關閉串連(fin)佔用的一個
snd_nxt
值。而如果串連是異常關閉的,例如一個TASK完成之後收到了異常終止報文(reset)並且串連也是以響應reset
結束的,則實際發送的資料量會大於這裡顯示值一個位元組。正常情況下,該類值都是正確的,並且異常的情況下只誤差一個位元組。
關於功能原理部分所示的三個時間階段。
R記錄報告總時間(T0至T3)、上送延時(upload_time,T0至T1)、服務延時(process_time,T1至T2)。資料下載時間(download_time)可由上述資訊計算得出:
download_time = 總時間 - upload_time - process_time
stats檔案格式說明
按照從左至右的順序。每一列參數說明如下:
記錄輸出時的時間戳記。
保留欄位,目前唯一值為
all
。連接埠號碼。
R記錄中TASK總耗時的平均值。
R記錄中TASK服務延時的平均值。
丟包千分數(‰)。
RTT的平均值。單位:us。
請求發送的資料中,被關閉的TASK數量的千分數(‰)。
TASK發送的資料量的平均值。
TASK上送延時的平均值。
TASK接收的資料量的平均值。
參與統計的TASK的數量。
tcprt與tcp_rt.ko版本差異
比較項 | tcprt | tcp_rt.ko |
記錄檔路徑 | 相同 | |
日誌格式 | tcprt對日誌格式有擴充,原格式保持相容。 | |
功能管理 |
|
|
功能配置 | 設定檔:
| 模組參數:
|
系統要求 | Alibaba Cloud Linux 3(核心版本 |
|
功能 |
| 僅支援default解析模式。 |
功能使用
您可以根據實際使用情境選擇以下操作使用TCP-RT。
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 tcprt
配置tcprt。
開啟
/etc/tcprt-bpf/tcprt.yaml
檔案。sudo vim /etc/tcprt/tcprt.yaml
按
i
鍵進入編輯模式,根據需要進行配置。配置項分為三部分,global、per-port、init,說明如下。
global
參數
說明
可選值
預設值
peer
預設的tcprt連接埠匹配模式。
false:匹配本地連接埠。
true:匹配對端連接埠。
true/false
空
stats
是否開啟stats日誌輸出。
enable/disable
disable
stats_interval
stats輸出時間間隔。單位:s。
整數
60
first_frame_bytes
完成時間統計位元組數階梯閾值。單位:byte。
整數列表,最大長度為4
空
per-port。
以列表表示,預設為空白,一個元素對應一項連接埠配置。
參數
說明
可選值
預設值
port
連接埠號碼或連接埠範圍。
整數,表示連接埠號碼。
逗號分隔的兩個整數,表示連接埠範圍,範圍為閉區間。
無
peer
該連接埠(或連接埠範圍)的匹配模式。
true/false
global的peer配置
mode
協議解析模式。default效果與tcp_rt.ko一致。
default/http/https
default
first_frame
是否開啟按位元組數的完成時間統計。
enable/disable
disable
init。
參數
說明
可選值
預設值
log_buf_num
log檔案的子緩衝區個數。
整數
8
log_buf_size
log檔案的子緩衝區大小,單位:byte。
每一個log檔案最大大小為
log_buf_num * log_buf_size
。整數
262144
stats_buf_num
stats檔案的子緩衝區個數。
整數
8
stats_buf_size
stats檔案的子緩衝區大小,單位:byte。
stats檔案最大大小為
stats_buf_num * stats_buf_size
。整數
16384
配置完成後按
Esc
鍵,輸入:wq
後按Enter
鍵,儲存配置。啟動服務,自動解析設定檔。
sudo systemctl start tcprt
設定開機自動(如有需要)。
sudo systemctl enable tcprt
卸載tcprt。
sudo yum remove tcprt
輸入
y
按斷行符號鍵,完成卸載。
設定檔舉例tcprt
peer配置為false,表示預設採用本地連接埠匹配。添加了兩項連接埠配置。
443連接埠精確匹配:啟用HTTPS解析,匹配本地連接埠。開啟“first_frame”功能(即按位元組的完成時間統計),資料量閾值階梯依次為100/2000/20000位元組。
56789~56800連接埠範圍匹配:採用預設TCP解析,匹配對端連接埠。
stats功能關閉。
log檔案和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包統計的,實際資料轉送中,一次ACK可能對應大量資料(比如幾十KB),因此日誌中輸出的資料量可能超過檔案中的Bytes閾值配置。
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 > stats
stats_interval
stats輸出時間間隔。單位:s。
60
echo 60 > stats_interval
lports
控制採集的本機伺服器連接埠,最多6個。
無
echo 80,800,8080 > lports
pports
TCP串連的對端連接埠。
無
echo 80,800,8080 > pports
lports_range
本機伺服器連接埠範圍,兩個為一組,配置命令中表示80-100和1000-2000。
無
echo 80,100,1000,2000 >lports_range
pports_range
TCP串連的對端連接埠範圍,兩個為一組,配置命令中表示80-100和1000-2000。
無
echo 80,100,1000,2000 >pports_range
log_buf_num
每一個log檔案最大大小為
log_buf_num * 256 k
。只在載入模組的時候可以配置。8
modprobe tcp_rt log_buf_num=10
stats_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
模組。lsmod
當輸出結果中
tcp-rt
模組Used by
為0
時,表示沒有串連使用tcp-rt
。當所有串連都不使用
tcp-rt
模組後,運行以下命令卸載tcp-rt
模組。sudo rmmod tcp_rt
常見問題
記錄檔大小與配置參數不一致
ls -l
等命令顯示檔案大小超過配置值,這是正常現象。記錄檔位於/sys
虛擬檔案系統下,ls -l
結果不代表真實大小(也不佔磁碟空間)。實際上,這裡相當於累積的總日誌量,保持遞增。若想檢查日誌真實大小,可以將日誌重新導向到檔案後查看。
下圖展示了在預設配置(2 M)下的樣本。可以看到,使用cat
將日誌內容重新導向到檔案後,其實際大小約為2 M,符合預期。