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


※JS常用方法匯總
※ERR_CONTENT_LENGTH_MISMATCH
TAG:程序員小新人學習 |