WEB前端除錯技能基礎指南
————————————————————————————————————————————————————————————
TCP 擁塞控制演算法
傳統 TCP 擁塞控制演算法,基於 丟包反饋
的協議。
基於「丟包反饋」的協議是一種 被動式 的擁塞控制機制,其依據網路中的 丟包事件
來做網路擁塞判斷。即便網路中的負載很高時,只要沒有產生擁塞丟包,協議就不會主動降低自己的傳送速度。
這種協議可以 最大程度的利用網路剩餘頻寬,提高吞吐量。
然而,由於基於丟包反饋協議在網路近飽和狀態下所表現出來的侵略性,一方面大大提高了網路的頻寬利用率;但另一方面,對於基於丟包反饋的擁塞控制協議來說,大大提高網路利用率同時意味著下一次擁塞丟包事件為期不遠了,所以這些協議 在提高網路頻寬利用率的同時也間接加大了網路的丟包率
,造成整個網路的抖動性加劇。
還有誰導致了丟包?
丟包並不總是擁塞導致,丟包可能原因是多方面,比如:
- 全球最牛的防火牆 GWF 的隨機丟包策略
- 網路中由於多路徑衰落(multi-path fading)所造成的訊號衰減(signal degradation)
- 通道阻塞造成的丟包(packet drop),再者損壞的封包(corrupted packets)被拒絕通過
- 有缺陷的網路硬體、網路驅動軟體發生故障
- 訊號的信噪比(SNR)的影響
Google BBR 的出現
我們自然不喜歡 GWF 這種人為的隨機丟包策略,當路過 GWF 時,資料被丟包,我們在此時應該 立刻重新發包,增大發送的頻率,而不希望降低速度,也就是不希望傳統的 TCP 擁塞演算法去控制。
由此,就出現了基於不丟包的擁塞控制演算法 CDG
, 以 延遲 作為判斷依據,延遲增大說明擁塞, 資料開始在路由器的緩衝中積累. 降低傳送 視窗 。然而 CDG 演算法與基於丟包的演算法不相容, 只有全球的裝置都換上 CDG,但這是不可能的,目前市面上的裝置不可能一下子都切換到 CDG,因此 Google 就不開心了,Google 的科學家們開發了一種過渡演算法來解決這個問題,這個演算法的名字就是 BBR(Bottleneck Bandwidth and RTT)
,它是一種全新的 擁塞控制演算法 ,BBR 同 CDG 一致的思想是不以丟包作為擁塞控制訊號,但是和 CDG 不同的是,BBR 能和 cubic 和 reno 共存。
使用BBR前後網路吞吐量對比圖 / By Google
BBR 由 Google 開發,供 Linux 核心的 TCP 協議棧使用,有了 BBR 演算法,Linux 伺服器可以顯著提高吞吐量並減少連線延遲,簡單來說 BBR 能加速網路傳輸速度。此外,部署 BBR 也很容易,因為該演算法只需要傳送方,而不需要網路或接收方的支援。
CentOS 7 伺服器例項上部署 BBR
下面我將向您分享我如何在 CentOS 7 KVM 伺服器例項上部署 BBR。
步驟〇: 前置條件
- CentOS 7 x64 服務器例項。
- 一個 sudo 使用者
步驟 ① :使用 ELRepo RPM 倉庫升級核心
要使用BBR,您需要將CentOS 7機器的核心升級到4.9.0。您可以使用ELRepo RPM第三方倉庫輕鬆完成該操作。
在升級之前,您可以檢視當前核心:
uname -r
此命令應可能輸出類似於以下字串:
3.10.0-514.2.2.el7.x86_64
如您所見,當前核心為3.10.0,因此我們需要更新核心。
更新核心之前,先安裝 ELRepo 倉庫:
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org sudo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
使用ELRepo repo安裝4.9.0核心:
sudo yum --enablerepo=elrepo-kernel install kernel-ml -y
確認結果:
rpm -qa | grep kernel
如果安裝成功,您應該看到類似於一下列,且 kernel-ml-4.18.5-1.el7.elrepo.x86_64
在輸出列表中看到:
kernel-ml-4.18.5-1.el7.elrepo.x86_64 kernel-3.10.0-514.el7.x86_64 kernel-tools-libs-3.10.0-514.2.2.el7.x86_64 kernel-tools-3.10.0-514.2.2.el7.x86_64 kernel-3.10.0-514.2.2.el7.x86_64
現在,您需要通過設定預設引導為 grub2 ,來啟用4.18.5核心。
顯示 grub2 選單中的所有條目:
sudo egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'
結果應該類似於:
CentOS Linux 7 Rescue a0cbf86a6ef1416a8812657bb4f2b860 (4.18.5-1.el7.elrepo.x86_64) CentOS Linux (4.18.5-1.el7.elrepo.x86_64) 7 (Core) CentOS Linux (3.10.0-514.2.2.el7.x86_64) 7 (Core) CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core) CentOS Linux (0-rescue-bf94f46c6bd04792a6a42c91bae645f7) 7 (Core)
由於行計數開始於 0
,且4.18.5核心條目位於第一行,因此將預設引導條目應設定為 0
:
sudo grub2-set-default 0
重啟系統:
sudo shutdown -r now // 或 reboot
當伺服器重新聯機時,請重新登入並重新執行uname命令以確認您使用的是正確的核心:
uname -r
您應該看到如下結果:
4.18.5-1.el7.elrepo.x86_64
步驟 ②:啟用BBR
要啟用 BBR 演算法,您需要修改 sysctl
配置,如下所示:
echo 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.conf echo 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.conf sudo sysctl -p
現在,您可以使用以下命令,確認是否已經啟用了BBR:
sudo sysctl net.ipv4.tcp_available_congestion_control
正常情況下應輸出類似以下的字串:
net.ipv4.tcp_available_congestion_control = bbr cubic reno
接下來,繼續驗證:
sudo sysctl -n net.ipv4.tcp_congestion_control
應該輸出類似以下字串:
bbr
最後,檢查核心模組是否已載入:
lsmod | grep bbr
應該輸出類似於:
tcp_bbr208410
步驟 ③(可選):測試網路效能是否增強
為了測試BBR的網路效能是否增強,您可以在Web伺服器目錄中建立一個檔案以供下載,然後從桌上型電腦上的Web瀏覽器測試下載速度。
sudo yum install httpd -y sudo systemctl start httpd.service sudo firewall-cmd --zone=public --permanent --add-service=http sudo firewall-cmd --reload cd /var/www/html sudo dd if=/dev/zero of=500mb.zip bs=1024k count=500
最後, http://[your-server-IP]/500mb.zip
從桌面計算機上的 Web 瀏覽器訪問 URL ,然後評估下載速度。
當然伺服器在國外的話,也可以在 YouTube 上直接開啟一個 4K 畫質視訊,進行感官速度測試,如下圖:
使用BBR後的YouTube速度 © JANDOU
就這樣,盡情享受高速網路帶來的新體驗。
步驟 ④ (可選):刪除無用的舊核心
升級核心之後,往往老舊的核心也保留下來了,執行以下命令,將自動篩選並刪除當前無用的系統核心版本。
yum remove $(rpm -qa | grep kernel | grep -v $(uname -r))
詳情請參考文章: CentOS 7 刪除無用的舊核心
非專業技術人員福利
如果您不是專業技術人員,可以採取一鍵安裝指令碼進行安裝,執行以下命令:
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh
詳情請參考文章: 一鍵安裝最新核心並開啟 BBR 指令碼
參考連結:
TCP BBR congestion control comes to GCP – your Internet just got faster
How to Deploy Google BBR on CentOS 7 By Vultr
對 Google TCP BBR 的淺薄認識技術致謝
Neal Cardwell,高階軟體工程師;
Yuchung Cheng,高階軟體工程師;
C. Stephen Gunn,高階職員可靠性工程師;
Soheil Hassas Yeganeh,高階軟體工程師;
Van Jacobson, 研究科學家;
Amin Vahdat, 谷歌研究員。