TCPCopy 線上流量複製工具

2021-09-02 22:42:20 字數 4478 閱讀 2079

tcpcopy是一種重放tcp流的工具,使用真實環境來測試網際網路伺服器上的應用程式。

一、描述:

雖然真實的實時流量對於internet伺服器應用程式的測試很重要,但是由於生產環境中的情況很負責,測試環境很難完全模擬線上環境。為了能夠更真實的測試,我們開發了一款線上流量複製工具-tcpcopy,它可以使用線上真實的流量來對測試環境中的伺服器進行測試。目前,tcpcopy技術已經在中國很多公司大量使用。

二、使用場景:

1)分布式壓力測試

使用tcpcopy複製真實的資料來進行伺服器的壓力測試。有些bug只有在高併發的情況下才能夠被發現。

2)**實驗:

被證明是穩定的新系統,其bug只能在真正使用的時候才能被發現

3)回歸測試

4)效能對比

三、框架:

如figure1中所示,tcpcopy包括兩部分:tcpcopy(client)和intercept(server)(後文中統一將tcpcopy-client稱為tcpcopy,將tcpcopy-server稱為intercept),當tcpcopy執行在生產伺服器並從生產伺服器抓取請求時,inteceptor執行在輔助伺服器上進行一些輔助工作,例如,響應tcpcopy。切記,測試應用程式應該執行在測試伺服器上。

tcpcopy預設情況下使用socket輸入技術在網路層抓取線上的資料報,做一些基本處理(包括:模擬tcp互動,網路控制,以及模擬傳輸層和應用層),使用socket輸出技術傳送資料報到測試伺服器(如粉色箭頭所示)

tcpcopy的測試伺服器需要做的唯一操作是:設定適當的引數使響應資訊傳送到輔助伺服器中(裝intercept的伺服器)(如綠色箭頭所示)

四、快速開始

1、獲取intercept的兩種方式:

1)download the latest intercept release.

2)clone git:

2、獲取tcpcopy的兩種方式

1)download the latest tcpcopy release.

2)clone git:

五、獲取安裝在輔助伺服器上的intercept

1)cd intercept

2)./configure

3)選擇適當的配置引數

4)make

5)make install

六、intercept的配置引數

--single            intercept執行在單機情況下

--with-pfring=path  將路徑設定為pf_ring庫源

--with-debug        以debug模式編譯intercept(儲存在日誌檔案中)

七、獲取安裝在生產伺服器上的tcpcopy

1)cd tcpcopy

2)./configure

3)選擇適當的配置引數

4)make

5)make install

八、tcpcopy的配置引數

--offline 從pcap檔案重放tcp流

--pcap-capture 在資料鏈路層抓包(預設在網路層)

--pcap-send 在資料鏈路層發包(預設在網路層)

--with-pfring=path 將路徑設定為pf_ring庫源

--set-protocol-module=path 設定tcpcopy為外部協議模組工作

--single 如果intercept和tcpcopy都設定為單機模式,只有乙個tcpcopy和乙個intercept一起工作,將會獲得更好的效能

--with-debug 以debug模式編譯tcpcopy(儲存在日誌檔案中)

九、執行tcpcopy

確保tcpcopy和intercept都配置為「./configure」

1)在執行應用程式的測試伺服器上,正確設定路由命令以將響應資料報傳送到輔助伺服器上

例如:假設61.135.233.161是輔助伺服器的ip位址。 我們設定以下route命令將所有對62.135.200.x的的響應路由到輔助伺服器。

route add -net 62.135.200.0 netmask 255.255.255.0 gw 61.135.233.161

2)在執行intercept的輔助伺服器上(需要root許可權或者能使用socket通訊的許可權)

./intercept -f -i

請注意,過濾器格式與pcap過濾器相同。

例如:./intercept -i eth0 -f 'tcp and src port 8080' -d

intercept將捕獲基於tcp應用的響應,該應用監聽在裝置的8080埠上

3)生產伺服器中(需要root許可權或者能使用socket通訊的許可權)

./tcpcopy -x localserverport-targetserverip:targetserverport -s

[-c ]

./tcpcopy -x 80-61.135.233.160:8080 -s 61.135.233.161 -c 62.135.200.x

tcpcopy將抓取當前伺服器上80埠的資料報,修改客戶端ip位址為62.135.200.x,將這些資料報傳送到ip位址為61.135.233.160,埠為8080的測試伺服器,並且連線61.135.233.161,告訴intercept將響應資料報傳送給它(tcpcopy)

雖然「-c」引數是可選的,但在此設定以便簡化路由命令。

十、注意

1)只能在linux上測試(kernal 2.6 or above)

2)tcpcopy可能丟包,因此丟失請求

3)root許可權或socket許可權是必須的(例如 setcap cap_net_raw = ep tcpcopy)

4)tcpcopy現在只支援客戶端啟動的連線

5)tcpcopy不支援使用ssl / tls的伺服器應用程式的重放

6)對於mysql會話重放,請參考 

7)不應該在輔助伺服器上設定ip**

8)請執行「./tcpcopy -h」或「./intercept -h」以獲取更多詳細資訊

十一、影響因素

有幾個因素可能影響tcpcopy,將在以下部分中詳細介紹:

1)抓包介面

tcpcopy預設使用套接字輸入介面在網路層抓取生產伺服器的資料報。在系統忙時,系統核心可能會丟包。

如果你配置tcpcopy的引數「--pcap-capture」,tcpcopy將在資料鏈路層抓包,也可以過濾核心中的資料報。在pf_ring資源中,當使用pcap捕獲時,tcpcopy將丟失更少的資料報。

或許抓請求包的最好方式是通過交換機映象入口的資料報,然後通過負載均衡器將巨大的流量劃分到幾台機器

2)傳送介面

tcpcopy預設使用套接字輸出介面在網路層傳送資料報到測試伺服器。如果你想避免ip連線跟蹤問題或者獲得更好的效能表現,配置tcpcopy的引數「--pcap-send」,設定適當的引數,tcpcopy可以在資料鏈路層傳送資料報到測試伺服器。

3)資料報在通往測試伺服器的路上

當乙個資料報被tcpcopy傳送時,它可能在到達測試伺服器前遭到很多挑戰。由於資料報中的源ip位址依然是終端使用者的ip位址(預設情況下)而不是生產伺服器的ip位址,一些安全裝置可能將該包削弱或當做偽造的包丟棄它。這種情況下,你在測試伺服器使用tcp抓包工具,可能抓取不到期望的終端使用者的資料報。要確定你是否正處於這種情況下,你可以使用同一網段下的測試伺服器做個小測試。如果資料報能被成功的傳送到同一網段的測試伺服器,而不能傳送到不同網段的測試伺服器,那麼證明你的資料報在半路被丟棄了。

為了解決這個問題,我們建議將tcpcopy、測試伺服器、intercept部署在同乙個網段內。在同一網段中有乙個**的幫助下還有另乙個解決方案,tcpcopy可以向**傳送資料報,然後**會將相應的請求傳送到另乙個網段中的測試伺服器。

注意,在同一網段中的乙個虛擬機器上部署目標伺服器應用程式可能面臨上述問題

4)測試伺服器的路由

測試伺服器可能設定了反向過濾技術,可以檢查包中源ip位址是否是被偽造的。如果是,則該包在網路層被丟棄。

如果在測試伺服器中能用tcp抓包工具抓到包,但是測試伺服器上的應用程式接收不到任何請求,你應該檢查你是否有類似反向過濾技術的設定。如果設定了,你不得不移除相關的設定來讓資料報通過網路層。

也有些其他原因可能導致tcpcopy不能正常工作,例如防火牆設定問題。

5)測試伺服器上的應用程式

測試伺服器上的應用程式可能不能及時處理所有的請求。一方面,應用中的bug導致請求很長時間得不到響應;另一方面,一些tcp層以上的協議只處理socket緩衝中的第乙個請求,將剩下的請求留在socket緩衝中不處理。

6)輔助伺服器的路由

你不應該設定ip**為true或者輔助伺服器不能作為乙個黑洞工作。

十二、歷史版本

2014.09 v1.0 tcpcopy released

十三、錯誤和功能請求

有錯誤或功能請求?請開啟乙個新問題。 在開啟任何問題之前,請搜尋現有問題。

十四、版權和許可

tcpcopy複製線上流量

簡介 tcpcopy 是乙個 tcp 流量的實時複製工具,其1.0版本由網易工程師 tcpcopy 開發和維護。一般用來將生產環境的線上流量實時複製到測試環境進行測試。例如新系統上線前,如果我們希望進行一些基本的壓力測試,那麼我們可以直接利用 tcpcopy 來複製線上的流量過來對系統進行測試,這樣...

使用tcpcopy匯入線上流量進行功能和壓力測試

假設我們要上線乙個兩年內不會宕機的先進架構。在上線前,免不了單元測試,功能測試,還有使用ab,webbench等等進行壓力測試。但這些步驟非生產環境下正式使用者的行為。或許你會想到灰度上線,但畢竟可能會影響到部分使用者,這怎麼對得起我們兩年內不宕機的承諾呢?好在網易的 王斌 開發了tcpcopy,可...

使用tcpcopy匯入線上流量進行功能和壓力測試

假設我們要上線乙個兩年內不會宕機的先進架構。在上線前,免不了單元測試,功能測試,還有使用ab,webbench等等進行壓力測試。但這些步驟非生產環境下正式使用者的行為。或許你會想到灰度上線,但畢竟可能會影響到部分使用者,這怎麼對得起我們兩年內不宕機的承諾呢?好在網易的 王斌 開發了tcpcopy,可...