1. Tcp_bbr注册了一个拥塞算法的回调函数cong_control,不再关心TCP原先的各种拥塞状态,直接在拥塞算法中进行自己的状态转换,进行带宽判断和发送。
2. 在bbr的拥塞算法中有四个状态,BBR_STARTUP
BBR_DRAIN BBR_PROBE_BW BBR_PROBE_RTT,其中BBR_STARTUP是初始化的状态,这是一个快速填满带宽的过程,BBR_DRAIN 状态表明发生了拥塞,需要出让一些带宽出来,BBR_PROBE_BW是一个稳定的状态,也就是一个相对匀速状态,
static const int bbr_pacing_gain[] = {
BBR_UNIT * 5 / 4, /* probe for more available bw 为了探测更多的带宽 */
BBR_UNIT * 3 / 4, /* drain queue and/or yield bw to other floiws出让一些带宽给其他的流*/
BBR_UNIT, BBR_UNIT, BBR_UNIT, /* cruise at 1.0*bw to utilize pipe, */
BBR_UNIT, BBR_UNIT, BBR_UNIT /* without creating excess queue... */
};
这个数组中有8个元素,表示的是发送速率的增益系数,
PROBE_RTT表示连续一段时间(min_rtt_win_sec窗口内 默认10秒)采集到的RTT均比系统已保存的最小RTT(上个min_rtt_win_sec窗口内的最小RTT)更大,这说明发生了拥塞,原先最小RTT曾经达到过,那么它就是一个可以达到的值,在10秒的周期里没有达到,那肯定是发生了什么事件阻止该周期内的RTT达到曾经的最小RTT。这个事件一定是拥塞!
一个长连接处于的状态应该是PROBE_BW
在进入到PROBE_RTT状态后,如果在10秒中内填满了带宽,那么就会进入PROBE_BW状态,否则进入BBR_STARTUP状态,重新开始填满管道
3. bbr 算法最终会稳定在BBR_PROBE_BW状态,在这个状态中会使用到bbr_pacing_gain数组来调整发送速率的增益系数,如下图所示,bbr 发现带宽富余的最短时间就是6个RTT,为什么是6个?这是有数组bbr_pacing_gain决定的,数组的最后六个元素BBR_UNIT, BBR_UNIT, BBR_UNIT, /* cruise at 1.0*bw to utilize pipe, */
BBR_UNIT, BBR_UNIT, BBR_UNIT /* without creating excess queue... */
4. BBR算法对RTT变大的反应,假设RTT突然变大,可能并不是真的发生了拥塞,只是链路的波动,BBR算法并不对其进行反应,照样进行匀速的发送,但是这里有个时间窗口的限制,10秒中,如果在一个时间窗口内持续没有采集到更小的RTT,那么就会将当前的RTT赋值给最小RTT,说明发生了拥塞,如果只是徒增的RTT,并不会影响BBR的发送速率。
5. 使用新的内核
对于centos6.0
rpm --import
rpm
-Uvh
yum -y --enablerepo=elrepo-kernel install kernel-ml
sed -i 's:default=.*:default=0:g' /etc/grub.conf
对于 CentOS 7
rpm --import
rpm -Uvh
yum --enablerepo=elrepo-kernel install kernel-ml –y
egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'
grub2-set-default 0
针对centos6.0/7.0进行一键安装:
wget -O- | bash