tcpcopy壓力測試

一、tcpcopy簡介

XCopy是由主要由網易的王斌開發的一套流量複製測試工具。XCopy系列包括 TCPCopy、UDPCopy、MysqlCopy 等開源軟件(這些軟件都集成在tcpcopy 開源項目內)。曾經應用於網易的廣告投放系統,urs系統,nginx hmux協議等系統,避免了上線帶來的很多問題。所以很多時候我們指的tcpcopy (廣義上的)就包括xcopy的全系統產品。

TCPCopy 包含兩部分:TCPCopy client(tcpcopy) 和 TCPCopy server(intercept) ,其中,TCPCopy client 運行在在線系統,用來捕獲在線請求數據包,而 TCPCopy server 運行在測試系統,用來做一系列輔助配合工作,如返回響應包頭信息、維護路由信息等。

二、tcpcopy新架構

目前tcpcopy的最新版本是0.9.9 ,而自v0.8版本以後tcpcopy就開始使用了新的架構方式。這裏就只看下其新的架構:

tcpcopy-yuanli

相對於0.8之前的老架構,新架構將 intercept 的工作從測試服務器(test server)offload 出來,放到另外一臺獨立的輔助服務器(assistant server,原則上一定要用同網段的一臺閒置的服務器來充當輔助服務器)上面截獲響應包, 而且把傳統架構從 IP 層捕獲響應數據包的工作轉移到從數據鏈路層抓響應包,這些改變大大降低了 TCPCopy 對測試機器的各種干擾(新架構下,除了路由設置,其它已經沒有影響了) ,大大增強了 intercept 捕獲響應包的能力,而且測試也更加真實。

新舊架構的對比,可以參看官方提供的中文手冊

三、tcpcopy安裝及配置選項

安裝

tcpcopy託管在github上,其項目主頁爲:https://github.com/wangbin579/tcpcopy  ,可以通過下面的方法安裝tcpcopy

  1. # git clone git://github.com/wangbin579/tcpcopy.git
  2. 此處也可以從github上下載zip
  3. # cd tcpcopy-0.9.9
  4. # sh autogen.sh
  5. # ./configure --enable-選項
  6. # make && make install

編譯選項

其中--enable的可選選項有:

  1. --enable-debug compile TCPCopy with debug support (saved in a log file)
  2. --enable-mysqlsgt run TCPCopy at mysql skip-grant-tables mode(recommended)
  3. --enable-mysql run TCPCopy at mysql mode
  4. --enable-offline run TCPCopy at offline mode
  5. --enable-pcap run TCPCopy at pcap mode
  6. --enable-udp run TCPCopy at udp mode
  7. --enable-nfqueue run the TCPCopy server (intercept) at nfqueue mode
  8. --enable-advanced run TCPCopy at advanced mode (advanced archecture)
  9. --enable-dlinject send packets at the data link layer instead of the IP layer
  10. --enable-rlantency add more lantency control

具體也可以通過./configure --help查看 。

錯誤

安裝過程中可能遇到的報錯有如下幾個:

  1. autogen.sh: 1: autogen.sh: autoreconf: not found

解決方法:sudo apt-get install automake 

編譯時,使用--enable-nfqueue 選項時,可能遇到的報錯:

  1. no need to check nfqueue or ip_queue
  2. checking for nfqueue directory... configure: error: nfqueue required. Install libnetfilter_queue(download it from http://www.netfilter.org/projects/libnetfilter_queue/index.html) or specify its path using --with-nfqueue=/dir/

解決方法:sudo apt-get install libnetfilter-queue-dev  

編譯時,使用--enable-pcap 選項時,可能遇到的報錯:

  1. configure: error: pcap.h not found.

解決方法:sudo apt-get install libpcap-dev

四、tcpcopy在線複製

在tcpcopy 的新架構中,在線複製測試至少需要4臺主機。其中四者之間的關係我簡單畫了一個草圖,相對於架構圖可能更好理解一些:

tcpcopy-online

上面四臺主機的角色關係如下:

A主機:作爲請求者,在應用場景中,可以理解其是前端nginx、loadrunner測試機

B主機:線上主機,在應用場景中,可以理解爲其是web架構中的tomcat、resin等應用(其可以通過nginx反向代理過來訪問,也可以是loadrunner直接通過http://IP:端口的形式訪問的對象)

C主機:測試主機,在應用場景中,其跑的應用是和B主機上的應用一致的。比如,新版本或新功能的應用布在C主機上,通過複製B主機的流量時行真實環境下的壓力測試,就可以得出其是否存在bug,性能如何等。這也是tcpcopy測試的目的。該機在測試環境中,需要配置route路由。

D主機:intercept主機,即架構圖中的輔助服務器。intercept通過和tcpcopy之間的通信,控制B、C間流量的複製。而最終在C主機上的模擬結果,就相當於A主機直接請求C主機一樣(這也就是圖中A、C之間灰色箭標的意思)。

注:以上只是我的個人理解。現實測試環境中,根據模擬壓力的不同,A、B、C、D 可以同時是 N 臺 。

現根據上面的架構,模擬進行復制,各主機的IP如下:

A主機:172.20.0.130

B主機:172.20.0.40

C主機:172.20.0.42

D主機:172.20.0.39

A主機:

不需要任何配置 

C主機:

配置路由

  1. # route add -host 172.20.0.130 gw 172.20.0.39

D主機:

安裝tcpcopy

  1. # ./configure --enable-advanced --enable-pcap --enable-nfqueue
  2. # make
  3. # make install

運行intercept

如果D主要的內核版本小於3.5,編譯時就不需要後面的--enable-nfqueue參數,其使用uqeue模塊,按如下方式運行intercept

  1. # modprobe ip_queue # if not running
  2. # iptables -I OUTPUT -p tcp --sport port -j QUEUE # if not set
  3. # ./intercept

由於這裏我使用的ubuntu的內核版本大於3.5,按如下方式進行啓動

  1. # sudo iptables -I OUTPUT -p tcp --sport 8080 -j NFQUEUE
  2. # sudo intercept -i eth0 -F 'tcp and src host 172.20.0.42 and src port 8080' -d

注:在老的傳統架構中根據內核版本的不同,需要按上面的步驟進行啓動。在新架構中上面防火牆部分是不需要啓動的,這裏要感謝原作者王斌及時給予的觀念糾正 。

B主機

安裝tcpcopy

使用下面的方法的進行編譯安裝

  1. # ./configure --enable-advanced --enable-pcap
  2. # make
  3. # sudo make install

注:這裏的--enable-pcap參數可以不加,增加了的好處就是可以對包進行條件過濾。

啓動tcpcopy

  1. # sudo tcpcopy -x 172.20.0.40:8080-172.20.0.42:8080 -s 172.20.0.39 -i eth0 -d

驗證

默認tcpcopy安裝完生成後會在/usr/loca/bin目錄下生成tcpcopy和intercept執行文件 ,上面我們的啓動過程中也沒有使用 -l 參數指定日誌文件的位置,默認會在/usr/local/bin目錄下生成error_intercept.log 文件(B、D主機都有)。我們通過查看該日誌文件可以查看tcpcopy和intercept之間的信息交互。

驗證流量複製是否成功,可以通過查看B、C 兩臺主機的access日誌,可以查看下從A主機到B主機的訪問是否同樣在C主機上也有體現 ,如果有,就證明覆製成功。

注:根據內外網測試環境的複雜度不同,路由規則可能也有細微的差別。具體可以參看王斌在csdn上的博客

五、離線測試

離線主機只需要兩臺主機:在線主機和測試主機 。

在線主機上通過下面的方式抓包:

  1. tcpdump -i any tcp and port <port> -s 0 -w online.pcap

測試服務器上安裝離線版tcpcopy

  1. # ./configure --enable-offline
  2. # make
  3. # sudo make install

在測試服務器上啓動intercept和tcpcopy

  1. # modprobe ip_queue (內核大於3.5時不需要該操作)
  2. # iptables -I OUTPUT -p tcp --sport <port> -j QUEUE
  3. # intercept
  4. 將在線抓取的包回放
  5. # tcpcopy -i <抓包文件地址> -x <port>-<本地ip>:<port>

注:

1、上面的iptables操作一定要有,沒有的話包無法進行回放。

2、tcpcopy回放過程中的 本地IP ,可以是本機的IP也可以是局域網中的其他主機的IP 。

上面的操作中是將tcpcopy包回放主機和測試主機放在了同一臺上。如果想將tcpcopy包回放的主機單獨用一臺,步驟則改爲如下:

A主機:172.20.0.39 (測試機)

B主機:172.20.0.21 (tcpcopy包回放機)

A主機上執行如下操作

  1. # iptables -I OUTPUT -p tcp --sport <port> -j QUEUE
  2. # intercept -d

B主機上執行如下操作

  1. # tcpcopy -i <抓包文件地址> -x <port>-<本地ip>:<port>

樣做的好處是將包回放主機和測試主機進行了分離,減小tcpcopy運行過程中對測試數據的影響。


http://www.361way.com/tcpcopy-online-offline/3510.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章