為什麼想到這個呢,演算法什麼的又不太懂,這是 因為搭建VPN + BBR 與之簡直絕配 有的人搭建SSR ,配一個什麼銳速,還需要降內核版本, 而且還容易出錯,降了之後更加容易出現相容性問題,所以偶爾看到了google的BBR 擁塞阻塞演算法 演算法原理不知道,也不想去深究 。 原理 這篇博客 講得還是很 ...
為什麼想到這個呢,演算法什麼的又不太懂,這是 因為搭建VPN + BBR 與之簡直絕配
有的人搭建SSR ,配一個什麼銳速,還需要降內核版本, 而且還容易出錯,降了之後更加容易出現相容性問題,所以偶爾看到了google的BBR 擁塞阻塞演算法
演算法原理不知道,也不想去深究 。 原理 這篇博客 講得還是很清楚的 ,可以一探
Google 開源了其 TCP BBR 擁塞控制演算法,並提交到了 Linux 內核,從 4.9 開始,Linux 內核已經用上了該演算法。根據谷歌的風格,Google 總是先在自家的生產環境上線運用後,才會將代碼開源,此次也不例外。
根據大佬的實地測試,在部署了最新版內核並開啟了 TCP BBR 的機器上,網速甚至可以提升好幾個數量級。
根據某個大佬開發的一鍵安裝的腳本,可以實現最新內核的安裝和 TCP BBR 腳本
腳本如下:

1 #!/usr/bin/env bash 2 # 3 # Auto install latest kernel for TCP BBR 4 # 5 # System Required: CentOS 6+, Debian7+, Ubuntu12+ 6 # 7 # Copyright (C) 2016-2018 Teddysun <[email protected]> 8 # 9 # URL: https://teddysun.com/489.html 10 # 11 12 red='\033[0;31m' 13 green='\033[0;32m' 14 yellow='\033[0;33m' 15 plain='\033[0m' 16 17 cur_dir=$(pwd) 18 19 [[ $EUID -ne 0 ]] && echo -e "${red}Error:${plain} This script must be run as root!" && exit 1 20 21 [[ -d "/proc/vz" ]] && echo -e "${red}Error:${plain} Your VPS is based on OpenVZ, which is not supported." && exit 1 22 23 if [ -f /etc/redhat-release ]; then 24 release="centos" 25 elif cat /etc/issue | grep -Eqi "debian"; then 26 release="debian" 27 elif cat /etc/issue | grep -Eqi "ubuntu"; then 28 release="ubuntu" 29 elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then 30 release="centos" 31 elif cat /proc/version | grep -Eqi "debian"; then 32 release="debian" 33 elif cat /proc/version | grep -Eqi "ubuntu"; then 34 release="ubuntu" 35 elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then 36 release="centos" 37 else 38 release="" 39 fi 40 41 is_digit(){ 42 local input=${1} 43 if [[ "$input" =~ ^[0-9]+$ ]]; then 44 return 0 45 else 46 return 1 47 fi 48 } 49 50 is_64bit(){ 51 if [ $(getconf WORD_BIT) = '32' ] && [ $(getconf LONG_BIT) = '64' ]; then 52 return 0 53 else 54 return 1 55 fi 56 } 57 58 get_valid_valname(){ 59 local val=${1} 60 local new_val=$(eval echo $val | sed 's/[-.]/_/g') 61 echo ${new_val} 62 } 63 64 get_hint(){ 65 local val=${1} 66 local new_val=$(get_valid_valname $val) 67 eval echo "\$hint_${new_val}" 68 } 69 70 #Display Memu 71 display_menu(){ 72 local soft=${1} 73 local default=${2} 74 eval local arr=(\${${soft}_arr[@]}) 75 local default_prompt 76 if [[ "$default" != "" ]]; then 77 if [[ "$default" == "last" ]]; then 78 default=${#arr[@]} 79 fi 80 default_prompt="(default ${arr[$default-1]})" 81 fi 82 local pick 83 local hint 84 local vname 85 local prompt="which ${soft} you'd select ${default_prompt}: " 86 87 while : 88 do 89 echo -e "\n------------ ${soft} setting ------------\n" 90 for ((i=1;i<=${#arr[@]};i++ )); do 91 vname="$(get_valid_valname ${arr[$i-1]})" 92 hint="$(get_hint $vname)" 93 [[ "$hint" == "" ]] && hint="${arr[$i-1]}" 94 echo -e "${green}${i}${plain}) $hint" 95 done 96 echo 97 read -p "${prompt}" pick 98 if [[ "$pick" == "" && "$default" != "" ]]; then 99 pick=${default} 100 break 101 fi 102 103 if ! is_digit "$pick"; then 104 prompt="Input error, please input a number" 105 continue 106 fi 107 108 if [[ "$pick" -lt 1 || "$pick" -gt ${#arr[@]} ]]; then 109 prompt="Input error, please input a number between 1 and ${#arr[@]}: " 110 continue 111 fi 112 113 break 114 done 115 116 eval ${soft}=${arr[$pick-1]} 117 vname="$(get_valid_valname ${arr[$pick-1]})" 118 hint="$(get_hint $vname)" 119 [[ "$hint" == "" ]] && hint="${arr[$pick-1]}" 120 echo -e "\nyour selection: $hint\n" 121 } 122 123 version_ge(){ 124 test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1" 125 } 126 127 get_latest_version() { 128 latest_version=($(wget -qO- https://kernel.ubuntu.com/~kernel-ppa/mainline/ | awk -F'\"v' '/v[4-9]./{print $2}' | cut -d/ -f1 | grep -v - | sort -V)) 129 130 [ ${#latest_version[@]} -eq 0 ] && echo -e "${red}Error:${plain} Get latest kernel version failed." && exit 1 131 132 kernel_arr=() 133 for i in ${latest_version[@]}; do 134 if version_ge $i 4.14; then 135 kernel_arr+=($i); 136 fi 137 done 138 139 display_menu kernel last 140 141 if [[ `getconf WORD_BIT` == "32" && `getconf LONG_BIT` == "64" ]]; then 142 deb_name=$(wget -qO- https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/amd64.deb/{print $2}' | cut -d'<' -f1 | head -1) 143 deb_kernel_url="https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/${deb_name}" 144 deb_kernel_name="linux-image-${kernel}-amd64.deb" 145 modules_deb_name=$(wget -qO- https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/ | grep "linux-modules" | grep "generic" | awk -F'\">' '/amd64.deb/{print $2}' | cut -d'<' -f1 | head -1) 146 deb_kernel_modules_url="https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/${modules_deb_name}" 147 deb_kernel_modules_name="linux-modules-${kernel}-amd64.deb" 148 else 149 deb_name=$(wget -qO- https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/i386.deb/{print $2}' | cut -d'<' -f1 | head -1) 150 deb_kernel_url="https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/${deb_name}" 151 deb_kernel_name="linux-image-${kernel}-i386.deb" 152 modules_deb_name=$(wget -qO- https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/ | grep "linux-modules" | grep "generic" | awk -F'\">' '/i386.deb/{print $2}' | cut -d'<' -f1 | head -1) 153 deb_kernel_modules_url="https://kernel.ubuntu.com/~kernel-ppa/mainline/v${kernel}/${modules_deb_name}" 154 deb_kernel_modules_name="linux-modules-${kernel}-i386.deb" 155 fi 156 157 [ -z ${deb_name} ] && echo -e "${red}Error:${plain} Getting Linux kernel binary package name failed, maybe kernel build failed. Please choose other one and try again." && exit 1 158 } 159 160 get_opsy() { 161 [ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return 162 [ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return 163 [ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return 164 } 165 166 opsy=$( get_opsy ) 167 arch=$( uname -m ) 168 lbit=$( getconf LONG_BIT ) 169 kern=$( uname -r ) 170 171 get_char() { 172 SAVEDSTTY=`stty -g` 173 stty -echo 174 stty cbreak 175 dd if=/dev/tty bs=1 count=1 2> /dev/null 176 stty -raw 177 stty echo 178 stty $SAVEDSTTY 179 } 180 181 getversion() { 182 if [[ -s /etc/redhat-release ]]; then 183 grep -oE "[0-9.]+" /etc/redhat-release 184 else 185 grep -oE "[0-9.]+" /etc/issue 186 fi 187 } 188 189 centosversion() { 190 if [ x"${release}" == x"centos" ]; then 191 local code=$1 192 local version="$(getversion)" 193 local main_ver=${version%%.*} 194 if [ "$main_ver" == "$code" ]; then 195 return 0 196 else 197 return 1 198 fi 199 else 200 return 1 201 fi 202 } 203 204 check_bbr_status() { 205 local param=$(sysctl net.ipv4.tcp_congestion_control | awk '{print $3}') 206 if [[ x"${param}" == x"bbr" ]]; then 207 return 0 208 else 209 return 1 210 fi 211 } 212 213 check_kernel_version() { 214 local kernel_version=$(uname -r | cut -d- -f1) 215 if version_ge ${kernel_version} 4.9; then 216 return 0 217 else 218 return 1 219 fi 220 } 221 222 install_elrepo() { 223 224 if centosversion 5; then 225 echo -e "${red}Error:${plain} not supported CentOS 5." 226 exit 1 227 fi 228 229 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 230 231 if centosversion 6; then 232 rpm -Uvh https://www.elrepo.org/elrepo-release-6-9.el6.elrepo.noarch.rpm 233 elif centosversion 7; then 234 rpm -Uvh https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm 235 fi 236 237 if [ ! -f /etc/yum.repos.d/elrepo.repo ]; then 238 echo -e "${red}Error:${plain} Install elrepo failed, please check it." 239 exit 1 240 fi 241 } 242 243 sysctl_config() { 244 sed -i '/net.core.default_qdisc/d' /etc/sysctl.conf 245 sed -i '/net.ipv4.tcp_congestion_control/d' /etc/sysctl.conf 246 echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf 247 echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf 248 sysctl -p >/dev/null 2>&1 249 } 250 251 install_config() { 252 if [[ x"${release}" == x"centos" ]]; then 253 if centosversion 6; then 254 if [ ! -f "/boot/grub/grub.conf" ]; then 255 echo -e "${red}Error:${plain} /boot/grub/grub.conf not found, please check it." 256 exit 1 257 fi 258 sed -i 's/^default=.*/default=0/g' /boot/grub/grub.conf 259 elif centosversion 7; then 260 if [ ! -f "/boot/grub2/grub.cfg" ]; then 261 echo -e "${red}Error:${plain} /boot/grub2/grub.cfg not found, please check it." 262 exit 1 263 fi 264 grub2-set-default 0 265 fi 266 elif [[ x"${release}" == x"debian" || x"${release}" == x"ubuntu" ]]; then 267 /usr/sbin/update-grub 268 fi 269 } 270 271 reboot_os() { 272 echo 273 echo -e "${green}Info:${plain} The system needs to reboot." 274 read -p "Do you want to restart system? [y/n]" is_reboot 275 if [[ ${is_reboot} == "y" || ${is_reboot} == "Y" ]]; then 276 reboot 277 else 278 echo -e "${green}Info:${plain} Reboot has been canceled..." 279 exit 0 280 fi 281 } 282 283 install_bbr() { 284 check_bbr_status 285 if [ $? -eq 0 ]; then 286 echo 287 echo -e "${green}Info:${plain} TCP BBR has already been installed. nothing to do..." 288 exit 0 289 fi 290 check_kernel_version 291 if [ $? -eq 0 ]; then 292 echo 293 echo -e "${green}Info:${plain} Your kernel version is greater than 4.9, directly setting TCP BBR..." 294 sysctl_config 295 echo -e "${green}Info:${plain} Setting TCP BBR completed..." 296 exit 0 297 fi 298 299 if [[ x"${release}" == x"centos" ]]; then 300 install_elrepo 301 [ ! "$(command -v yum-config-manager)" ] && yum install -y yum-utils > /dev/null 2>&1 302 [ x"$(yum-config-manager elrepo-kernel | grep -w enabled | awk '{print $3}')" != x"True" ] && yum-config-manager --enable elrepo-kernel > /dev/null 2>&1 303 if centosversion 6; then 304 if is_64bit; then 305 rpm_kernel_name="kernel-ml-4.18.20-1.el6.elrepo.x86_64.rpm" 306 rpm_kernel_devel_name="kernel-ml-devel-4.18.20-1.el6.elrepo.x86_64.rpm" 307 rpm_kernel_url_1="http://repos.lax.quadranet.com/elrepo/archive/kernel/el6/x86_64/RPMS/" 308 else 309 rpm_kernel_name="kernel-ml-4.18.20-1.el6.elrepo.i686.rpm" 310 rpm_kernel_devel_name="kernel-ml-devel-4.18.20-1.el6.elrepo.i686.rpm" 311 rpm_kernel_url_1="http://repos.lax.quadranet.com/elrepo/archive/kernel/el6/i386/RPMS/" 312 fi 313 rpm_kernel_url_2="https://dl.lamp.sh/files/" 314 wget -c -t3 -T60 -O ${rpm_kernel_name} ${rpm_kernel_url_1}${rpm_kernel_name} 315 if [ $? -ne 0 ]; then 316 rm -rf ${rpm_kernel_name} 317 wget -c -t3 -T60 -O ${rpm_kernel_name} ${rpm_kernel_url_2}${rpm_kernel_name} 318 fi 319 wget -c -t3 -T60 -O ${rpm_kernel_devel_name} ${rpm_kernel_url_1}${rpm_kernel_devel_name} 320 if [ $? -ne 0 ]; then 321 rm -rf ${rpm_kernel_devel_name} 322 wget -c -t3 -T60 -O ${rpm_kernel_devel_name} ${rpm_kernel_url_2}${rpm_kernel_devel_name} 323 fi 324 if [ -f "${rpm_kernel_name}" ]; then 325 rpm -ivh ${rpm_kernel_name} 326 else 327 echo -e "${red}Error:${plain} Download ${rpm_kernel_name} failed, please check it." 328 exit 1 329 fi 330 if [ -f "${rpm_kernel_devel_name}" ]; then 331 rpm -ivh ${rpm_kernel_devel_name} 332 else 333 echo -e "${red}Error:${plain} Download ${rpm_kernel_devel_name} failed, please check it." 334 exit 1 335 fi 336 rm -f ${rpm_kernel_name} ${rpm_kernel_devel_name} 337 elif centosversion 7; then 338 yum -y install kernel-ml kernel-ml-devel 339 if [ $? -ne 0 ]; then 340 echo -e "${red}Error:${plain} Install latest kernel failed, please check it." 341 exit 1 342 fi 343 fi 344 elif [[ x"${release}" == x"debian" || x"${release}" == x"ubuntu" ]]; then 345 [[ ! -e "/usr/bin/wget" ]] && apt-get -y update && apt-get -y install wget 346 echo -e "${green}Info:${plain} Getting latest kernel version..." 347 get_latest_version 348 if [ -n ${modules_deb_name} ]; then 349 wget -c -t3 -T60 -O ${deb_kernel_modules_name} ${deb_kernel_modules_url} 350 if [ $? -ne 0 ]; then 351 echo -e "${red}Error:${plain} Download ${deb_kernel_modules_name} failed, please check it." 352 exit 1 353 fi 354 fi 355 wget -c -t3 -T60 -O ${deb_kernel_name} ${deb_kernel_url} 356 if [ $? -ne 0 ]; then 357 echo -e "${red}Error:${plain} Download ${deb_kernel_name} failed, please check it." 358 exit 1 359 fi 360 [ -f ${deb_kernel_modules_name} ] && dpkg -i ${deb_kernel_modules_name} 361 dpkg -i ${deb_kernel_name} 362 rm -f ${deb_kernel_name} ${deb_kernel_modules_name} 363 else 364 echo -e "${red}Error:${plain} OS is not be supported, please change to CentOS/Debian/Ubuntu and try again." 365 exit 1 366 fi 367 368 install_config 369 sysctl_config 370 reboot_os 371 } 372 373 374 clear 375 echo "---------- System Information ----------" 376 echo " OS : $opsy" 377 echo " Arch : $arch ($lbit Bit)" 378 echo " Kernel : $kern" 379 echo "----------------------------------------" 380 echo " Auto install latest kernel for TCP BBR" 381 echo 382 echo " URL: https://teddysun.com/489.html" 383 echo "----------------------------------------" 384 echo 385 echo "Press any key to start...or Press Ctrl+C to cancel" 386 char=`get_char` 387 388 install_bbr 2>&1 | tee ${cur_dir}/install_bbr.logView Code
也可以採用線上安裝的方式:
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh
安裝完成後,腳本會提示需要重啟 VPS,輸入 y 並回車後重啟。
重啟完成後,進入 VPS,驗證一下是否成功安裝最新內核並開啟 TCP BBR,輸入命令:
uname -r
查看內核版本,顯示為最新版就表示 OK了