當前位置:
首頁 > 知識 > 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

tcpcopy複製線上流量

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

JS常用方法匯總
ERR_CONTENT_LENGTH_MISMATCH

TAG:程序員小新人學習 |