tcpcopy可以當做一種壓力測試工具,也可以獲取真實的用戶訪問流量,從而模擬真實運行環境,tcpcopy的開發者這樣介紹它: TCPCopy是一種請求復制(所有基於tcp的packets)工具,其應用領域較廣,利用TCPCopy程序,可以把訪問memcached的系統流量復制一份到membase系統中去。對於membase來說,這份流量就是訪問membase的,跟直接上線
membase效果一樣,就可以做各種試驗,查看membase的各種特性。
主要有以下功能
1)分布式壓力測試工具,利用在線數據,可以測試系統能夠承受的壓力大小,也可以提前發現一些bug
2)普通上線測試,可以發現新系統是否穩定,提前發現上線過程中會出現的諸多問題,讓開
發者有信心上線
3)對比試驗,同樣請求,針對不同或不同版本程序,可以做性能對比等試驗
4)流量放大功能,可以利用多種手段構造無限在線壓力,滿足中小網站壓力測試要求
5)利用TCPCopy轉發傳統壓力測試工具發出的請求,可以增加網絡延遲,使其壓力測試更加真實
6)熱備份
7)實戰演習(架構師必備)
安裝:
復制代碼代碼如下:
tar -zxvf tcpcopy-0.9.0 .tar.gz
cd tcpcopy-0.9.0
./configure
make
make install
注意:tcpcopy 和 intercept的版本,配置參數要一致
現在的代碼已經放在github(https://github.com/session-replay-tools/tcpcopy)上了,1.0 以上的版本,tcpcopy 和 intercept 包已經分開了,需要單獨下載安裝,注意,如果在安裝intercept的時候 ./configure報錯checking for pcap.h … not found,可以 通過yum install libpcap-devel解決。
TCPCopy分為TCPCopy client和TCPCopy server。其中TCPCopy client運行在在線服務器上面,用來捕獲在線請求數據包;TCPCopy server(監聽端口為36524)運行在測試機器上面,在測試服務器的響應包丟棄之前截獲測試服務器
的響應包,並通過TCPCopy client和TCPCopy server之間的tcp連接傳遞響應包的tcp和ip頭部信息給TCPCopy client,以完成TCP交互。
使用方法如下:
TCPCopy server (root用戶執行)
1)啟動內核模塊ip_queue (modprobe ip_queue)
2)設置要截獲的端口,並且設置對output截獲
復制代碼代碼如下: iptables -I OUTPUT -p tcp --sport port -j QUEUE
3)interception
TCPCopy client (root用戶執行)
tcpcopy 本地ip地址1[:本地ip地址2:…] 本地port 遠程ip地址 遠程port
試用:
模擬抓取apache的訪問流量。試用之前清空apache的訪問日志。線上機器:10.1.6.205,線下機器:10.1.6.206。
操作Client-VM2
復制代碼代碼如下:
modprobe ip_queue
iptables -I OUTPUT -p tcp --sport 80 -j QUEUE
interception
操作Client-VM1
復制代碼代碼如下:
tcpcopy 10.1.6.205 80 10.1.6.206 80
作者交待了一些注意事項:
1)Linux平台,內核2.6+,需要支持netlink機制
2)TCPCopy中的tcpcopy和interception程序運行需要root權限
3)interception在同一台機器只需要要運行一個實例,多個實例還不支持
4)TCPCopy client需要連接測試服務器的36524端口,所以要對外開放36524端口
5)TCPCopy由於依賴於抓包函數,壓力大的時候,抓包函數本身不可靠,所以會丟包,
進而丟失請求
6)由於interception程序密切跟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 droppedde的數值不斷增大,修改net.core.rmem_max和net.core.wmem_max參數,
比如sysctl -w net.core.rmem_max=16777216和sysctl -w net.core.wmem_max=16777216)
7)復制同一台機器進程之間的請求,也即Local Requests,請設置lo MTU不超過1500,
並且在配置文件中不要設置127.0.0.1地址,要設置內網或者外網地址
8)TCP segmentation offloading相關問題(要注意網卡tso和gro要關閉)
如果tcpcopy所抓的數據包大小超過MTU,那麼由於raw socket output的原因,需要你
改變在線設置,比如:ethtool -K eth1 tso off ; ethtool -K eth1 gro off
9)TCPCopy server,也即interception程序有可能會成為性能瓶頸,特別是對大數據響應這種情況
10)測試環境最好和在線環境一致,比如連接都保持keepalive
11)TCPCopy只與ip、tcp層的數據有關,如果請求驗證與tcp層以上的協議有關,則系統不能正常運行。
例如:mysql連接協議,由於權限認證與tcp層上面的mysql協議有關,所以復制過去的請求會被目
標測試服務器認為非法請求,這個時候需要針對mysql協議作具體針對性的處理,tcpcopy程序才能正常運行
12)多層架構環境下,測試系統一定要獨立,與在線系統沒有業務關聯,否則會影響在線
13)丟失請求率跟網絡狀況有關,最好在內網內復制請求
14)本系統不支持域名,只支持ip地址
15)針對長請求(比如上傳文件),本系統不是很支持,預計0.5版本會支持
16)客戶端ip地址為內網ip地址,一般情況下其應用請求是無法復制到外網測試機器上面去的。
17)為了避免不必要的麻煩,關閉的時候先關閉tcpcopy,然後再關閉interception