聊聊網路加速的東東
1. 概述
一談到網路加速,網友的第一反應就是網遊加速器。例如最近熱門的遊戲絕地大逃殺,熱門主播們在玩遊戲前經常會掛上一款網遊加速器。尤其是在歐服,美服,更是必不可少。網遊加速器主要用於改善網路丟包率,降低網路延時,提升客戶端和遊戲伺服器之間連結的穩定性。
網遊加速器當然是可以歸屬到網路加速範圍內,且網路加速器所用的技術眾多,包括協議優化,資料壓縮,資料重發,路由自動擇優等等。網遊加速器只是網路加速的上層應用,筆者這裡聊的是稍微是底層一些的技術,主流的網路加速(一般指tcp加速)技術大致可以分為單邊加速和雙邊加速。
1.1 單邊加速
故名思議,只需要在tcp的一端部署的加速技術。因為部署容易,變動不大,所以應用範圍較廣,包括目前各種商業的的動態加速技術,也大都包含單邊加速技術。但也正因為其在tcp一端部署的特性,其必須相容標準的tcp協議
1.2 雙邊加速
相較於單邊加速,雙邊加速是雙端部署,如果是伺服器對伺服器,那麼兩邊的伺服器上都要進行部署,如果是伺服器對客戶端,那麼除了伺服器端部署外,客戶端也要安裝軟體。
因為是雙邊,所以基本上可以說自己的天下了。可以採用各種優化加速技術,例如實現自己更高效的傳輸協議,資料快取,流量壓縮,多路徑轉發等。
因為雙邊加速並未明確的標準或者規範限制,所以各廠商的具體實現也往往不同,但是實現原理大多相同。
筆者自己也經常會使用一些網路加速軟體,但是具體加速效能好壞也從來沒有對比過,這裡主要選擇了幾款開源(或者能獲取到)單邊和雙邊加速軟體,對其效果進行測試對比
接下來是無聊的部署和測試資料,不感興趣的可以直接跳到總結。
2. 單邊加速
常用的單邊加速有FastTCP,ZetaTCP(LotServer銳速),TCP Vegas, KernelPCC以及最近谷歌開源的BBR等。
2.1 部署
2.1.1 Google BBR
地址:https://github.com/google/bbr
安裝配置:開啟BBR優化演算法核心版本必須 4.9 以上,可以使用elrepo的yum源,直接yum安裝
#安裝yum源 rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm #更新到最新版的核心 yum –enablerepo=elrepo-kernel install kernel-ml #vim修改grub.conf的啟動首選項,修改為安裝核心所在順序(順序從0開啟)
#reboot重啟伺服器,切換擁塞控制演算法到bbr sysctl -w net.ipv4.tcp_congestion_control=bbr #核實在用的擁塞控制演算法 sysctl net.ipv4.tcp_congestion_control
2.1.2 ZetaTCP(LotServer銳速)
地址:官網或者網上第三方提供(一鍵安裝)
安裝配置:安裝安裝說明,一路安裝,注意選擇跟自己核心相同或者相近的選項。安裝成功後不需要重啟伺服器自動生效
注意:ZetaTCP為商業閉源產品,建議在線上環境上使用時要慎重。
2.1.3 TCP Vegas(優化版)部署
地址:https://github.com/marywangran/qvegas
安裝部署:
#升級系統核心到4.9後,切換到qvegas的原始碼目錄,編譯,告警資訊可以忽略 make #載入核心模組 insmod tcp_qvegas.ko lsmod | grep qvegas #檢視可用的擁塞控制演算法 sysctl net.ipv4.tcp_available_congestion_control #切換擁塞控制演算法到qvegas sysctl -w net.ipv4.tcp_congestion_control=bbr #核實在用的擁塞控制演算法 sysctl net.ipv4.tcp_congestion_control
2.1.4 KernelPCC部署
地址:https://github.com/giltu/KernelPCC
安裝部署:
#升級系統核心到4.9後,編輯tcp_TA.c,替換NET_INC_STATS_BH為NET_INC_STATS,替換NET_ADD_STATS_BH為NET_ADD_STATS,儲存。 #切換到KernelPCC的原始碼目錄,編譯,告警資訊可以忽略 make #載入核心模組 insmod tcp_TA.ko lsmod | grep TA #檢視可用的擁塞控制演算法 sysctl net.ipv4.tcp_available_congestion_control #切換擁塞控制演算法到TA sysctl -w net.ipv4.tcp_congestion_control=TA #核實在用的擁塞控制演算法 sysctl net.ipv4.tcp_congestion_control
注意:程式碼中的name即為演算法名稱
2.2 加速測試
主要測試在不同的丟包率和延時情況下,採用不同的加速方式,測算其最終吞吐量(由於廣域網環境複雜,測試並不能完全代表實際環境)
2.2.1 測試方法
開箱即用,不調整任何引數,即使用預設的引數。測試在兩臺千兆伺服器之間進行wget下載測試,伺服器的地址分別位於河北和江蘇。測試檔案為100M檔案(經過多次反覆壓縮後擷取100M)。統計下載時間,三次測試取其平均值作為有效值。
分別測試各加速軟體在延時17ms,50ms和100ms,其丟包率分別為0%, 10%,30%,50%網路環境下的下載表現。
採用tc模擬丟包率和延時。
2.2.2 測試結果
NOMAL:河北->江蘇 丟包0% 延時17ms
(1) 對比曲線
(2) 詳細資料
(3) 小結
- 各阻塞控制演算法在低延遲和低丟包率的情況下表現最優,其中bbr的下載效能最好。
- 隨著延時的增加,各下載軟體的下載效能也隨之降低。其中bbr和zetatcp在高延時的網路環境下表現良好,bbr>zetatcp。
- 隨著丟包率的增加,各下載軟體的下載效能也隨著降低。其中zetatcp和bbr在高丟包的網路環境下表現良好。
- 如果是高延時和高丟包環境下,zetatcp表現良好。
3. 雙邊加速
常用的雙邊加速有kcptun,finalspeed以及UDPspeeder等。
3.1 部署
3.1.1 kcptun
地址:https://github.com/xtaci/kcptun
安裝部署:
#直接下載二進位制檔案 https://github.com/xtaci/kcptun/releases #KCP 客戶端 ./client_linux_amd64 -r “KCP_SERVER_IP:4000” -l “:8388” -mode fast2 #KCP 服務段 ./server_linux_amd64 -t “TARGET_IP:8388” -l “:4000” -mode fast2
上面命令會給8388埠建立埠轉發,具體資料流如下
應用-> KCP 客戶端(8388/tcp) -> KCP 服務端(4000/udp) -> 目標伺服器端(8388/tcp)
將原始連結封裝進隧道
應用 -> 目的伺服器 (8388/tcp)
3.1.2 finalspeed
地址:https://github.com/d1sm/finalspeed
安裝部署:該地址已經暫停更新,根據頁面資訊已經改是閉源改為商業產品了。可以使用第三方提供的一鍵安裝包(安裝的是之前開源的方案)。
3.1.3 UDPspeeder
地址:https://github.com/wangyu-/UDPspeeder
安裝部署:
#下載編譯好的二進位制檔案,解壓到本地和伺服器的任意目錄。 https://github.com/wangyu-/UDPspeeder/releases #在server端執行: ./speederv2 -s -l0.0.0.0:4096 -r127.0.0.1:7777 -f20:10 -k “passwd” #在client端執行: ./speederv2 -c -l0.0.0.0:3333 -r x.x.x.x:4096 -f20:10 -k “passwd”
現在client和server之間建立起了tunnel。想要連線x.x.x.x:7777,只需要連線 127.0.0.1:3333。來回的所有的udp流量會被加速。
預設情況下只能加速udp流量,如果是其他協議的流量需要配合vpn之類的使用。
3.2 加速測試
3.2.1 測試方法
測試方法同單邊加速
3.2.2 測試結果
(1) 對比曲線
(2) 詳細資料
說明:
- 下載速度的單位為KB/S
- 下載速度為0代表無法正常下載,下載速度為0
(3) 小結
- 其中正常下載的下載效能在低延時和低丟包率的網路環境下最好。
- 隨著延時的增加,各下載軟體的下載效能也隨之降低。其中kcptun和finalspeed在高延時的網路環境下表現良好。
- 隨著丟包率的增加,各下載軟體的下載效能也隨著降低。其中kcptun和finalspeed在高延時的網路環境下表現良好。
- 如果是高延時和高丟包環境下,kcptun表現良好。
4. 總結
上面是筆者選取了幾款單邊加速和雙邊加速軟體進行實際測試的結果。不知道是不是雙邊加速引數調整的問題,測試的結果顯示雙邊加速的優化效果大都不及單邊加速(也有可能是因為測試的檔案是採用多次壓縮的問題,無法發揮雙邊加速的資料壓縮特性)。
注意:雙邊加速大多都有采用多發的策略,如果部署雙邊加速,一定要留意伺服器是否按照流量進行收費。
測試顯示大多加速軟體(包括單雙邊)都有其一定的適用範圍:
- 對於低延時低丟包率的網路情況,不採用任何加速或者使用bbr或者zetatcp加速比較ok。
- 在中等丟包率(10%左右)使用bbr無疑是最好的選擇。
- 高丟包率(>20%)高延時(>100ms)的網路環境下,使用zetatcp或者雙邊加速kcptun比較合適。尤其是zetatcp和雙邊加速kcptun在延時100ms,丟包率50%的情況下都能發出會良好的下載加速效果,實在是讓人印象深刻。
原文來自微信公眾號:運維軍團