VPS网络优化and加速

  • VPS常用网络加速集合.

  • 更新

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    更新
    2016.06.26 初始化。
    2016.06.28 TCP优化部分完成
    2016.06.29 FinalSpeed和锐速部分基本完成。
    2016.12.11 重新整理相关内容.
    2016.12.15 增加TCP-BBR
    2017.01.11 整理相关内容,增加锐速配置优化
    2017.03.28 更新一部分配置内容,删除无效内容
    2017.04.0291yun被爆隐私问题,删除其对应内容
    2017.07.03 更新大量锐速/bbr内容.
    2019.07.12 重新整理,删除无效引用,更新BBRPLUS,UDP2RAW,UDPspeeder等.
    2020.07.23 增加一部分注释
    2021.01.08 调整部分参数更为激进.
  • 参考

    https://gist.github.com/lixingcong/0e13b4123d29a465e364e230b2e45f60#file-sysctl-conf-L15
    https://gist.github.com/lixingcong/0e13b4123d29a465e364e230b2e45f60

导语

  • 受制于二级运营商,无论国内国外,vps到本地非常惨不忍睹…

  • 这里大致集合了自己常用方法,算是备用.

  • 推荐使用 Linux-NetSpeed ,集成了常用的加速手段 (但个人并未完整测试/审核,请自行确认).

总览

  • 一般过程是 单边tcp->双边tcp.udp加速另算.

  • 单边tcp加速(ovz无法进行内核操作,故单边进针对非ovz)

    • 首选 -> 原版BBR,速度不够 -> 魔改,两者均表现不佳 -> BBRplus.
    • 如果BBR一族表现不佳 -> BBR+锐速.
    • 如vps无法更换到linux kernel >=4.9 -> hybla+锐速.
  • 双边tcp加速.(ovz可用)

    • 首选 -> Kcptun ,参数配置稍复杂,请参考相关例程.
    • 备选 -> FinalSpeed ,FS的暴力至今无有出其右,追求极限速度且isp并未对udp大量限速.
    • isp 对udp流量的限速,大量断流, -> 串联 udp2raw .
  • udp加速

    • 玩游戏 -> UDPspeeder+Udp2raw
    • 如果是其他类型的udp加速 -> 串联 Udp2raw ,提升稳定性.

TCP优化

  • 使用建议

    • 仅适用于 tcp 加速(这不是废话吗).
    • 所以vps都应该进行一遍TCP优化
    • 与其他优化兼容
  • 步骤

    • 增加TCP连接数量

      1
      nano /etc/security/limits.conf

      添加两行:

      1
      2
      * soft nofile 51200
      * hard nofile 51200

      保存(Ctrl + X —— y ——回车)

    • 设置ulimit:

      1
      ulimit -n 51200
    • 修改 sysctl.conf

      • 开始修改

        1
        nano /etc/sysctl.conf
      • 复制代码:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        # 系统所有进程一共可以打开的文件数量, 每个套接字也占用一个文件描述字
        fs.file-max = 1491124
        # 提高整个系统的文件限制
        net.core.rmem_max = 67108864
        net.core.wmem_max = 67108864

        # 增大内核 backlog 参数,使得系统能够保持更多的尚未完成 TCP 三次握手的套接字。
        net.ipv4.tcp_max_syn_backlog = 1048576
        net.core.netdev_max_backlog = 1048576
        net.core.somaxconn = 1048576

        # 表示用于向外连接的端口范围
        net.ipv4.ip_local_port_range = 4096 65000
        # 预留端口
        net.ipv4.ip_local_reserved_ports = 3000,3306,6379,27017,27018

        # 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
        net.ipv4.tcp_max_orphans = 131072

        # 启用 TIME_WAIT 复用,使得结束 TIEM_WAIT 状态的套接字的端口可以立刻被其他套接字使用
        net.ipv4.tcp_tw_reuse = 1
        # 表示系统同时保持TIME_WAIT的最大数量
        net.ipv4.tcp_max_tw_buckets = 55000

        # 优化 nf_conntrack 参数,防止服务器出现大量短链接的时候出现丢包
        net.netfilter.nf_conntrack_max=1048576
        net.nf_conntrack_max=1048576
        net.netfilter.nf_conntrack_tcp_timeout_fin_wait=30
        net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
        net.netfilter.nf_conntrack_tcp_timeout_close_wait=15
        net.netfilter.nf_conntrack_tcp_timeout_established=300

        # 缩短套接字处于 TIME_WAIT 的时间, 60s -> 15s
        net.ipv4.tcp_fin_timeout = 15

        # 减小 tcp keepalive 探测次数,可以即时释放长链接
        net.ipv4.tcp_keepalive_probes = 3
        # 缩短 tcp keepalive 探测间隔时间,同上
        net.ipv4.tcp_keepalive_intvl = 15
        # 修改 tcp keepalive 默认超时时间
        net.ipv4.tcp_keepalive_time=1200

        # 关闭慢启动重启(Slow-Start Restart), SSR 对于会出现突发空闲的长周期 TLS 连接有很大的负面影响
        net.ipv4.tcp_slow_start_after_idle = 0

        # 启用 MTU 探测,在链路上存在 ICMP 黑洞时候有用(大多数情况是这样)
        net.ipv4.tcp_mtu_probing = 1

        # 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
        net.ipv4.tcp_syncookies = 1

        # 当某个节点可用内存不足时, 系统会倾向于从其他节点分配内存。对 Mongo/Redis 类 cache 服务器友好
        vm.zone_reclaim_mode = 0

        # 当内存使用率不足10%(默认值60%)时使用 swap,尽量避免使用 swap,减少唤醒软中断进程
        vm.swappiness = 10

        # 内核执行无内存过量使用处理。使用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务 Mongo/Redis 的性能。
        vm.overcommit_memory = 1

        # 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭 为了对NAT设备更友好,建议设置为 0。
        net.ipv4.tcp_tw_recycle = 0

        # 启用 tcp fast open
        net.ipv4.tcp_fastopen = 3

        # 剩余内存 > 300m
        net.core.rmem_default = 174760
        net.core.rmem_max = 2097152
        net.ipv4.tcp_rmem = 4096 174760 67108864

        net.core.wmem_default = 131072
        net.core.wmem_max = 2097152
        net.ipv4.tcp_wmem = 4096 131072 67108864

        net.ipv4.tcp_mem = 131072 262144 524288

        # END OF LINE
      • 保存(Ctrl + X —— y ——回车)

      • 应用

        1
        sysctl -p

TCP-BBR

  • 介绍

    • BBR (Bottleneck Bandwidth and RTT)是由google工程师编写的新的 TCP 拥塞控制算法,目的是要尽量跑满带宽, 并且尽量不要有排队的情况.
    • 开源地址. 原理请参考知乎有关问答.
  • 使用建议

    • 开源,高效,相对公平,加速tcp首选.
    • 修改版 BBR 更为激进
    • 不会造成流量大量浪费.(修改版BBR相对会多一点)
    • 只支持 linux4.9 及以上内核,低版本内核建议选择锐速+hybla.
  • 启用TCP-BBR涉及VPS更换内核,所以如果步骤错误,或者VPS不兼容最新的内核,会导致无法开机等错误,

原版BBR


  • Linux-NetSpeed 已包含,选择3.

  • 脚本来自 秋水逸冰.

  • 系统支持:CentOS 6+,Debian 7+,Ubuntu 12+

  • 虚拟技术:除 OpenVZ 外

  • 内存要求:≥128M

  • 连接SSH,输入下面命令,更新内核

    1
    2
    3
    wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh
    chmod +x bbr.sh
    ./bbr.sh
  • 安装完成后,脚本会提示需要重启 VPS,输入 y 并回车后重启

  • 重连SSH

  • 验证 内核版本

    1
    uname -r

    最新内核版本大于4.9即可.

  • 修改sysctl.conf

    1
    nano /etc/sysctl.conf

    复制到最后一行

    1
    2
    3
    # bbr
    net.core.default_qdisc=fq
    net.ipv4.tcp_congestion_control=bbr

    保存(Ctrl + X —— y ——回车)

    应用

    1
    sysctl -p

修改版BBR

  • 相对原版更为激进,加速效果更好.

  • 提供 Vicer版 , 魔改版 2个版本.

  • 注意:修改版BBR的一键脚本,支持系统较少,安装前需要确认自己的系统支持,如不在支持列表,自行Google即可,有大量第三方脚本。

Vicer版BBR

  • 脚本来自Debian/Ubuntu TCP BBR 改进版/增强版

  • 一键安装

    1
    wget --no-check-certificate -qO 'BBR_POWERED.sh' 'https://moeclub.org/attachment/LinuxShell/BBR_POWERED.sh' && chmod a+x BBR_POWERED.sh && bash BBR_POWERED.sh
  • 遇到 Error! Header not be matched by Linux Kernel.参看Debian/Ubuntu 开启 TCP BBR 拥塞算法,依照 作者开启bbr 的脚本执行一遍即可。

  • 遇到Error! Install gcc-4.9. 参见 Debian 7手动安装gcc4.9 小节.
    ,其他系统 执行 apt-get update

  • 安装完成后 执行lsmod |grep 'bbr_powered' 结果不为空,则加载模块成功

Debian 7手动安装gcc4.9
  • 修改系统更新源

    1
    nano /etc/apt/sources.list
  • 添加如下两个更新源

    1
    2
    deb http://ftp.cn.debian.org/debian/ jessie main non-free contrib
    deb http://ftp.uk.debian.org/debian/ jessie main non-free contrib
  • 保存(Ctrl + X —— y ——回车)

  • 执行更新
    apt-get update

  • 检查可安装 gcc 版本列表
    apt-cache search gcc

  • 输出有gcc4.9 字样即可,数量无所谓

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    libx32gcc-4.8-dev - GCC support library (x32 development files)
    cpp-4.9 - GNU C preprocessor
    gcc-4.9 - GNU C compiler
    gcc-4.9-base - GCC, the GNU Compiler Collection (base package)
    gcc-4.9-locales - GCC, the GNU compiler collection (native language support files)
    gcc-4.9-multilib - GNU C compiler (multilib files)
    gcc-4.9-plugin-dev - Files for GNU GCC plugin development.
    gcc-4.9-source - Source of the GNU Compiler Collection
    gccgo-4.9 - GNU Go compiler
    gccgo-4.9-multilib - GNU Go compiler (multilib files)
    gcj-4.9 - GCJ byte code and native compiler for Java(TM)
    gcj-4.9-jdk - GCJ and Classpath development tools for Java(TM)
    gcj-4.9-jre-lib - Java runtime library for use with gcj (jar files)
    gdc-4.9 - GNU D compiler (version 2), based on the GCC backend
    gfortran-4.9 - GNU Fortran compiler
    gfortran-4.9-multilib - GNU Fortran compiler (multilib files)
    gobjc++-4.9 - GNU Objective-C++ compiler
    gobjc++-4.9-multilib - GNU Objective-C++ compiler (multilib files)
    gobjc-4.9 - GNU Objective-C compiler
    gobjc-4.9-multilib - GNU Objective-C compiler (multilib files)
  • 命令apt-get install g++-4.9 安装g+±4.9

魔改版BBR


  • Linux-NetSpeed 已包含,选择4.
  • 同时还包括了更为暴力的魔改版BBR,选择5即可,但可能不支持部分系统.

  • 一键脚本

    1
    wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/YankeeBBR/master/bbr.sh && bash bbr.sh install

    之后选择重启系统,重连SSH

  • 输入命令 bash bbr.sh start 即可完成安装

  • 验证 sysctl net.ipv4.tcp_available_congestion_control 返回命令有 tsunami 即可。

BBRplus

  • BBRplus与魔改版,稍有不同,是 @dog250 在让人们久等了的TCP BBR v2.0快要出炉了! 中,提到了bbr初版的两个问题,及解决的代码.而 @cx9208 又将其编译命名成 BBRplus.

  • 在原版/魔改BBR 不适用的场景下可以试试 BBRplus 或许有奇效.

  • 开源地址

  • @cx9208 只提供了 CentOS 的安装脚本,但在 README.md 推荐了 @chiakge 的 Linux-NetSpeed 项目,经过测试适用于 debian(其他请自行测试).

  • 选择7安装即可.

hybla

  • hybla 是传统上基于丢包的 tcp拥塞控制算法.适用于高延迟高丢包率环境.虽然远远比不上 bbr ,但还是要比其他的算法要强.在低版本linux内核(<4.9)可用.建议配合锐速使用.

  • 修改内核参数适合的还是hybla
    首先看一下VPS现有算法:

    1
    sysctl net.ipv4.tcp_available_congestion_control
  • 没有hybla时,加载hybla算法.

    1
    /sbin/modprobe tcp_hybla
  • 编辑 sysctl.conf 文件

    1
    nano /etc/sysctl.conf

    最后一行添加

    1
    net.ipv4.tcp_congestion_control = hybla

    保存(Ctrl + X —— y ——回车)

  • 应用

    1
    sysctl -p

锐速

  • 介绍

    • 锐速(ServerSpeeder 或 lotServer)加速软件是一种基于ZETATCP加速引擎的软件,只需单边部署就可以起到显著加速效果的 TCP 加速技术.
    • 2016年已停止免费用户.以下提供的破解版安装方式,收集自网络.仅供个人实验使用,请支持正版.
  • 使用建议

    • 仅适用于 tcp 加速.

    • 锐速为闭源软件,且目前 BBR 已经有足够加速效果,锐速并非首选.

    • 与 BBR 目前不兼容,二者取其一可满足大部分需要加速场景,锐速目前支持一部分发行版的高版本内核,可以与 BBR 同时安装,具体请参考LotServer 支持当前主流 Linux 系统的官方发行版本

    • 默认参数即可满足大部分场景,除非很慢,否则不推荐更改配置文件.


  • Linux-NetSpeed 已包含,但建议还是由 @Vicer 的脚本安装.

  • 安装

    • 相关内容来自 @Vicer[lotServer] [serverSpeeder] [锐速] 安装,感谢原作者!

    • 安装

      1
      bash <(wget --no-check-certificate -qO- https://github.com/MoeClub/lotServer/raw/master/Install.sh) install
    • 中间提示全部输入 y 即可,等待安装完成

    • 卸载

      1
      bash <(wget --no-check-certificate -qO- https://github.com/MoeClub/lotServer/raw/master/Install.sh) uninstall
  • 常用命令

    • 启动命令 /appex/bin/lotServer.sh start
    • 状态查询 /appex/bin/lotServer.sh status
    • 停止加速 /appex/bin/lotServer.sh stop
    • 更新许可 /appex/bin/serverSpeeder.sh renewLic
    • 重新启动 /appex/bin/serverSpeeder.sh restart

锐速配置文件修改

  • 详细配置文档

    https://github.com/0oVicero0/serverSpeeder_Install/blob/master/lotServer.pdf

  • 配置文件在/serverspeeder/etc/config

  • 首先确保下面3个参数开启

    1
    2
    3
    rsc="1" #RSC 网卡驱动模式
    advinacc="1" #流量方向加速
    maxmode="1" #最大传输模式
  • DO vps还要开启gso

  • 下面是一些个人测试对加速有效果的选项,请结合网络环境自行测试

    • initialCwndWan=“64″
      初始 TCP 发送窗口能够发送的数据包的数量,该值设置的高会获得更好的加速效果,但是可能会造成网络的拥塞。使用值在60以下有效果

    • l2wQLimit=”1024 4096″
      从 LAN 到 WAN 加速引擎在缓冲池充满和空闲时分别能够缓存的数据包队列的长度的上限,该值设置的高会获得更好的加速效果,但是会消耗更多的内存。
      w2lQLimit=”1024 4096″
      从 WAN 到 LAN 加速引擎在缓冲池充满和空闲时分别能够缓存的数据包队列的长度的上限,该值设置的高会获得更好的加速效果,但是会消耗更多的内存。

    • halfCwndMinSRtt=”500″
      halfCwndLossRateShift=”3″
      以上两个值用于判断网络拥塞,分别为延时和丢包率,丢包率默认值为 3,即1/2^3,当拥塞产生时,退出第三代 Learning-based TCP 算法,采用类似传统 TCP 的算法。
      此处对于高丢包的线路来说,直接设置为1,即丢包百分之50以上时,才退出Learning-based TCP 算法(这会导致高丢包线路上增加流量消耗)

  • 修改完成后,重启锐速

    1
    /serverspeeder/bin/serverSpeeder.sh restart

FinalSpeed

  • 介绍

    • FinalSpeed是高速双边加速软件,可加速所有基于tcp协议的网络服务,在高丢包和高延迟环境下,仍可达到90%的物理带宽利用率,即使高峰时段也能轻松跑满带宽可以与锐速共存.免费版已停止更新.
      疯狂发包,对邻居非常不公平.
  • 使用建议

    • FinalSpeed现在已停止更新,不建议使用.此处提及仅作为记录和测试.
    • OVZ虚拟化的vps上只可用udp模式,udp在国内被封杀较严重,导致链接中断等。
  • 安装

    • 官方移除了安装方法,以下安装方式来自 github备份

    • 安装命令:

      1
      2
      3
      4
      rm -f install_fs.sh
      wget https://raw.githubusercontent.com/KorudoKyatto/FinalSpeed/master/install_fs.sh
      chmod +x install_fs.sh
      ./install_fs.sh 2>&1 | tee install.log
    • 一键安装完成后,vps会自动安装java环境。

    • 卸载:

      1
      sh /fs/stop.sh ; rm -rf /fs
    • 设置开机启动:

      1
      2
      chmod +x /etc/rc.local
      vi /etc/rc.local
    • 然后加入

      1
      sh /fs/start.sh
    • 每天晚上1点自动重启:

      1
      2
      crontab -e
      0 1 * * * sh /fs/restart.sh
  • FinalSpeed windows客户端

    • 官方最新版本为1.2 更新日志上表明cpu占用降低30%,但是稳定性较差,时常挂掉。推荐FinalSpeed1.12测试版.
  • 常用命令

    • 启动:

      1
      sh /fs/start.sh
    • 停止:

      1
      sh /fs/stop.sh
    • 重新启动:

      1
      sh /fs/restart.sh
    • 运行日志:

      1
      tail -f /fs/server.log

Kcptun

  • 介绍

    • Kcptun 基于 KCP 协议的 UDP 隧道,它可以将 TCP 流转换为 KCP+UDP 流。而 KCP 是一个快速可靠协议,能以比 TCP 浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果.
      暴力发包比fs稍好.
  • 使用建议

    • 仅适用于 tcp 加速.
    • 在对udp的限速非常厉害的环境中,仅 Kcptun 断流可能非常严重.还需要配合 udp2raw 使用.
    • 不挑平台,小内存VPS可用(64M内存服务器稳定运行),OVZ可用.
    • 不当配置将带来大量流量消耗
  • 安装

    • 未进行详细测试,请自行 google.

UDPspeeder

  • 双边网络加速工具,软件本身的功能是 加速UDP ,用1.5倍的流量,就可以把10%的丢包率降低到万分之一以下.
  • 使用,配置等作者在 README.zh-cn.md 说的非常完善了.

Udp2raw-tunnel

  • udp2raw tunnel,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS,或在UDP不稳定的环境下提升稳定性。可以有效防止在使用kcptun或者finalspeed的情况下udp端口被运营商限速。

  • 参照linux笔记——docker运行Udp2raw

结束