假設我們要上線乙個兩年內不會宕機的先進架構。在上線前,免不了單元測試,功能測試,還有使用ab,webbench等等進行壓力測試。
但這些步驟非生產環境下正式使用者的行為。或許你會想到灰度上線,但畢竟可能會影響到部分使用者,這怎麼對得起我們兩年內不宕機的承諾呢?
好在網易的 王斌 開發了tcpcopy, 可以匯入線上流量進行功能和壓力測試。
tcpcopy
是一種請求複製工具。可以將線上流量拷貝到測試機器,實時的模擬線上環境。在不影響線上使用者的情況下,使用線上流量進行測試,以盡早發現bug。也可以通過放大流量,進行壓力測試,評估系統承載能力。
傳送到測試伺服器的資料報會在tcp/ip
協議棧被識別,其中帶有payload
(tcp data)的資料報最終進入到測試伺服器的上層應用(如nginx),上層應用在處理完請求之後,將響應傳遞給測試伺服器的tcp/ip
協議棧。
在測試伺服器上啟用ip_queue
模組,並使用iptables
在ip
層將響應結果資料報發往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
攔截程序才能通過開啟的netlink
socket獲取傳遞過來的資料報並進行裁定。所以測試伺服器上需要開啟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,它可以...