【測試環境】TCPCopy 使用方法

來源:互聯網
上載者:User

標籤:lsp   目的   查看   高效能   tcp   tab   targe   多個   lin   

65657691

 

TCPCopy是一種提取複寫(所有基於tcp的packets)工具,可以把線上請求匯入到測試系統中去。目前此工具已經廣泛應用於國內各大互連網公司。

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

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

 

TCPCopy使用方法
TCPCopy分為TCPCopy client(即tcpcopy)和TCPCopy server(即intercept)兩部分。

其中TCPCopy client運行在線上服務器上面,用來捕獲線上請求資料包;

TCPCopy server(預設監聽連接埠為36524)運行在測試機器上面,用來截獲響應包,並傳遞響應包頭資訊給TCPCopy client,以完成TCP互動。

TCPCopy使用分為傳統使用方式和進階使用方式:

傳統使用方法:

TCPCopy server (root使用者執行)
採用IP Queue 模組(核心<3.5,預設採用IP Queue):
1)啟動核心模組ip_queue

1 modprobe ip_queue

 

2)設定要截獲的連接埠,並且設定對output截獲

iptables -I OUTPUT -p tcp --sport port -j QUEUE

 

3)運行intercept程式:

 

./intercept

intercept 常用參數:

-d 參數:可以設定 tcpcopy,intercept 以 daemon 運行 ;

注意,測試完畢需要在測試裝置上執行:

iptables -L --lineiptables -D OUTPUT 1 #刪掉 剛才加入的規則

 

 

或者採用NFQueue 模組(核心>=3.5,預設採用NFQueue):
1)設定iptables:

 iptables -I OUTPUT -p tcp --sport port -j NFQUEUE 

 

2) 運行intercept程式:

 

./intercept

 

TCPCopy client (root使用者執行)

./tcpcopy -x 伺服器應用連接埠號碼-測試伺服器ip地址:測試伺服器應用連接埠

 tcpcopy 常用參數:

-x <transfer,> 
Transfer 具體格式如下 : 
伺服器對外IP地址 : 伺服器應用連接埠號碼 - 測試伺服器 IP 位址 : 測試伺服器應用連接埠 tcpcopy -x 80-42.62.30.205:80

-n 參數:

如果你要進行多重複製,那麼此參數的值就是代表複製過去的流量是線上的n倍,倍數小,效果越好,因為多重複製的原理是修改連接埠號碼,因此複製的倍數越大,連接埠衝突的概越大,特別是源IP地址非常少,短串連的的內網應用場合。系統預設最大值為 1023 倍。
舉例:

./tcpcopy -x 80-192.168.0.2:8080 -n 3

 

-r 參數:
如果你想複製線上服務器應用的部分流量,可以採用-r參數來實現,參數範圍是1~99 ,其它值都是全流量複製。
舉例:

./tcpcopy -x 80-192.168.0.2:8080 -r 20    #複製20%的量

 



 

傳統使用方式注意事項:

(原始碼轉移到了github,敬請注意)

1)Linux平台,核心2.6+,目前tcpcopy傳統架構需要支援netlink機制或者nfqueue(0.6.5版本+支援
nfqueue,在./configure指定nfqueue即可或者對於0.7.0+版本,如果核心為3.5+,則自動採用nfqueue模式)

2)TCPCopy中的tcpcopy和intercept程式運行需要root許可權

3)intercept在同一台機器只需要運行一個執行個體就能支援多個應用的複製(設定多條iptables命令)

4)TCPCopy client需要串連測試伺服器(預設36524連接埠),所以要對外開放相應連接埠

5)TCPCopy由於依賴於抓包函數,壓力大的時候,抓包函數本身不可靠,所以會丟包,進而丟失請求

6)如果採用的是IP Queue模組來截獲響應包,則intercept程式密切跟ip queue核心模組相關,
所以當壓力很大的時候請求丟失率很高,需要最佳化sysctl系統參數才能達到好的效果
(通過cat /proc/net/ip_queue,查看ip queue運行情況,如果Queue dropped的數值不斷增大,
則需要修改ip_queue_maxlen參數,比如echo 4096 > /proc/sys/net/ipv4/ip_queue_maxlen;
如果Netlink dropped的數值不斷增大,修改net.core.rmem_max和net.core.wmem_max參數,
比如sysctl -w net.core.rmem_max=16777216和sysctl -w net.core.wmem_max=16777216)

7)如果要複製127.0.0.1發出的請求到另外一台機器,需要設定-c參數

8)測試環境最好和線上環境一致,比如串連都保持keepalive

9)TCPCopy只與ip、tcp層的資料有關,如果請求驗證與tcp層以上的協議有關,則系統不能正常運行。
例如:mysql連線協定,由於許可權認證與tcp層上面的mysql協議有關,所以複製過去的請求會被目標測試
伺服器認為非法請求,這個時候需要針對mysql協議作具體針對性的處理,tcpcopy程式才能正常運行

10)多層架構環境下,測試系統一定要獨立,與線上系統沒有業務關聯,否則會影響線上

11)丟失請求率跟網路狀況有關,最好在內網內複製請求

12)本系統不支援網域名稱,只支援ip地址

13)更多資訊參考如下文檔
(http://tcpcopy.googlecode.com/files/TCPCopy_Manual_v0.9.6%28Chinese%29.pdf.pdf)

 

進階使用方式:
參考:
http://blog.csdn.net/wangbin579/article/details/8950282
http://blog.csdn.net/wangbin579/article/details/8994601
http://blog.csdn.net/wangbin579/article/details/10148247

 

 

TCPCopy架構和工作原理

基於server的請求回放領域,一般分為離線回放和線上即時複製兩大領域,一般研究者都是從離線回放的角度在苦苦研究,而在即時複製領域,研究非常少。

請求即時複製,一般可以分為兩類:

1)基於應用程式層的提取複寫
2)基於底層資料包的提取複寫

傳統的做法一般從應用程式層面進行複製,比如基於伺服器的提取複寫,這種複製的好處就是實現起來相對簡單,但也存在著若干缺點:
1)提取複寫從應用程式層出發,穿透整個協議棧,這樣就容易擠占應用的資源,比如寶貴的串連資源;
2)測試跟實際應用耦合在一起,容易導致對線上系統的影響,比如有些基於伺服器的複製,會導致使用者請求的處理時間取決於最慢的請求處理時間(max(真正的請求處理時間,被複製的請求請求處理時間));
3)很難支撐壓力大的提取複寫(據若干使用者反映,這種類型的提取複寫,曾經嚴重影響線上系統);
4)很難控制網路延遲;

 

基於底層資料包的提取複寫,可以做到無需穿透整個協議棧:

路程最短的,可以從資料連結層抓請求包,從資料連結層發包,

路程一般的,可以在IP層抓請求包,從IP層發出去;

不管怎麼走,只要不走TCP,對線上的影響就會小得多。

 

 

進入正題,tcpcopy是如何進行架構演化的呢?

tcpcopy架構已曆經三代,基本原理都一樣,本質是利用線上資料包資訊,類比tcp用戶端協議棧,欺騙測試伺服器的上層應用服務。由於tcp互動是相互的,一般情況下需要知道測試伺服器的響應資料包資訊,才能利用線上請求資料包,構造出適合測試伺服器的請求資料包,因此只要基於資料包的方式,無論怎麼實現(除非是tcp協議改的面目全非),都需要返迴響應包的相關資訊。

三種架構的差別就在於在什麼地方截獲響應包

我們先看看tcpcopy最初的架構:

 

從可以看出,tcpcopy是從資料連結層(pcap介面)抓請求資料包,發包是從IP層發出去,測試伺服器的TCP協議棧沒有類似ip queue或者nfqueue的幹擾,響應包會直接返回給線上機器(通過設定路由),tcpcopy可以在資料連結層捕獲到這些響應包,這些響應包會到達IP層,一般最終被丟棄掉(除非是用戶端IP地址就是這台線上機器的IP地址,會通過IP層,但會被TCP reset掉)。

回到正題,這種架構一般只能工作在同一網段,而且對於外網應用,一般只能複製單台線上流量給測試伺服器,無法對網易廣告投放系統進行深度問題發現和潛能挖掘。



第一種架構總結如下:
好處:
1)簡單,粗暴
2)適合煙霧測試 (Smoke Test)
3)測試結果比較真實


不好的地方:
1)相對而言,會更加影響線上,因為響應包資訊全部回給線上機器了(當然這種還是比應用程式層面的提取複寫,影響更小)
2)同一網段限制
3)對於外網應用,無法充分利用或者很難充分利用多台線上流量,從而無法為壓力測試提供支援人員
4)內網應用嚴重受限制,因請求的用戶端IP地址不能是被複製的線上機器的IP地址

 

 

第二種架構,也就是目前開源的架構,設計也是tcpcopy鼻祖王波同學設計(2010年設計出來,2011.6月設計移交給多人,包括我),大致架構如下:

從上面圖中我們可以看出,tcpcopy預設從IP層抓包,從IP層發包,與第一種架構不同的是,我們在測試伺服器進行響應包的截獲,並通過intercept程式返迴響應包的必要資訊給tcpcopy。這種架構為分布式壓力測試提供了可能性,相比第一種架構,大大推動了tcpcopy的進化。

我們先從響應包的截獲來分析,理論上,可以在測試伺服器的IP層或者資料連結層進行截獲響應包,我們具體分析如下:

1)在資料連結層抓,正常情況下,其響應資料包會返回給真正發起請求的用戶端,這會或多或少影響到用戶端的TCP(頻繁地reset)模組,而且在壓力大的時候,會給交換器、路由器甚至整個網路,帶來不必要的幹擾。

2)在測試伺服器的IP抓響應包,正好有netlink技術來解決上面的問題,netlink是一種使用者態進程與核心進行互動的技術,具體地我們可以利用核心模組ip queue(核心3.5以下版本)或者nfqueue(核心3.5或者以上版本)來達到捕獲響應包的目的。

我們採用了第二種方式,也即中的IP層來截獲響應包,當響應包傳遞給intercept後,我們就能copy到響應包資訊的必要資訊(一般為TCP/IP頭部資訊),傳遞給tcpcopy,我們還可以通過verdict告訴核心,該如何處理這些響應包,如果沒有設定白名單的話,就會在IP層丟棄掉這些響應包,這時候你是無法利用tcpudmp來抓到這些響應包的(tcpdump工作在資料連結層)。


這種設計的好處就是可以支援複製多台線上流量到一台測試伺服器中去,我們在intercept保留路由資訊,知道響應包的相關資訊該如何返回給哪一個tcpcopy執行個體。然而這種架構,intercept會不同程度地佔用測試伺服器的資源,而且ip queue或者nfqueue,並不一定能夠生產力,因而給測試,特別是高壓測試和短串連壓力測試,帶來了很大麻煩。

這種架構總結如下:
好處:
1)支援複製多台線上流量
2)影響線上機器更小,因為一般只需要返回TCP/IP頭部資訊

不好的地方:
1)較第一種更為複雜
2)效能極限往往在ip queue或者nfqueue
3)intercept擴充性不好,受制於ip queue和nfqueue無法支援多進程進行響應包的捕獲操作
4)intercept影響測試伺服器的最終測試結果,特別是壓力大的時候
5)無法對測試伺服器進行完整測試(沒有覆蓋到資料連結層的出口)
6)營運不方便

 

 

第三種架構,如:

 

上述架構,也即最新架構,是為了極限測試的目的而設計的,把intercept的工作從測試伺服器(test server)中offload出來,放到另外一台獨立的次要伺服器(assistant server,原則上一定要用同網段的一台閑置的伺服器來充當次要伺服器)上面進行截獲響應包,而且把原先從IP層捕獲響應資料包的工作轉移到從資料連結層抓響應包,這些改變大大降低了對測試機器的各種幹擾(除了路由設定,其它已經沒有影響了),而且大大擴大了捕獲響應包的能力。當然這種測試也更加真實。

 

具體如下:

在運行上層服務的測試伺服器test server上面設定路由資訊,把待測試應用的需要被捕獲的響應資料包資訊路由到次要伺服器assistant server 上面,在assistant server上面,我們在資料連結層截獲到響應包,從中抽取出有用的資訊,再返回給相應的tcpcopy。

為了高效使用,這種架構推薦使用pcap進行抓包,這樣就可以在核心態進行過濾,否則只能在使用者態進行包的過濾,而且在intercept端或者tcpcopy端設定filter(通過-F參數,類似tcpdump的filter),達到多個執行個體來共同完成抓包的工作,這樣可擴充性就更強,適合於超級高並發的場合。

 

這種架構需要的機器資源也更多,而且也變得更加難使用,需要瞭解tcp知識,route知識和pcap filter知識(類似於tcpdump過濾條件),因此推薦有條件的並且熟悉上述知識的人使用最新的架構。

 

需要注意的是,在某些情境,pcap抓包丟包率會遠高於raw socket抓包,因此tcpcopy出現大量“unsend:too many packets”的警示,請採用raw socket方式來抓包(tcpcopy採用./configure --enable-advanced,而intercept 採用./configure --enable-advanced --enable-pcap)。


總結如下:
好處:
1)更加真實
2)可擴充性更強
3)適合高並發場合
4)無ip queue或者nfqueue的各種限制
5)對測試伺服器幾乎沒有任何效能幹擾的影響
6)在運行服務的測試伺服器,營運更加方便
7)不會隨運行服務的伺服器崩潰而崩潰

 

 

不好的地方:
1)操作難度更大
2)需要的機器數量更多
3)需要的知識也更多
4)assistant server(運行intercept的機器)原則上必須要和測試伺服器(test server)在同一個網段

 

上面三種架構均具有價值,目前開源出來的僅僅包括第二種架構和第三種架構,tcpcopy預設採用第二種架構,有條件的可以採用第三種架構。

 

對於如何採用新架構,參考http://blog.csdn.net/wangbin579/article/details/8950282

 

最後,對於提取複寫,要想達到對線上沒有影響或者影響儘可能小,可以採用如下對策:

利用高效能的旁路機制(如果採用鏡像,需要改用戶端資料包的目的地址),複製請求資料包到另外一個獨立的系統,在這個獨立的系統,我們採用第三種架構,進行請求的捕獲,再複製給測試伺服器上面的應用。

【測試環境】TCPCopy 使用方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.