全部產品
Search
文件中心

Alibaba Cloud Linux:TCP-RT功能的配置說明

更新時間:Sep 20, 2024

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-1ReqN-2兩個資料包組成。服務端收到第一個包的時間被記錄為T0,第二個包的時間被記錄為T1。服務端收到請求後進行處理,完成處理後會向用戶端發送兩個響應的資料包RspN-1RspN-2,服務端發送第一個包的時間被記錄為T2。用戶端收到響應包後會發送確認資訊ACK給伺服器,服務端收到最後一個ACK的時間被記錄為T3。

TCP-RT基於以上的時間點的記錄,可以計算出以下有意義的資訊:

  • upload_time:使用者請求上傳所使用的時間。

  • process_time:服務端的處理時間。

    服務端從收到最後一個請求的資料包開始,到服務端向用戶端開始發送響應的資料包為止,這段時間為服務端的處理時間。

  • download_time:資料下載時間。

    從服務端向用戶端發送響應的資料包開始,到服務端收到用戶端最後一個ACK為止,這段時間為資料下載時間。對於下載比較大的資料響應,該資訊的擷取較為重要。

資訊輸出說明

TCP-RT在核心態採集TCP服務的相關參數並輸出,下表說明了檔案的輸出方式與輸出時間點。

檔案類型

輸出方式

輸出時間

log檔案

debugfs的方式輸出到/sys/kernel/debug/tcp-rt路徑下,檔案名稱為rt-network-log*的檔案中。該類檔案特徵如下:

  • 檔案名稱的尾碼為CPU核心的序號。例如:32核的伺服器,輸出的log檔案為rt-network-log0rt-network-log31

  • 檔案大小最大為2 MB,當資料超過該限制後,舊資料會被清除。

  • debugfs方式輸出的log檔案是一次性的,當您讀取一次檔案資料後,讀取部分的資料就被清除了。

  • 時間一:在TCP串連上,當上一個任務(一次請求/響應為一個任務)完成後下一個任務開始時,輸出上一個任務的資訊。

  • 時間二:在串連關閉時,輸出資訊。

    在TCP-RT輸出資訊之後,應用程式層可以立即讀取到資料。

stats檔案

該資料是基於連接埠(服務端連接埠或用戶端連接埠)進行資料匯總後,輸出到/sys/kernel/debug/tcp-rt路徑下的rt-network-stats檔案中。

定時輸出。預設為一分鐘輸出一次。

解析模式說明

TCP-RT支援多種解析模式,使用者可自行配置。具體操作,請參見功能使用

  • default:預設模式。

    基於通用TCP流進行解析,TCP流可以是HTTP、Redis、Mysql等符合請求/響應行為的協議。

  • http:HTTP增強。

    在default模式基礎上,額外報告RTT和擁塞視窗資訊,並且識別HTTP協議的“Expect: 100-continue”處理過程。將100-continue請求及其響應報告為一條R.C類型記錄。更多資訊,請參見輸出格式說明

  • https:HTTPS增強。

    在http模式的基礎上,額外增加了TLS部分報文解析。

    • TLS握手解析:識別TLS 1.2和TLS 1.3的握手階段,在輸出日誌中標記出來。更多資訊,請參見輸出格式說明

      • 對TLS 1.2四次握手,產生兩條R.H類型記錄。

      • 對TLS 1.3三向交握,產生一條R.H類型記錄,並報告握手用時。

    • “Close Notify” Alert報文解析:在輸出日誌中以R.A記錄標記。更多資訊,請參見輸出格式說明

說明

tcp_rt.ko的解析模式不可配置,僅支援default模式。

輸出格式說明

說明

TASK與TCP生命週期釋義。

  • TASK表示一次完整的請求+響應(request+response)。

  • TCP生命週期中包含多個TASK。

log檔案格式說明

在log檔案中,每條記錄的每一列都對應了不同的資訊。log檔案內容樣本如下圖所示。image按照從左至右的順序,每一列參數說明如下:

  • 版本號碼,目前為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記錄。

  • TASK發送的資料量。單位:Byte。

  • TASK總耗時。單位:us。

    即第一個請求segment到達與最後一個響應的segment被ack之間的時間間隔。

  • TASK最小的TCP RTT(Round Trip Time)。單位:us。

  • TASK重傳發送的TCP報文段(TCP segment)數量。

  • TASK序號。TCP建立後的第一個TASK序號為1。

  • TASK服務延時。單位:us。

    最後一個請求的segment到達第一個響應的segment發送之間的時間間隔。

  • TASK上送延時。單位:us。

    第一個請求segment到達最後一個請求segment到達之間的時間間隔。

  • TASK接收的資料量。單位:Byte。

  • TASK過程是否發生接收亂序。參數值說明:

    • 1:發生。

    • 0:沒有發生。

  • TASK過程中TCP使用的最大報文長度(MSS)。單位:Byte。

  • TASK結束時的平滑RTT,http、https解析模式下生效(僅tcprt支援,版本號碼為V7)。單位:us。

  • TASK結束時的擁塞視窗,http、https解析模式下生效(僅tcprt支援,版本號碼為V7)。單位:segments。

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中含有Close NotifyAlert報文,該TASK不會計入Alert報文引入額外耗時(即最後一個響應資料包與Alert包之間的用時)。

R.H

說明

僅tcprt支援,版本號碼為V7。

https解析模式下可能出現,R記錄末尾可能附加額外內容。

表示TASK屬於TLS握手階段。若是TLS 1.3(三向交握),日誌末尾將報告握手耗時,單位:us。

末尾附加內容格式為H <time>。例如H 151878表示握手用時 151878 us。

R.F

說明

僅tcprt支援,版本號碼為V7。

開啟first_frame後出現(具體操作,請參見功能使用),R記錄末尾可能附加額外內容。

表示TASK觸發按位元組數的完成時間統計。根據設定檔定義的位元組數閾值階梯,劃分每個TASK響應資料流,統計各階梯的資料量與完成時間,附加於記錄末尾,單位分別為bytes和us。

末尾附加內容格式為F <n> [bytes time]。例如F 6 7240 214 63698 311 98436 358,表示共有6個數字,7240、63698、98436 Bytes 對應的總耗時依次為214 us、311 us、358 us。

P

該記錄是TASK正常啟動和關閉的記錄,每個TCP服務可以有多個P記錄。P是V6版本中新增的記錄,表述的是用戶端對外請求時的資訊。只有配置了選項pportspports_range時才有該記錄。

  • TASK發送的資料量。單位:Byte。

  • TASK總耗時。從本機伺服器發送資料開始到最後一次收到對端響應的時間。單位:us。

  • TASK最小的TCP RTT(Round Trip Time)。單位:us。

  • TASK重傳發送的TCP報文段(TCP segment)數量。

  • TASK序號。TCP建立後的第一個TASK序號為1。

  • TASK服務時間。即從請求發送完成到收到第一個響應的時間。單位:us。

  • TASK響應接收時間。從接收到第一個響應包到最後一個響應包之間的時間。單位:us。

  • TASK接收響應的總大小。單位:Byte。

  • TASK過程是否發生接收亂序。參數值說明:

    • 1:發生。

    • 0:沒有發生。

  • TASK過程中TCP使用的最大報文長度(MSS)。單位:Byte。

E

該記錄是TCP被關閉的記錄。每個TCP串連都有1個E記錄,配置了選項pportspports_range的串連也會有該記錄。

  • 最後一個TASK的序號。

  • TCP生命週期中發送的資料量。單位:Byte。

  • TCP發送響應但是沒有收到ACK的資料量。參數值說明:沒有則為0。單位:Byte。

  • TCP生命週期中接收的資料量。單位:Byte。

  • TASK重傳發送的TCP報文段(TCP segment)數量。

  • TCP生命週期中最小的TCP RTT(Round Trip Time)。單位:us。

N

該記錄是在TASK請求接收報文段(segment)過程中,TCP被關閉情境下的記錄。每個TCP串連可能有一個N記錄或沒有。

  • 最後一個TASK的序號。

  • 最後一個TASK的耗時,因為是被關閉,所以只有接收時間,沒有發送時間。單位:us。

  • TCP生命週期中接收的資料量。單位:Byte。

  • TASK過程是否發生接收亂序。參數值說明:1表示發生;0表示沒有發生。

  • TASK過程中TCP使用的最大報文長度(MSS)。單位:Byte。

W

該記錄是在TASK響應發送的報文段(segment)過程中,TCP被關閉情境的記錄。每個TCP串連可能有1個W記錄或沒有。

  • 最後一個TASK的響應已發送資料量。單位:Byte。

  • 最後一個TASK的耗時,因為是被關閉,所以發送時間是不完整的。單位:us。

  • 最後一個TASK最小的TCP RTT(Round Trip Time)。單位:us。

  • 最後一個TASK重傳發送的TCP報文段(TCP segment)數量。

  • 最後一個TASK的序號。

  • 最後一個TASK服務延時。單位:us。

  • 最後一個TASK上送延時。單位:us。

  • 最後一個TASK發送響應但是沒有收到ACK確認資訊的資料量。參數值說明:沒有則為0。單位:Byte。

  • TASK過程是否發生接收亂序。參數值說明:

    • 1:發生。

    • 0:沒有發生。

  • 最後一個TASK過程中TCP使用的最大報文長度(MSS)。單位:Byte。

說明
  • 擴充日誌類型以R.x格式標記,其中x可以是單個字元(如上表),也可以是多個字元的組合。比如R.AF即表示AF同時生效。

  • R.AR.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的數量。

tcprttcp_rt.ko版本差異

比較項

tcprt

tcp_rt.ko

記錄檔路徑

相同

日誌格式

tcprt對日誌格式有擴充,原格式保持相容。

功能管理

systemctl

modprobe/rmmod

功能配置

設定檔:

/etc/tcprt-bpf/tcprt.yaml

模組參數:

/sys/module/tcp_rt/parameters/*

系統要求

Alibaba Cloud Linux 3(核心版本 5.10.134-17及以上)。

  • Alibaba Cloud Linux 2(核心版本4.19.91-21.al7及以上)。

  • Alibaba Cloud Linux 3。

功能

  • 除default外,支援http、https解析模式。

  • 支援first_frame功能。

僅支援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

  • 安裝與配置。

    1. 安裝tcprt。

      sudo yum install -y tcprt
    2. 配置tcprt。

      1. 開啟/etc/tcprt-bpf/tcprt.yaml檔案。

        sudo vim /etc/tcprt/tcprt.yaml
      2. 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

      3. 配置完成後按Esc鍵,輸入:wq後按Enter鍵,儲存配置。

      4. 啟動服務,自動解析設定檔。

        sudo systemctl start tcprt
      5. 設定開機自動(如有需要)。

        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

  • 載入與配置模組。

    您可以用以下任一方式載入與配置模組。

    • 模組載入時直接配置參數。

      1. 在載入tcp_rt模組的同時,將模組配置作為命令參數一併輸入。

        例如載入tcp_rt模組,並配置lports為80。

        sudo modprobe tcp_rt lports=80
      2. 查看配置是否生效。

        sudo cat /sys/module/tcp_rt/parameters/lports
    • 先載入模組,然後進行配置。

      1. 運行以下命令載入模組。

        sudo modprobe tcp_rt
      2. 模組載入後,在/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

  • 卸載模組。

    1. 運行以下命令,停用tcp-rt模組,保證不會有新的串連使用TCP-RT。

      sudo echo 1 > /sys/kernel/debug/tcp-rt/deactivate
    2. 運行以下命令判斷是否所有串連均未使用tcp-rt模組。

      lsmod

      當輸出結果中tcp-rt模組Used by0時,表示沒有串連使用tcp-rt

    3. 當所有串連都不使用tcp-rt模組後,運行以下命令卸載tcp-rt模組。

      sudo rmmod tcp_rt

常見問題

記錄檔大小與配置參數不一致

ls -l等命令顯示檔案大小超過配置值,這是正常現象。記錄檔位於/sys虛擬檔案系統下,ls -l結果不代表真實大小(也不佔磁碟空間)。實際上,這裡相當於累積的總日誌量,保持遞增。若想檢查日誌真實大小,可以將日誌重新導向到檔案後查看。

下圖展示了在預設配置(2 M)下的樣本。可以看到,使用cat將日誌內容重新導向到檔案後,其實際大小約為2 M,符合預期。

image