魔改BBR算法的尝试

众所周知,这年头的机器不做一番“优化”,带宽利用率根本竞争不过邻居;



于是机智的MJJ都用上了比默认的cubic/reno更aggressive的TCP拥塞控制,而当中又以BBR和锐速为代表。



作为g粉自然是要选择BBR的,毕竟有google和整个linux社区做后台,长远下去肯定要比闭源又停止支持的锐速走得更远。



那么问题来了:在大中华区特殊的国情下,更顾及公平性的BBR比起锐速带宽竞争力还是有些疲软的。能否通过一些小改动,让BBR变得更有侵略性呢?



能!



初版BBR:

https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git/plain/net/ipv4/tcp_bbr.c



魔改BBR:

https://gist.github.com/anonymous/ba338038e799eafbba173215153a7f3a/raw/55ff1e45c97b46f12261e07ca07633a9922ad55d/tcp_tsunami.c



编译时系统必须安装4.10以上版本的kernel及对应的linux-header,gcc版本应在4.9以上



以4.10.9为例,需先更换内核,再先后安装:

(http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.10.9/)

linux-headers-4.10.9-041009_4.10.9-041009.201704080516_all.deb

linux-headers-4.10.9-041009-generic_4.10.9-041009.201704080516_amd64.deb





以下步骤在debian 8及ubuntu 16上测试通过:


  1. apt-get install make gcc-4.9
  2. wget -O ./tcp_tsunami.c https://gist.github.com/anonymous/ba338038e799eafbba173215153a7f3a/raw/55ff1e45c97b46f12261e07ca07633a9922ad55d/tcp_tsunami.c
  3. echo “obj-m:=tcp_tsunami.o” > Makefile
  4. make -C /lib/modules/$(uname -r)/build M=`pwd` modules CC=/usr/bin/gcc-4.9
  5. install tcp_tsunami.ko /lib/modules/$(uname -r)/kernel
  6. depmod -a
  7. insmod tcp_tsunami.ko
  8. sysctl -w net.ipv4.tcp_congestion_control=tsunami

复制代码





关键参数:bbr_bw_rtts, bbr_min_rtt_win_sec, bbr_probe_rtt_mode_ms, bbr_cwnd_min_target, bbr_drain_gain



关键数组:bbr_pacing_gain



经过一个月的测试,魔改BBR比起正常版的BBR确实强上不少,最起码以前看y2b 4k断断续续的远东ss现在能流畅播放了



以上版本的BBR不保证普适性,建议自行修改参数测试





参考链接:

1. http://blog.csdn.net/dog250/article/details/52939004

2. http://blog.csdn.net/dog250/article/details/52879298

3. http://blog.csdn.net/dog250/article/details/52972502

4. https://patchwork.ozlabs.org/patch/671069/

 

 

附上萌咖制作的一键脚本

  • 背景:
  • 原版的BBR对于我们来说,速度不太稳定.

    通过修改BBR源码,调整参数,使其更强劲.


    更新:

    [2017.07.15]

    自动检测gcc版本,如果gcc版本大于4.9的将不会再安装gcc.

    [2017.07.12]

    支持用户自行指定内核版本(需要与 -f 命令同时使用).


  • 准备:
  • 使用前,请确认能够开启BBR.

    可参考: Debian/Ubuntu 开启 TCP BBR 拥塞算法

    或者直接执行此命令进行开启.

    注意:执行此命令会自动重启.


  • 一键地址:
  • 指定内核版本(以v4.11.9内核版本为例):

  • 说明:
    • 执行过程中会重新编译模块.
    • 模块默认为开机自动加载.
    • 模块名称:tcp_bbr_powered
    • 可用 modprobe tcp_bbr_powered 命令进行加载模块.
    • 可执行 lsmod |grep 'bbr_powered' 

      结果不为空,则加载模块成功
    • 可执行 sysctl -w net.ipv4.tcp_congestion_control=bbr_powered 使用此模块.
    • 以上只是说明,直接使用一键脚本即可.


  • 完整代码:

  • 注意事项:
  • 如遇报错:Error! Header not be matched by Linux Kernel.

    请用使用本博客提供的脚本重新开启BBR,可直接参考本篇中的准备步骤.

    如遇报错:Error! Install gcc-4.9.

    首先尝试apt-get update,再次执行此脚本.

    如果未解决想办法自行安装gcc-4.9,或切换系统后再试.

    本脚本在Debian8,Ubuntu16.04上通过测试.


 

Openvz下BBR一键包(LKL+UML)

前提准备

请选择安装 64bit 的操作系统,目前还没做 32bit 的包
VPS 必须支持并开启 TUN/TAP

 

LKL一键包

LKL 要求 ldd 的版本至少在 2.14 ,建议使用安装 CentOS7 , Debian8 和 Ubuntu16
安装包只使用 64bit 的系统。
默认的端口转发只转发了 9000-9999 的端口,如果你不想费心修改,请把 ssr 等应用的端口设在这个范围

 

如果修改转发端口

    1. 修改 /root/lkl/run.sh ,查找 9000-9999 ,改成你想要的端口段
    2. 修改 /root/lkl/haproxy.cfg 查找 9000-9999 ,改成你想要的端口段
    3. 重启 vps安装 LKL 一键包命令
wget nocheckcertificate
https://github.com/91yun/uml/raw/master/lkl/install.sh && bash install.sh

如何判断是否安装成功

如果 10.0.0.2 能 ping 通说明成功, ping 不通说明失败

 

OpenVZ的UML+BBR+SSR加速一键包Alpine linux+Centos

 

一键运行脚本

Alpine linux 小内存版: UML 的系统是 Alpine linux ,需要 64M 内存启动,主机最低 128M 内存

wget N nocheckcertificate https://raw.githubusercontent.com/91yun/uml/master/bbr/uml.sh

Centos 版: UML 的系统是 CentOS ,需要 256M 内存启动,主机建议最低 512M 内存

wget N nocheckcertificate
https://raw.githubusercontent.com/91yun/uml/master/bbr/umlcentos.sh
bash umlcentos.sh

装完 ssr 和 bbr 就已经运行了,如果你不想改密码和端口的话就可以直接用。。默认配置在下面。。

UML 相关说明

如何进入 uml

screen -x 或者在目录下运行 bash run.sh status
用户名: root , 密码: root

如何退出 uml

在 uml 模式里,通过按快捷键 ctrl+a+d 来退出 screen

删除 uml 进程

bash run.sh stop

启动 uml

bash  run.sh start

如何把文件传入 UML

我已经在 root 目录下新建了个 umlshare 目录( /root/umlshare ) , 在 uml 里也做了挂载,位置同样是/root/umlshare, 只要把文件放进去就可以了

SSR 相关说明

默认配置

端口:9191
密码:www.91yun.org
加密:RC4MD5
协议:auth_sha1_v4
混淆:tls1.2_ticket_auth

如何修改 SSR 配置

第一步

根据上面的教程进入 uml

第二步

修改 mudb.json 文件

vi /root/shadowsocksr/mudb.json

把相关的配置改成你自己需要的就可以了。需要说明的是,因为没有编译相关的依赖库,不支持 chacha20 的加密方法

第三步

重启 SSR 程序

bash /root/shadowsocksr/run.sh

最后一步

ctrl+a+d 退出 UML ,在母机的安装目录下(如果没做修改默认是 /root/uml-ssr-64/ )打开 run.sh 找到下面的代码,把 9191 改成你自己刚才修改的端口

iptables t nat A PREROUTING i venet0 p tcp dport 9191 j DNAT todestination 10.0.0.2
iptables t nat A PREROUTING i venet0 p udp dport 9191 j DNAT todestination 10.0.0.2

然后重启即可

SSR 添加多用户

python mujson_mgr.py a p 端口 k 密码 m 加密方式 O 协议 o 混淆

加完记得在母机增加 iptables 端口转发相关的代码

以上来自91yun

前端访问负载均衡

一直对浏览器到服务层这部分访问的负载均衡不是很清楚,今天看了一篇58到家shenjian的文章,觉得不错,这里大概说说自己的感想,文中的图都是借用人家的,特此说明

第一阶段(裸奔)

请求量很少,通过浏览器访问一个域名,经过DNS解析后,直接就到了 tomcat了

第二阶段(简单扩容)

第一个阶段很明显,如果tomcat挂了,那么系统就挂了,所以进行了简单的扩容,增加了web服务器

第三阶段(加了nginx的简单扩容)

第二个阶段很明显,首先对外暴露了过多的ip,其次DNS解析出来的服务器是否可用,无法保证,所以加了nginx

加了nginx之后,扩容就容易了,切换流量也容易,但如果nginx挂了怎么办呢

第四个阶段(使用keepalived

使用keepalived使用管理两台nginx,如果一台nginx挂了,可以切换到另外一台nginx

这样也有两个问题:1.nginx的资源利用只有一半  2.如果请求超过nginx的单点性能极限,咋办

第五阶段(使用lvs和f5)

lvs和f5一个在操作系统层面,一个在硬件层面,它们的性能远超nginx,所以用它们管理一个nginx的集群再合适不过了

第六阶段(重新回到之前的DNS轮询)

第五个阶段基本已经可以抗住99.999%公司的访问了,但是如果请求确实超过了单点lvs和f5的性能极限呢。其实水平扩展是最好的解决办法

可以通过DNS轮询来接入多个lvs和f5,如果还不行,再继续水平加lvs和f5,现阶段只能这样了,谁如果有更好的办法,可以聊一下

本文主要是58到家沈剑文章的读后感,这里贴出链接,大家也可以看看http://mp.weixin.qq.com/s/4dzqbh2wfzbQzgFodP2_6Q,主要用于学习分享,非喜勿喷

OpenVZ VPS 安装 User-mode Linux 以实现 BBR 拥塞控制

 

安装 UML

先装工具链:

apt-get install build-essential libncurses5-dev 

因为需要 BBR 先弄到超前版内核树 net-next,还有对应 UML 的内核配置

cd ~ 

git clone git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git  

cd net-next 

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 

make defconfig ARCH=um 

也可以 export ARCH=um,方便一些。

配置内核使用 BBR

make menuconfig ARCH=um 

进入配置菜单,进入 Networking support → Networking options → TCP: advanced congestion control 页面,移到 BBR TCP,按两下空格直到变成 <*> BBR TCP。下方 Default TCP congestion control 回车选 BBR。一路 Exit,保存。

make ARCH=um vmlinux -j2 编译。

UML 中安装 Arch Linux

基本与在 Ubuntu 下安装新 Arch 一样。

先装一个只读的 rootfs

因为 UML hostfs 的限制,hostfs 一定是只读的,而 OpenVZ 也没有 loop 设备,无法直接挂载磁盘镜像,故我们要先装个只读的 rootfs 来启动 UML UML 中挂镜像。(RefPeterCxy Blog

# 先下载 Arch 最新的 Bootstrap 包:

cd ~ 

wget http://mirror.rackspace.com/archlinux/iso/latest/archlinux-bootstrap-2017.02.01-x86_64.tar.gz 

tar xzf archlinux-bootstrap-2017.02.01-x86_64.tar.gz 

mv root.x86_64 root 

vi root/etc/resolv.conf 

# 加上一行 nameserver 8.8.8.8,保存

mount –rbind /proc root/proc 

mount –rbind /sys root/sys 

mount –rbind /dev root/dev 

mount -t tmpfs tmpfs root/tmp 

mount –rbind /root root/root 

nano root/etc/pacman.d/mirrorlist 

# 搜索离你最近的国家镜像,去掉对应的注释

# 进入 chroot

root/bin/arch-chroot root /bin/bash 

# 此时已经进入 chroot 环境

pacman-key –init 

pacman-key –populate archlinux 

# 安装基础系统

pacman -Sy base 

# 改控制台,也可以不改,通过 screen 连接 pts

systemctl enable getty@tty0 

systemctl disable getty@tty1 

# 退出 chroot

exit 

# 解除 rbind

umount root/{dev,proc,sys,tmp} 

此时在 root 文件夹下就有了完整的 rootfs,可以启动 UML 了。

设置网络

首先在主机商的面板(SolusVM)打开 TUN/TAP 功能。一般能做 VPNPPTPL2TP等) VPS 都有这个选项。

之后配置 TAP 设备:

ip tuntap add tap0 mode tap 

ip addr add10.0.0.1/24 dev tap0 

ip route add default via 10.0.0.1 dev venet0:0 

ip link set tap0 up 

iptables -P FORWARD ACCEPT 

iptables -t nat -A POSTROUTING -o venet0:0 -j MASQUERADE 

安装 Arch 到镜像

cd ~/net-next 

dd if=/dev/zero of=rootfs.img bs=1MB count=6000 # 创建一个 6GB 的镜像 

mount -o remount,size=2G/dev/shm # 改一下 tmpfs 大小,防止爆内存

# 启动到 UML

./vmlinux root=/dev/root rootfstype=hostfs hostfs=./root ubd0=rootfs.img eth0=tuntap,tap0 mem=128M 

mem 是内存大小,此处取 128M(可以根据你的内存情况修改)。 
此时已经有 UML shell,可以开始安装系统了。用户名 root,没有密码。

ip link set eth0 up 

ip addr add10.0.0.2/24 dev eth0 

ip route add default via 10.0.0.1 dev eth0

# 制作文件系统

mkfs.ext4 /dev/ubda 

mount /dev/ubda /mnt 

mkdir -p /mnt/var/lib/pacman 

pacman -Sy base -r /mnt 

pacman -Sy havaged -r /mnt # entropy 生成器

mount –rbind /proc /mnt/proc 

mount –rbind /sys /mnt/sys 

mount –rbind /dev /mnt/dev 

mount -t tmpfs tmpfs /mnt/tmp 

mount –rbind /root /mnt/root

chroot /mnt /bin/bash 

vi /etc/pacman.d/mirrorlist # mirrorlist 

编辑网络配置:

vi /etc/systemd/network/50-static.network 

加入

[Match]

Name=eth0

[Network]

Address=10.0.0.2/24 

Gateway=10.0.0.1 

同上,enable 各项服务,配置 时区、locale 等:

vi root/etc/resolv.conf 

# 加上一行 nameserver8.8.8.8,保存

systemctl enable systemd-networkd 

systemctl enable getty@tty0 

systemctl disable getty@tty1

ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 

sed -i ‘s/#en_US.UTF/en_US.UTF/’ /etc/locale.gen 

locale-gen 

echo ‘LANG=en_US.UTF-8’ > /etc/locale.conf 

echo ‘umlarch’ > /etc/hostname # 配置主机名 

vi /etc/hosts # 加入 127.0.1.1 umlarch.localdomain umlarch 

mkinitcpio -p linux # 应该不需要,以防万一 

genfstab -U /mnt >> /mnt/etc/fstab # fstab 

shutdown -h 0 # 关闭 UML 

现在配置已经基本完成,改变一下命令行,从新建的镜像启动:

vi ./vmlinux root=/dev/ubda ubd0=rootfs.img eth0=tuntap,tap0 mem=256m 

pacman-key –init 

pacman-key –populate archlinux 

搞定。

配置端口转发

先给自己留下 SSH 端口~

iptables -t nat -A PREROUTING -p tcp –dport 22 -j RETURN 

然后其他的端口全转发走啦:

iptables -t nat -A PREROUTING -i venet0 -j DNAT –to-destination10.0.0.2 

yunBT 基于TP3.1的多用户离线下载

项目托管地址 https://github.com/maysrp/yunBT

 

测试系统

Debian7 X64

 

为了大家后期管理方便,这里推荐AMH面板

传送门

要求:PHP>5.3(可使用一键升级脚本,见AMH4.2原帖)

安装完毕LNMP后请到模板里面下载pathinfo,后台模板里直接搜索即可

 

然后ssh里运行 wget http://dl.rocky.hk/sh/yunbt.sh; sh yunbt.sh;

项目源码 http://dl.rocky.hk/sh/yunBT-master.zip 下载后上传到网站根目录

数据库

yunbt.sql导入数据库

/Bt/Conf/config.php 数据库配置

 

 

 

AMH5.3破解&开心版本一键安装脚本

云端Panel 极速安装:
极速免编译安装方式 (安装时间1至3分钟)

wget http://amh.ydidc.top/YD-panel.sh && bash YD-panel.sh 2>&1 | tee YD-panel.log

(备用)wget http://amh.janch.top/YD-panel.sh && bash YD-panel.sh 2>&1 | tee YD-panel.log

云端Panel 编译安装:编译安装方式 (安装时间5至15分钟)
wget http://amh.ydidc.top/YD-panel.sh && bash YD-panel.sh gcc 2>&1 | tee YD-panel.log
(备用)wget http://amh.janch.top/YD-panel.sh && bash YD-panel.sh gcc 2>&1 | tee YD-panel.log

懒人版:

懒人版说明:全自动安装php7.0\lnmp\pure-ftpd\amftp\phpmyadmin等建站必备的模块
懒人版 极速安装:

wget http://amh.ydidc.top/YD-panel2.sh && bash YD-panel2.sh 2>&1 | tee YD-panel.log

(备用)wget http://amh.janch.top/YD-panel2.sh && bash YD-panel2.sh 2>&1 | tee YD-panel.log

懒人版 编译安装:

wget http://amh.ydidc.top/YD-panel2.sh && bash YD-panel2.sh gcc 2>&1 | tee YD-panel.log

(备用)wget http://amh.janch.top/YD-panel2.sh && bash YD-panel2.sh gcc 2>&1 | tee YD-panel.log

AMH5.3 一键转换为云端Panel(安装过之前的二次开发版本或官方版的可转换为云端Panel版)

wget http://amh.ydidc.top/convert.sh && bash convert.sh

卸载
wget dl.rocky.hk/sh/amh-uninstall.sh;bash amh-uninstall.sh

本文参考自vpsps.com

Easypanel/kangle商业版一键安装(全家桶)

脚本说明

1.本脚本是可以一键安装Kangle+Easypanel+Mysql+商业集合脚本。

2.脚本本身集成:PHP5.2、PHP5.3、PHP5.4、PHP5.5、PHP5.6、PHP7、MYSQL5.6

3.支持前台用户任意切换PHP5.2-7以适应网站程序

脚本特点

安装包内PHP套件以及Kangle套件均已本地化,达到最佳连接速度。

支持EP前台自由切换PHP5.2-7.0

预先设置各PHP版本PHP.ini安全问题

自动更新MySQL5.1至MySQL5.6

自动/手动更新PHPmyadmin至官网PHP5.3专用最新版

支持自定义403.404.503.504等错误页面!

预先自带EasyPanel模板两个

执行脚本可以选择安装kangle商业版

问题说明

安装错误请执行以下三个命令

1.请执行 yum -y install wget #安装yum

2.请执行 echo -e “options timeout:1 attempts:1 rotate\nnameserver 114.114.114.114\nnameserver 8.8.8.8” >/etc/resolv.conf; #切换DNS

 

安装

yum -y install wget;wget dl.rocky.hk/sh/kangle.sh;bash kangle.sh

 

卸载

sh uninstall.sh

 

Google BBR 一键安装脚本

2016年12月25日,秋水逸冰做的一键安装脚本

系统支持:CentOS 6+,Debian 7+,Ubuntu 12+
虚拟技术:OpenVZ 以外的(KVM、Xen、VMware等)
内存要求:≥128M
日期  :2016 年 12 月 24 日

使用方法

使用root用户登录,运行以下命令:

安装完成后,脚本会提示需要重启 VPS,输入 y 并回车后重启。
重启完成后,进入 VPS,验证一下是否成功安装最新内核并开启 TCP BBR,输入以下命令:

查看内核版本,含有 4.9.0 就表示 OK 了

返回值一般为:
net.ipv4.tcp_available_congestion_control = bbr cubic reno

返回值一般为:
net.ipv4.tcp_congestion_control = bbr

返回值一般为:
net.core.default_qdisc = fq

返回值有 tcp_bbr 模块即说明bbr已启动。

 

—————————————————————————————————————-

bbrplus(bbr修正版)一键安装与使用

wget https://github.com/cx9208/Linux-NetSpeed/raw/master/tcp.sh && chmod +x tcp.sh && ./tcp.sh

参考 https://www.hostloc.com/forum.php?mod=viewthread&tid=508015&highlight=bbr%2Bplus

finalspeed使用说明

 

FinalSpeed客户端Windows版

下载地址:

finalspeed_install1.0.exe

finalspeed_install1.2.exe

如果大家觉的1.2的不稳定可以换回1.0的使用

 

FinalSpeed客户Java版,支持OS X,Linux

下载地址:

finalspeed_client1.0.zip

系统需安装java运行环境,Linux还需安装libpcap.

Ubuntu,Debian安装libpcap: apt-get -y install libpcap-dev

Centos安装libpcap: yum -y install libpcap

安装:下载解压.

运行: 打开终端,假设finalspeed_client.jar所在路径为/fsclient ,先切换到该路径cd /fsclient ,

然后执行 sudo java -jar finalspeed_client.jar ,前面加sudo,因为必须以root权限运行,如果没有root权限,会无法启用tcp协议.

假设服务器IP为10.10.10.10,ss端口为8989.

加速前提ss服务端运行正常,ss客户端也能正常登录.

注意:ovz架构的机器只能选择UDP

1.运行FinalSpeed客户端,填写服务器地址 10.10.10.10 .



2.点击添加,增加加速端口,加速端口为ss端口8989,如果为其他端口,请相应修改,本地端口任意,这里是2000 .



3.打开ss客户端,添加服务器,服务器IP为127.0.0.1,服务器端口为加速端口对应的本地端口,这里是2000,然后设置你的ss密码,加密方式.



5.确定保存,选择使用刚添加的服务器,并设置浏览器代理,成功连接后,FinalSpeed状态栏会出现”连接服务器成功”提示.

 SS使用说明见http://www.rocky.hk/public/?post=28

服务器一键测试包

  1. 为了方便以后的维护,托管地址已经变更,之前有fork的朋友请重新fork(https://github.com/91yun/91yuntest
  2. 修复了路由不显示的问题
  3. 更换了几个测试路由节点
  4. 增加了3个模式
    1. 简单模式:只测试机器配置,IO,带宽和全国ping值。可以最快速度的知道服务器的大致状况
    2. 普通模式:和之前一样
    3. 完全模式:在普通模式的基础上增加了unixbench测试

91yun服务器测试一键包介绍

一键包主要是为了让大家快速对服务器的基本状况有一个了解。考虑到天朝的网络出口问题,所以这个一键包更加偏向网络的测试。

影响测试耗时主要是下载,整个测试如果是能跑满100M带宽的话,应该在20分钟-30分钟。但如果只有几百k下载速度的话,就要耗很长时间了,所以如果大家看到测试卡在了下载测试,希望大家耐心等候。

测试结果存在当前目录的test91yun.log。大家可以用vim或者cat看,同时也会生成html的页面,方便大家查看和分享。具体html页面的样式参考以下内容。

使用方法:

简单模式:

wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/91yuntest/master/test.sh && bash test.sh -i "io,bandwidth,download,traceroute,backtraceroute,allping,gotoping"

简单模式的测试包含:常规系统参数检测,带宽测试,IO测试和全国ping测试。测试输出结果请参考:简单模式结果样式参考

主要因为普通模式的下载测试和路由测试有些耗时,有时大家可能只需要快速获得这台服务器的参数,带宽,io和延迟是多少。那么简单模式可以节省大量的时间。如果需要进一步的信息则可以使用普通模式。

相比普通模式,就是在命令最后加个s参数: bash test_91yun.sh s

完全模式:

wget -N --no-check-certificate https://raw.githubusercontent.com/91yun/91yuntest/master/test.sh && bash test.sh -i "io,bandwidth,download,traceroute,backtraceroute,allping,gotoping,benchtest"

 

由于unixbench的测试极其耗资源(cpu和io会长时间处于占满状态),有些IDC禁用,会杀进程或者判断滥用。请谨慎测试。