使用tcpcopy匯入線上流量進行功能和壓力測試

2022-02-22 11:34:10 字數 3308 閱讀 2270

假設我們要上線乙個兩年內不會宕機的先進架構。在上線前,免不了單元測試,功能測試,還有使用ab,webbench等等進行壓力測試。

但這些步驟非生產環境下正式使用者的行為。或許你會想到灰度上線,但畢竟可能會影響到部分使用者,這怎麼對得起我們兩年內不宕機的承諾呢?

好在網易的 王斌 開發了tcpcopy, 可以匯入線上流量進行功能和壓力測試。

tcpcopy是一種請求複製工具。可以將線上流量拷貝到測試機器,實時的模擬線上環境。在不影響線上使用者的情況下,使用線上流量進行測試,以盡早發現bug。也可以通過放大流量,進行壓力測試,評估系統承載能力。

傳送到測試伺服器的資料報會在tcp/ip協議棧被識別,其中帶有payload(tcp data)的資料報最終進入到測試伺服器的上層應用(如nginx),上層應用在處理完請求之後,將響應傳遞給測試伺服器的tcp/ip協議棧。

在測試伺服器上啟用ip_queue模組,並使用iptablesip層將響應結果資料報發往queue(ip_queue)。

測試伺服器上執行在使用者空間的攔截程式(intercept程序),通過開啟netlink的socket接受核心通過ip_queue所傳遞來的網路資料報(即上層應用的響應內容)進行裁定,將結果返回核心,進行出佇列的操作。intercept程序缺省會丟棄上層應用的響應內容,返回ip header,以釋放tcp連線。

intercept程序也可以通過-x(passlist)引數,不drop指定ip lists發出請求的響應內容。預設drop是為了:

1 減少出口頻寬占用,節約成本

2 不影響客戶端(線上服務)的`tcp/ip`協議棧

3 不會在網際網路上產生ghost資料報

如上圖,tcpcopy拷貝一次流量訪問的步驟如下:

① 乙個訪問到達線上前端機;

② socket資料報在ip層被拷貝了乙份傳給tcpcopy程序;

③ tcpcopy修改包的目的及源位址,發給目標測試機;

④ 拷貝的包到達目標測試機;

⑤ 目標測試機的nginx處理訪問,並返回結果;

⑥ 返回結果在ip層被截獲、丟棄,由intercpet程序拷貝返回結果的ip header並返回;

⑦ ip header被傳送給線上前端機的tcpcopy程序。

tcpcopy有兩種工作模式:

1 實時拷貝資料報

2 通過使用tcpdump等抓包生成的檔案進行離線(offline)請求重放

安裝步驟如下:
wget  -o tcpcopy-0.9.0.tar.gz --no-check-certificate

tar zxvf tcpcopy-0.9.0.tar.gz

cd tcpcopy-0.9.0

./autogen.sh

./configure --prefix=/usr/local/tcpcopy

make

sudo make install

目標測試機配置

線上伺服器拷貝的資料報傳送至測試伺服器進行處理之後,測試伺服器需要通過iptables將響應結果傳送至queue(ip_queue),這樣測試伺服器上執行的intercept攔截程序才能通過開啟的netlinksocket獲取傳遞過來的資料報並進行裁定。所以測試伺服器上需要開啟iptables防火牆,並啟用核心模組ip_queue

modprobe ip_queue

/etc/init.d/iptables start

因為線上伺服器需要和目標測試伺服器通訊,傳遞請求資料報和控制資訊(封裝的ip packet header),所以需要在測試伺服器上新增相關iptables防火牆規則。編輯/etc/sysconfig/iptables,新增:

-a rh-firewall-1-input -m state --state new -m tcp -p tcp --dport 80 -j accept

-a rh-firewall-1-input -m state --state new -m tcp -p tcp --dport 36524 -j accept

然後重啟iptables

/etc/init.d/iptables restart
接著執行:

iptables -i output -p tcp --sport 80 -j queue
將響應結果傳送至queue(ip_queue),從而實現執行在使用者態的程序對相關資料報進行裁定。

離線 offline

tcpdump -i eth0 tcp and port 80 -s 0 -w online.pcap
2) 將抓包生成的檔案拷貝到測試伺服器

3) 在測試伺服器上進行執行如下命令進行重放

cd /usr/local/tcpcopy/bin

sudo ./intercept

sudo ./tcpcopy -i /path/online.pcap -x 80-10.16.12.11:80

tcpcopy -i 《抓包檔案位址》 -x -《本地ip>:

1) 在測試伺服器上啟動intercept攔截程序

cd /usr/local/tcpcopy/bin

sudo ./intercept

cd /usr/local/tcpcopy/bin

sudo ./tcpcopy -x 80-10.16.12.11:80 -c 10.16.12.12

reference:

[^1] 

[^2] 

[^3] 

[^4] 

使用tcpcopy匯入線上流量進行功能和壓力測試

假設我們要上線乙個兩年內不會宕機的先進架構。在上線前,免不了單元測試,功能測試,還有使用ab,webbench等等進行壓力測試。但這些步驟非生產環境下正式使用者的行為。或許你會想到灰度上線,但畢竟可能會影響到部分使用者,這怎麼對得起我們兩年內不宕機的承諾呢?好在網易的 王斌 開發了tcpcopy,可...

tcpcopy複製線上流量

簡介 tcpcopy 是乙個 tcp 流量的實時複製工具,其1.0版本由網易工程師 tcpcopy 開發和維護。一般用來將生產環境的線上流量實時複製到測試環境進行測試。例如新系統上線前,如果我們希望進行一些基本的壓力測試,那麼我們可以直接利用 tcpcopy 來複製線上的流量過來對系統進行測試,這樣...

TCPCopy 線上流量複製工具

tcpcopy是一種重放tcp流的工具,使用真實環境來測試網際網路伺服器上的應用程式。一 描述 雖然真實的實時流量對於internet伺服器應用程式的測試很重要,但是由於生產環境中的情況很負責,測試環境很難完全模擬線上環境。為了能夠更真實的測試,我們開發了一款線上流量複製工具 tcpcopy,它可以...