Stay Hungry. Stay Foolish.

BBR 是来自于 Google 的黑科技,目的是通过优化和控制 TCP 的拥塞,充分利用带宽并降低延迟,起到神奇的加速效果。在 BBR 之前,比较有名的就是国产的锐速了,不过,由于锐速是个国产的闭源软件,而且已经很久不再更新,不能适配比较新的系统。正好,BBR 的出现,又成为一个可供折腾的对象,BBR 这个特性其实是在 Linux 内核 4.9 以上才计划加入的。所以,要开启 BBR,需要内核版本在 Linux kernel 4.9 以上。

网络上已经出现了大把大把的一键安装脚本,然而估计是为了省事,大多是直接无脑的从官方的 Mainline 分支上直接拉取所谓最新的内核安装。

# RHL 系列
http://elrepo.org/tiki/tiki-index.php
# DEB 系列
http://kernel.ubuntu.com/~kernel-ppa/mainline/

问题在于哪里呢,这些内核都是直接根据主线版内核机器编译生成的,是用于开发人员测试的,迭代速度非常之快,而且没有经过人工仔细的测试和维护,然后问题就出现了:

4.12 内核对于 virtio 网络驱动有严重的 bug,导致网络变得异常缓慢。该问题影响所有使用 virtio 网络驱动的 KVM VPS

所以为什么不适用各个发行版人工编译测试并发布的内核呢?
注意 BBR 不适用于 OVZ 等非完全虚拟化的 VPS,以下操作必须在 root 或者 sudo 下执行。

安装较新版内核

CentOS 7 系列

  • 从 virt SIG 分支获取新内核
yum install -y centos-release-xen
yum install -y kernel kernel-headers
yum group install "Development Tools" -y
  • 查看安装的内核并删除旧内核(可选)
rpm -qa | grep kernel
yum remove 旧内核 (可选,把要删除的内核名字复制粘贴)
grub2-set-default 0
reboot

Ubuntu 16 LTS 系列

  • 如果你的系统还是 Ubuntu 14.* 请升级到最新的 LTS 版本,如果你的系统是 Ubuntu 17.x 版本,那么默认的内核已经符合要求。
  • 安装 hwe 分支的内核
apt install --install-recommends linux-generic-hwe-16.04 -y
  • 卸载旧内核并设置新内核
dpkg -l|grep linux-*
apt-get purge 旧内核 (可选,把要删除的内核名字复制粘贴)
update-grub
reboot

Debian 系列

对于 Debian 9 默认的内核已经符合要求,对于 Debian 7 个人建议还是升级到 Debian 9/8 吧。下面给出 Debian 8 的启用方式。

  • 首先更改并添加 Backports 源,如果没有的话
rm /etc/apt/sources.list && vi /etc/apt/sources.list
  • 修改为如下:
deb http://debian-archive.trafficmanager.net/debian jessie main contrib non-free
deb http://debian-archive.trafficmanager.net/debian-security jessie/updates main contrib non-free
deb http://debian-archive.trafficmanager.net/debian jessie-updates main contrib non-free
deb http://debian-archive.trafficmanager.net/debian jessie-backports main contrib non-free
  • 然后从 backports 安装内核:
apt-get -t jessie-backports update && apt-get -t jessie-backports dist-upgrade -y
apt-get -t jessie-backports install linux-image-amd64 linux-headers-amd64 -y
  • 卸载旧内核并设置新内核
dpkg -l|grep linux-*
apt-get purge 旧内核 (可选,把要删除的内核名字复制粘贴)
update-grub  
reboot

开启 BBR

  • 开机后 uname -r 看看是不是内核 4.9 或者以上版本
  • 执行 lsmod | grep bbr,如果结果中没有 tcp_bbr 的话就先执行
modprobe tcp_bbr
echo "tcp_bbr" >> /etc/modules
  • 将 BBR 写入内核配置并保存生效
echo 3 > /proc/sys/net/ipv4/tcp_fastopen
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo "vm.swappiness = 10" >> /etc/sysctl.conf
echo "vm.vfs_cache_pressure = 50" >> /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_all = 1" >> /etc/sysctl.conf
echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_notsent_lowat = 16384" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf
sysctl -p
  • 检查生效情况
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control
lsmod | grep bbr

如果结果都有 bbr, 则证明你的内核已开启 bbr。看到有 tcp_bbr 模块即说明 BBR 已启动,这样,就可以开始体验 Google 的黑科技加速了。

其他一些内核优化

如果不懂请不要乱调!

vi /etc/sysctl.conf
  • 加入如下部分:
fs.nr_open = 1200000
fs.file-max = 512000
kernel.sysrq = 1
kernel.msgmnb = 65536
kernel.core_uses_pid = 1
net.core.wmem_max = 67108864
net.core.rmem_max = 67108864
net.ipv4.tcp_mem = 25600 51200 102400
net.ipv4.tcp_rmem = 8192 87380 67108864
net.ipv4.tcp_wmem = 8192 65536 67108864
net.core.netdev_max_backlog = 250000
net.core.somaxconn = 65535
net.core.optmem_max = 8192
net.ipv4.ip_forward = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 240
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_sack = 1
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_max_orphans = 262144
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.overcommit_memory = 1
vm.min_free_kbytes = 65536
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_limit_output_bytes = 65536
net.ipv4.tcp_rfc1337 = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.log_martians = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_challenge_ack_limit = 999999999
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_base_mss = 1024
net.ipv4.route.gc_timeout = 100
net.ipv4.neigh.default.gc_stale_time = 120
  • 执行 sysctl -p
  • 修改文件限制
sed -i '$a root hard nofile 512000\nroot soft nofile 512000' /etc/security/limits.conf
sed -i '$a * hard nofile 512000\n* soft nofile 512000' /etc/security/limits.conf
  • 执行 ulimit -n 512000