Ubuntu开启PPC拥塞控制算法--看起来不比BBR差

locknlocklocknlock 话题数:18会员

前方深坑预警

本文仅做抛砖引玉,供读者举一反三。

提前说一下编译安装PCC可能有的坑:

  • 当前内核版本的header没装。
  • gcc版本过低。
  • gcc强行把warn当error来处理,即werror。
  • PCC代码年久失修,Linux内核升级后改了部分代码导致tcp_TA.c内某些引用出错。
  • 直接使用insmod动态加载的模块在重启后不会自动加载,需要再次insmod一次,可以百度找解决方法。
  • 可能还有更多编译坑。
  • 没事还是用bbr,毕竟有一键安装脚本。

编译安装PCC

PCC is a new approach for TCP congestion control base on real-time performance analysis. This is a kernel implementation of it.

PCC和BBR一样都是一直TCP拥塞控制算法,就目前我自己做的测试(ipv6环境)来看,效果不差。下面介绍如何在Linux下开启PPC。

安装环境:

  • Ubuntu 14.04.5 LTS x86_64
  • kernel version 4.9.0-040900-generic
  • gcc version 4.9.4

升级kernel为4.9,需要同时安装image和header,其他版本kernel一样,必须安装header。

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9/linux-image-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb

wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9/linux-headers-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb

dpkg -i linux-image-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb

dpkg -i linux-headers-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb

reboot

安装编译工具

apt-get install build-essential -y

gcc -v

如果默认安装的gcc版本低于4.9,按照下面操作升级。

apt-get install software-properties-common
add-apt-repository ppa:ubuntu-toolchain-r/test
apt-get update
apt-get install gcc-4.9 g++-4.9

update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9
git clone https://github.com/giltu/KernelPCC.git

cd KernelPCC

编辑tcp_TA.c,替换NET_INC_STATS_BHNET_INC_STATS,
替换NET_ADD_STATS_BHNET_ADD_STATS,保存。
==此处替换操作仅针对4.9及更新版本的内核。==

然后开始编译:

make

编译过程中warn不用管,但是出现error就会失败,==这一步各种坑==。编译成功会在目录下生成一个tcp_TA.ko文件。

加载内核模块:

insmod tcp_TA.ko

lsmod | grep TA

返回tcp_TA 16384 32类似这样的结果即加载成功。

sysctl net.ipv4.tcp_available_congestion_control

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

切换tcp拥塞控制算法为TA:

sysctl -w net.ipv4.tcp_congestion_control=TA

最后检查一下:

sysctl net.ipv4.tcp_congestion_control

返回net.ipv4.tcp_congestion_control=TA即可。

补充

  • 不一定需要4.9版本的kernel,其他版本的kernel安装好相应的header和稍微改一下由于内核代码更新换代导致的小错误即可。
  • Ubuntu/Debian kernel及header列表 http://kernel.ubuntu.com/~kernel-ppa/mainline/
此话题使用的标签:

评论

  • 91yun91yun 话题数:223管理员

    欢迎技术贴~如果有两者对比的实测数据就更好啦~

  • xddxddxddxdd 话题数:36会员
    最后编辑于 六月 2017 #2

    快速测试了一下,
    杭州电信连接gigsgigscloud香港kvm,pcc看YouTube速度开始在10000k,慢慢掉到7000k,bbr能稳在10000k

    杭州电信连接virmach洛杉矶,pcc 2700k,bbr 3500k
    个人结论:接着用bbr

  • hehehehe 话题数:34会员
    Mark,技术贴,我用了那个bbr2根本连不上了-
  • lovagelovage 话题数:46会员
    朕知道了
  • singhighsinghigh 话题数:373管理员

    的确PCC不错,我早就用上了,91yun主贴我也发了有这个算法。

  • runapprunapp 话题数:34会员
    问下lz的ipv6是教育网环境还是?
  • linhualinhua 话题数:89会员, 大佬
    最后编辑于 六月 2017 #7

    根据 https://www.usenix.org/system/files/conference/nsdi15/nsdi15-paper-dong.pdf 第8页 图5 的描述, PCC的抗丢包没有BBR效果好.. 不过根据此论文 2.2 节描述,这个抗丢包率上限可以更改(当前是5%)

  • locknlocklocknlock 话题数:18会员

    @runapp 说道:
    问下lz的ipv6是教育网环境还是?

    教育网

  • haruhiharuhi 话题数:6会员

    请问最低内核版本是多少才能开启ppc?

  • locknlocklocknlock 话题数:18会员

    @haruhi 说道:
    请问最低内核版本是多少才能开启ppc?

    目测只要本身带有cubic这个拥塞控制算法的版本都可以,毕竟这个项目代码是直接在cubic上面改的。剩下的只要填好编译的坑就好了。

  • lonnmlonnm 话题数:16会员
    感谢大佬研究 :)
  • runapprunapp 话题数:34会员
    null
    多谢!那我也去试试
  • haruhiharuhi 话题数:6会员

    @locknlock 说道:

    @haruhi 说道:
    请问最低内核版本是多少才能开启ppc?

    目测只要本身带有cubic这个拥塞控制算法的版本都可以,毕竟这个项目代码是直接在cubic上面改的。剩下的只要填好编译的坑就好了。

    的确是个大坑,错误提示根本找不到哪里出了问题

  • locknlocklocknlock 话题数:18会员

    @haruhi 说道:

    @locknlock 说道:

    @haruhi 说道:
    请问最低内核版本是多少才能开启ppc?

    目测只要本身带有cubic这个拥塞控制算法的版本都可以,毕竟这个项目代码是直接在cubic上面改的。剩下的只要填好编译的坑就好了。

    的确是个大坑,错误提示根本找不到哪里出了问题

    当你感到绝望的时候就换个版本的kernel吧

  • runapprunapp 话题数:34会员

    效果相当不错!感谢lz

  • locknlocklocknlock 话题数:18会员

    @locknlock 说道:

    前方深坑预警

    本文仅做抛砖引玉,供读者举一反三。

    提前说一下编译安装PCC可能有的坑:

    • 当前内核版本的header没装。
    • gcc版本过低。
    • gcc强行把warn当error来处理,即werror。
    • PCC代码年久失修,Linux内核升级后改了部分代码导致tcp_TA.c内某些引用出错。
    • 直接使用insmod动态加载的模块在重启后不会自动加载,需要再次insmod一次,可以百度找解决方法。
    • 可能还有更多编译坑。
    • 没事还是用bbr,毕竟有一键安装脚本。

    编译安装PCC

    PCC is a new approach for TCP congestion control base on real-time performance analysis. This is a kernel implementation of it.

    PCC和BBR一样都是一直TCP拥塞控制算法,就目前我自己做的测试(ipv6环境)来看,效果不差。下面介绍如何在Linux下开启PPC。

    安装环境:

    • Ubuntu 14.04.5 LTS x86_64
    • kernel version 4.9.0-040900-generic
    • gcc version 4.9.4

    升级kernel为4.9,需要同时安装image和header,其他版本kernel一样,必须安装header。

    wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9/linux-image-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb
    
    wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9/linux-headers-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb
    
    dpkg -i linux-image-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb
    
    dpkg -i linux-headers-4.9.0-040900-generic_4.9.0-040900.201612111631_amd64.deb
    
    reboot
    

    安装编译工具

    apt-get install build-essential -y
    
    gcc -v
    

    如果默认安装的gcc版本低于4.9,按照下面操作升级。

    apt-get install software-properties-common
    add-apt-repository ppa:ubuntu-toolchain-r/test
    apt-get update
    apt-get install gcc-4.9 g++-4.9
    
    update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.9
    
    git clone https://github.com/giltu/KernelPCC.git
    
    cd KernelPCC
    

    编辑tcp_TA.c,替换NET_INC_STATS_BHNET_INC_STATS,
    替换NET_ADD_STATS_BHNET_ADD_STATS,保存。
    ==此处替换操作仅针对4.9及更新版本的内核。==

    然后开始编译:

    make
    

    编译过程中warn不用管,但是出现error就会失败,==这一步各种坑==。编译成功会在目录下生成一个tcp_TA.ko文件。

    加载内核模块:

    insmod tcp_TA.ko
    
    lsmod | grep TA
    

    返回tcp_TA 16384 32类似这样的结果即加载成功。

    sysctl net.ipv4.tcp_available_congestion_control
    

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

    切换tcp拥塞控制算法为TA:

    sysctl -w net.ipv4.tcp_congestion_control=TA
    

    最后检查一下:

    sysctl net.ipv4.tcp_congestion_control
    

    返回net.ipv4.tcp_congestion_control=TA即可。

    补充

    • 不一定需要4.9版本的kernel,其他版本的kernel安装好相应的header和稍微改一下由于内核代码更新换代导致的小错误即可。
    • Ubuntu/Debian kernel及header列表 http://kernel.ubuntu.com/~kernel-ppa/mainline/

    补充

  • hehehehe 话题数:34会员
    最后编辑于 六月 2017 #17

    这个算法不错,要是能搞到3系列内核上就好了,效果和bbr差不多~

    bbr.png

    PPC.png

    tcp_china.PNG

  • allientNekoallientNeko 话题数:161会员, 大佬

    @linhua 说道:
    根据 https://www.usenix.org/system/files/conference/nsdi15/nsdi15-paper-dong.pdf 第8页 图5 的描述, PCC的抗丢包没有BBR效果好.. 不过根据此论文 2.2 节描述,这个抗丢包率上限可以更改(当前是5%)

    正在把這個放到 LKL 和 UML
    要再改動或者優化什麼嗎?

  • allientNekoallientNeko 话题数:161会员, 大佬

    老實說
    還差最後一步
    今天晚上回來弄
    如果有優化參數是最好
    不然又會出現好幾個版本

  • linhualinhua 话题数:89会员, 大佬

    @allientNeko 说道:
    老實說
    還差最後一步
    今天晚上回來弄
    如果有優化參數是最好
    不然又會出現好幾個版本

    没有找到 代码里面对应的地方!

登录注册后才能评论。