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