linux中tcpcopy壓力測試工具測試

來源:互聯網
上載者:User

一、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就開始使用了新的架構方式。這裡就只看下其新的架構:

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

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

三、tcpcopy安裝及配置選項
安裝

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

 代碼如下 複製代碼
# git clone git://github.com/wangbin579/tcpcopy.git
此處也可以從github上下載zip包
# cd tcpcopy-0.9.9
# sh autogen.sh
# ./configure --enable-選項
# make && make install

編譯選項

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

--enable-debug      compile TCPCopy with debug support (saved in a log file)
--enable-mysqlsgt   run TCPCopy at mysql skip-grant-tables mode(recommended)
--enable-mysql      run TCPCopy at mysql mode
--enable-offline    run TCPCopy at offline mode
--enable-pcap       run TCPCopy at pcap mode
--enable-udp        run TCPCopy at udp mode
--enable-nfqueue    run the TCPCopy server (intercept) at nfqueue mode
--enable-advanced   run TCPCopy at advanced mode (advanced archecture)
--enable-dlinject   send packets at the data link layer instead of the IP layer
--enable-rlantency  add more lantency control
具體也可以通過./configure --help查看 。

錯誤

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

autogen.sh: 1: autogen.sh: autoreconf: not found
解決方案:sudo apt-get install automake

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

no need to check nfqueue or ip_queue
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 選項時,可能遇到的報錯:

configure: error: pcap.h not found.
解決方案:sudo apt-get install libpcap-dev

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

 

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

A主機:作為要求者,在應用情境中,可以理解其是前端nginx、loadrunner測試機

B主機:線上主機,在應用情境中,可以理解為其是web架構中的tomcat、resin等應用(其可以通過nginx反向 Proxy過來訪問,也可以是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主機:

配置路由

 代碼如下 複製代碼
# route add -host 172.20.0.130 gw 172.20.0.39

D主機:

安裝tcpcopy

 代碼如下 複製代碼

# ./configure --enable-advanced --enable-pcap --enable-nfqueue
# make
# make install
運行intercept

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

 代碼如下 複製代碼
# modprobe ip_queue # if not running
# iptables -I OUTPUT -p tcp --sport port -j QUEUE # if not set
# ./intercept

由於這裡我使用的ubuntu的核心版本大於3.5,按如下方式進行啟動

# sudo iptables -I OUTPUT -p tcp --sport 8080 -j NFQUEUE
# sudo intercept -i eth0 -F 'tcp and src host 172.20.0.42 and src port 8080' -d
註:在老的傳統架構中根據核心版本的不同,需要按上面的步驟進行啟動。在新架構中上面防火牆部分是不需要啟動的,這裡要感謝原作者王斌及時給予的觀念糾正 。

B主機

安裝tcpcopy

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

 代碼如下 複製代碼
# ./configure --enable-advanced --enable-pcap
# make
# sudo make install

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

啟動tcpcopy

 代碼如下 複製代碼
# 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上的部落格。

五、離線測試

離線主機只需要兩台主機:線上主機和測試主機 。

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

 代碼如下 複製代碼
tcpdump -i any tcp and port <port> -s 0 -w online.pcap

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

 代碼如下 複製代碼

# ./configure --enable-offline
# make
# sudo make install
在測試伺服器上啟動intercept和tcpcopy

# modprobe ip_queue (核心大於3.5時不需要該操作)
# iptables -I OUTPUT -p tcp --sport <port> -j QUEUE
# intercept

將線上抓取的包回放

 代碼如下 複製代碼
# tcpcopy -i <抓包檔案地址> -x <port>-<本地ip>:<port>

註:

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

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.