Tcpcopy前端
0. 手把手教你作中間件、高性能服務器、分佈式存儲技術交流羣linux
手把手教你作中間件、高性能服務器、分佈式存儲等(redis、memcache、nginx、大容量redis pika、rocksdb、mongodb、wiredtiger存儲引擎、高性能代理中間件),git地址以下:nginx
git地址:https://github.com/y123456yz/middleware_development_learninggit
1. 簡介github
TCPCopy是一種請求複製(全部基於tcp的packets)工具,能夠把在線流量導入到測試系統中去。目前此工具已經普遍應用於各大互聯網公司。redis
項目網址:https://github.com/wangbin579/tcpcopymongodb
https://github.com/session-replay-tools/intercept服務器
2. TCPCopy功能網絡
1)分佈式壓力測試工具,利用在線數據,能夠測試系統可以承受的壓力大小(遠比ab壓力測試工具真實地多),也能夠提早發現一些bugsession
2)普通上線測試,能夠發現新系統是否穩定,提早發現上線過程當中會出現的諸多問題,讓開發者有信心上線
3)對比試驗,一樣請求,針對不一樣或不一樣版本程序,能夠作性能對比等試驗
4)流量放大功能,能夠利用多種手段構造無限在線壓力,知足中小網站壓力測試要求
5)利用TCPCopy轉發傳統壓力測試工具發出的請求,能夠增長網絡延遲,使其壓力測試更加真實
6)熱備份
3.組成部分
1. TCPCopy Server(tcpcopy):部署在 測試服務器 ,用於接收復制的線上請求,github地址:
https://github.com/session-replay-tools/tcpburn
2. TCPCopy Client(intercept):部署在 線上服務器 ,用於捕獲線上請求,經過修改TCP/IP數據包,發送到TCPCopy Server進行穩定性測試,截獲響應包,並傳遞響應包頭信息給TCPCopy client,以完成TCP交互。Github地址:
https://github.com/session-replay-tools/intercept
4. tcpcopy工做流程
一個訪問到達線上前端機;
socket數據包在ip層被拷貝了一份傳給tcpcopy進程;
tcpcopy修改包的目的及源地址,發給目標測試機;
拷貝的包到達目標測試機;
目標測試機的nginx處理訪問,並返回結果;
返回結果在ip層被截獲、丟棄,由intercpet進程拷貝返回結果的ip header並返回;intercept會經過tcpcopy與intercept之間的套接字來發送tcpcopy重放報文中的IP+TCP數據給tcpcopy,能夠參考intercept中的函數tc_socket_snd
ip header被髮送給線上前端機的tcpcopy進程。
5. 常見的幾種引流方式
5.1 離線流量回放
用法:離線回放模式須要在configure 的時候加上--enable-offline 參數,離線回放還須要安裝pcap 庫和pcap 開發庫(須要用到pcap 庫的頭文件)另外運行的時候須要指定-i 參數,例如:
./tcpcopy -x 110-xxx.xxx.xxx.148:110 -i ./online.pcap
這裏oline.pcap(利用相似於tcpdump 的工具來抓請求數據包,存放到pcap 格式的文件中去)文件做爲數據源,把請求轉發到測試服務器上。此外增長-a參數對請求數據包的訪問進行加速,以下:
./tcpcopy -x 80-xxx.xxx.x.xx:8080 -a 2 -i online.pcap
假設online.pcap 文件爲在線請求數據包的抓包文件,時間間隔爲60 分鐘。執行此命令後,離線回放加速了2 倍,只須要30 分鐘離線回放就能完成,-a 參數設置不宜設置過大,越大丟請求的機率也越大。
適用場景:因爲離線方式依賴於抓包工具(如tcpdump),而抓包工具在壓力比較大的場合通常丟包很是嚴重,並且還會嚴重影響在線IO,所以通常不推薦在高壓狀況下使用離線回放方式
1、tcpcpoy和測試組件合設。
2、一臺機器起多個tcpcopy.用虛擬機。先試一下。或者看下代碼,確認(全部疑惑點。真正的技術點)。
系統全鏈路壓測系統。慢慢了解下性能測試團隊。
5.2 部分引流
用法:Tcpcopy能夠經過-r參數實如今線服務器應用的部分流量複製,參數範圍是1~99,其它值都是全流量複製。-r 參數經常使用於測試服務器配置不如在線服務器的場合。
#./tcpcopy -x 2080-xxx.xx.xx.xxx:9999 -r 20
這裏tcpcopy 複製在線服務器2080 端口應用的20%流量給測試服務器,這裏的20%是根據session(這裏session 是由客戶端IP,客戶端端口決定)來統計的。
適用場景:部分引流主要適用於線上請求壓力不少,而測試環境的處理能力較弱,這時候就只需複製部分線上的請求到測試環境,就能夠壓到測試環境的極限.
5.3 放大流量
用法:Tcpcopy能夠經過-n參數對在線服務器應用的流量進行復制放到到測試服務器,若是你要進行多重複制,-n參數
#./tcpcopy -x 2080-xxx.xx.x.xxx:9999 -n 3
表示複製3 倍的在線服務器的80 端口應用請求流量到192.168.0.2 的8080 端口
適用場景:放大引流主要用於線上壓力較小時,想要經過無限構造壓力經過成倍引流達到對測試服務器進行壓力測試的目的
6. 應用舉例
TCPCopy分爲TCPCopy client(也即tcpcopy)和TCPCopy server(也即intercept)。其中TCPCopy client運行在在線服務器上面,用來捕獲在線請求數據包;TCPCopy server(默認監聽端口爲36524)運行在測試機器上面,用來截獲響應包,並傳遞響應包頭信息給TCPCopy client,以完成TCP交互。
說明:如下測試環境中真實服務器IP地址172.16.3.66,測試服務器1的ip地址爲172.16.3.42,測試服務器2的ip地址爲172.16.3.41,其中測試服務器2是運行intercept進程的額外服務器,只是爲了配合測試用。
目的:複製172.16.3.66上的11111端口流量到測試服務器172.16.3.42中的11111
首先在測試服務器172.16.3.41上啓用Ip_queue內核模塊,同時按照如下方式對Iptable進行設置:
iptables
:
/etc/init.d/iptables restartip_queue
),從而實現運行在用戶態的進程對相關數據包進行裁定,執行如下命令:iptables -I OUTPUT -p tcp --sport 11111 -j QUEUE
iptables -A INPUT -p --dport http -j QUEUE
這個規則的意思是linux將http服務的報文上送到用戶層,而作這個工做的就是ip_queue。ip_queue是一個處理QUEUE動做的一個模塊。
6.1 離線回放配置
tcpdump -i eth0 tcp and host 172.16.3.66 and port 11111 –s 2000 –w online.pcap,
注意這裏-s後面不能爲0,或者不帶-s參數,這兩種狀況下會形成抓包丟包。-s後面的數字大小最好根據實際包體大小進行調試。丟包調試參數還有:
echo 124928000 > /proc/sys/net/core/rmem_max
echo 1249280 > /proc/sys/net/core/rmem_default
2. 拷貝步驟1的online.pcap到測試服務器1,即1716.3.42
3. 編譯tcpcopy,./configure --offline,而後make && make install。若是提示如下錯誤:
checking for pcap.h ... not found,則須要yum install libpcap-devel
tcpcopy: illegal argument "i",說明是configure的時候沒有攜帶—offline
yum install openssl openssl-devel
4. 在測試服務器2,即172.16.3.41上面運行intercept工具
/usr/local/intercept/sbin/intercept -i eth0 -F 'tcp and src port 11111' &
5. 在測試服務器1,即172.16.3.42上面設置路由,把原本應該應答給192.168.1.x的報文轉發給運行intercept的172.16.3.41服務器處理。
Route add –net 192.168.1.0 netmask 255.255.255.0 gw 172.16.3.41
6. 在在線服務器上面執行tcpcopy工具進行流量回放。
在線引流編譯tcpcopy的時候直接./configure—offline,無需./configure --offline
把在線服務器中端口地址爲11111的報文轉發到172.16.3.42:11111測試服務器上,同時修改報文的源Ip地址爲192.168.1.x。修改原ip地址的好處是服務器1上面設置應答路由方便。
/usr/local/tcpcopy/sbin/tcpcopy -x 11111-172.16.3.42:11111 -i ./online.pcap -s 172.16.3.41 -c 192.168.1.x &
6.2 在線實時引流
checking for pcap.h ... not found,則須要yum install libpcap-devel
2. 在測試服務器2,即172.16.3.41上面運行intercept工具
/usr/local/intercept/sbin/intercept -i eth0 -F 'tcp and src port 11111' &
3. 在測試服務器1,即172.16.42上面設置路由,把原本應該應答給192.168.1.x的報文轉發給運行intercept的172.16.41服務器處理。
Route add –net 192.168.1.0 netmask 255.255.255.0 gw 172.16.3.41
4. 在在線服務器上面執行tcpcopy工具進行流量回放。
把在線服務器中端口地址爲11111的報文轉發到172.16.3.42:11111測試服務器上,同時修改報文的源Ip地址爲192.168.1.x。修改原ip地址的好處是服務器1上面設置應答路由方便。
/usr/local/tcpcopy/sbin/tcpcopy -x 11111-172.16.3.42:11111 -s 172.16.3.41 -c 192.168.1.x &
如下測試結果都是以memcached爲例:
mc-benchmark -h 172.136.3.66 -p 11111 -c 200 -n 99699999 -d 5 -k 0 -r 565655
8. 注意可能出現的坑
若是目的服務器和部署Intercept的服務器時同一網段,即便啓用了intercept進行數據包DROP操做,可是部署intercept的服務器會認爲這不是一條最優路由,因而發送icmp重定向報文給目的服務器,這樣下次發往該目的服務器的報文會所有直接發往ICMP redirect 192.168.1.1 to host 10.x.4.1, length 60 指定的10.x.4.1地址,這樣就會有部分報文走到10.x.4.1這個網關等設備,若是這些網絡設備發現到咱們模擬的192.168.1.x網段沒有路由,就會作snat映射。因爲這些網絡設備只有一個出口IP,該出口IP可用的端口號最多爲65000左右,這時候會形成源地址是192.168.1.x(端口變化)網段的報文消耗掉大量snat的端口,從而形成其餘提供服務的內網機器的報文沒法轉出去。
Icmp重定向相關信息能夠參考http://blog.csdn.net/petershina/article/details/41449983
解決辦法,能夠在Intercept所在垃圾回收器中關閉IP_FOWARD:echo 0 > /proc/sys/net/ipv4/ip_forward