1. 程式人生 > >tcpcopy複製線上流量

tcpcopy複製線上流量

TCPCopy七大功能
1)分散式壓力測試工具,利用線上資料,可以測試系統能夠承受的壓力大小(遠比ab壓力測試工具真實地多),也可以提前發現一些bug
2)普通上線測試,可以發現新系統是否穩定,提前發現上線過程中會出現的諸多問題,讓開發者有信心上線
3)對比試驗,同樣請求,針對不同或不同版本程式,可以做效能對比等試驗
4)流量放大功能
5)利用TCPCopy轉發傳統壓力測試工具發出的請求,可以增加網路延遲,使其壓力測試更加真實
6)熱備份
7)實戰演習(架構師必備)

TCPCopy的特點
1)實時 (離線通過configure --enable-offline)
2)效果真實
3)低負載,不影響線上
4)操作簡單
5)分散式
6)零成本

可能會遇到的問題

王斌自己講:要想用好 tcpcopy,需要熟悉系統知識,包括如何高效率抓包,如何定位系統瓶頸,如何部署測試應用系統,如何抓包分析。常見問題有:1)部署測試系統不到位,耦合線上系統,2)忽視系統瓶頸問題,3)不知道如何定位問題,4)資源不到位,資源緊張引發的問題 。

 

1)ip_conntrack

2014年6月,微博的唐福林曾說:“Tcpcopy 引流工具是線上問題排查的絕佳之選,但使用者很少有人去關注開啟 tcpcopy 服務時,同時會開啟 ip_conntrack 核心模組,這個模組負責追蹤所有 tcp 連結的狀態,而且它的內部儲存有長度限制,一旦超過,所有新建連結都會失敗。”

王斌則迴應說:“開啟 tcpcopy,自身不會去開啟 ip_conntrack 核心模組。開不開啟 ip_conntrack 核心模組,是使用者自己決定的,跟 tcpcopy 沒關係。”他還建議:“當連線數量非常多的時候,本身就應該關閉 ip_conntrack,否則嚴重影響效能。至於 tcpcopy,預設是從 ip 層發包的,所以也會被 ip_conntrack 干涉,文件中也有描述,其實也可以採用 --enable-dlinject 來發包,避開ip層的ip_conntrack。如果沒有報“ip_conntrack: table full, dropping packet”,一般無需去操心ip_conntrack。”以及“線上連線不多的場合,開啟 ip_conntrack 並沒有問題。線上連線比較多的場合,最好關閉 ip_conntrack,或者對線上應用系統埠設定 NOTRACK,至少我周圍的系統都是這樣的,這是為效能考慮,也是一種好的運維習慣。”

 

2)少量丟包

如何發現 TCPCopy 丟包多還是少呢?

王斌自己稱,在某些場景下,pcap 抓包丟包率會遠高於 raw socket 抓包,因此最好利用 pf_ring 來輔助或者採用 raw socket 來抓包。

丟包率需要在測試環境中按照定量請求傳送進行對比才能展開計算,另外還需要對日誌內容進行分析,有待測試。

 

3)離線重放

tcpcopy 有兩種工作模式:

1)實時拷貝資料包;

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

本次模擬測試,沒有試驗成功第二種工作模式,留待以後進一步研究。

 

4)不提取 7 層資訊

會議上曾提出按域名區分拷貝流量,省得把不在本次壓測範圍內的工程打掛,但 tcpcopy 的原理是在 ip 層拷貝,不提取 7 層的資訊,也就是說,在我們的 Nginx*4 上部署 TCPCopy,只能是將所有流量拷貝到映象環境的 Nginx 上。反正沒有配置對應的 server,或者 server 停掉,這種處理不了的流量就丟棄掉。

 

0x05,觀測的效能指標

模擬壓測時,需要記錄下 Test Server 以及後端各種被壓工程的效能指標。

本次壓測,我們記錄的指標有:

  • Java 工程的訪問次數,響應時間,平均響應時間,呼叫成功或失敗,Web埠連線數;
  • Web容器的 thread、memory 等情況;
  • 虛擬機器的 CPU-usage、Load-avg、io-usage 等;
  • memcached/redis 等快取叢集的命中率等;

 

 下載及安裝
1.1. 下載
需要兩個工具,分別是:

tcpcopy
intercept
1.2. 工具部署
使用tcpcopy進行線上導流,通常需要 3 臺伺服器:

online server (執行 tcpcopy)
target server (流量從 online server 複製到此機器)
assistant server (執行 intercept)
1.3. 安裝及命令使用方法
1.3.1. tcpcopy
./configure(線上導流模式)

./configure --offline(離線回放模式)
make
make install

線上導流方法:

tcpcopy -x localServerPort-targetServerIP:targetServerPort -s interceptServerIP
  [-c <ip range,>] -d

離線重放方法:

tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.136 -i test.pcap -n 2

將 test.pcap 報文放大 2 倍傳送給 192.168.44.137

1.3.2. intercept
cd intercept
./configure
make
make install

使用方法:

intercept -F <filter> -i <device,>

二. 測試
假設我們 3 臺伺服器情況分別如下: 
- online server: 192.168.44.128 
- target server: 192.168.44.137 
- assistant server: 192.168.44.136

2.1. 執行命令
2.1.1. target server
如果是在同一網段,設定去往 online server 的響應,路由到 assistant server,可以這樣指定:

route add -host onlineIP gw assistantIP

如果客戶端 IP 來自於其它網段的話:

route add -net xxx.xxx.xxx.0 netmask 255.255.255.0 gw assistantIP

這裡新增靜態路由:

route add -net 192.168.50.0 netmask 255.255.255.0 gw 192.168.44.136

確保被測試應用程式的響應包路由到輔助測試伺服器,而不是回包給 online server

2.1.2. assistant server
intercept -i eth0 -F 'tcp and src port 80' -d

intercept 過濾 eth0 網絡卡 80 埠的 tcp response 報文。

輔助伺服器要確保沒有開啟路由模式,為0表示沒有開啟:

cat /proc/sys/net/ipv4/ip_forward

輔助伺服器上的 intercept 通過 pcap 抓取測試機應用程式的響應包,將頭部抽取後傳送給 online server 上的 tcpcopy ,從而完成一次請求的複製。

2.1.3. online server
tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.136 -c 192.168.50.x -d

將本機 80 埠資料轉發給192.168.44.137:80,更改 client IP 為 192.168.50.x 之一,並從 192.168.44.136 獲取 response 報文。

2.2. 檢視各 server 報文情況
可以在各個 server 上使用 tcpdump 抓包檢視收發報文情況

如:online server 上

tcpdump -n -i eth0 port 80 and dst host 192.168.44.137

三. 遇到的問題
3.1. 無法複製流量問題
之前在三臺機器都是同網段的機器上測試,是可以成功複製流量的,但是 online server 與 target server 不在同一網段時,發現無法複製流量。

抓包發現

online ------(SYN)------> target
online <---(SYN + ACK)--- target
online ------(RST)------> target

解決方案

採用兩臺機器方案: 
- online server,假設 IP 1.2.3.4 
- target server,假設 IP 192.168.44.137

online server 執行:

tcpcopy -x 80-192.168.44.137:80 -s 192.168.44.137 -c 1.2.3.4 -d

online server iptables 新增下面規則

iptables -A INPUT -s 192.168.44.137 -p tcp --sport 80 -j DROP

target server 執行:

intercept -i eth0 -F 'tcp and src port 80' -d

然後可以分別在兩臺伺服器上檢視日誌,如 nginx:

tail -f /usr/local/nginx/logs/access.log

參考資料:

http://www.cnblogs.com/zhengyun_ustc/p/tcpcopy.html

https://www.cnblogs.com/chenny7/p/3912515.html

https://blog.csdn.net/fengfengdiandia/article/details/77776026