我做过效果最好的TCP优化可将吞吐提升10%~20%,性能衰减长尾消除,P99接近中位数,如何做的?把这个秘密作为新年礼物送给穿皮鞋的经理们。
一句话就能说清楚:
- 我用了2000多个(约数,大致就是这个意思)if分支区分对待2000多个IP地址段,对它们分别设置cwnd/pacing_rate,平滑RTT。
if (src == 1.2.3.4) {
cwnd = 1234;
...
} else if (src == 4.3.2.1) {
cwnd = 510;
srtt = srtt - a;
...
} else if (src = 123.123.123.4) {
...
...
...
很low的做法,但管用。
在基调,博睿等第三方测试平台测试,我花了一个周末的时间整理历史数据。我的编程水平很差,无力Python,不会Excel,采用复制粘贴的方式用bash在vim里处理数据,对吞吐率区间进行IP地址聚类,最终得到了2000多个IP段。根据这2000多个段进行定制优化,效果相当棒。
这里没有用到任何高端的技术:
- 没用Python,Excel。
- 没用OO,设计模式。
- 半手工方式处理数据。
- if分支进行定制优化。
- 一个C函数几千行。
- 没用任何高端算法。
- 没用任何复杂算法。
- 小学生都会做。
难点在哪里?难点就是让这一切不再需要人力。这可能就扯到AI算法了,而AI算法我也不懂。
这是一个靠蛮力取胜的例子。你会发现做到这个结果和编程技术没有关系,只需要稍微会一点就可以,甚至都可以不懂网络,我只需要告诉我女儿要怎么把数据挑出来,整理成什么形式,她应该会比我更快完成,因为她会用Python。
回头看我到底做了什么熵减的事情,总结来看就是我描绘了2000多幅相对准确的链路画像,手工干这个事情就是熵减的过程。
传输优化的核心就是链路画像,别的都不重要。
不要指望一个cc算法就能让你的TCP连接加速,cc是用来收敛的,不是用来加速的。你总觉得吞吐低是因为cc算出来的cwnd偏小,于是你加几个,比如简单地加10,甚至加1,这样带来的心理安慰属实有效,因为在常识中,好就是大。但事实可能会让你失望:
- 明明实验室自测时都是正向收益,为什么上线就歇菜呢?
哪里出了问题?
事实上,加几个cwnd,对那些本来吞吐就很高的优秀连接,确实会有正向收益,但是会烂长尾。如果碰上弱网连接,或者恰好的连接,加几个cwnd会加剧拥塞丢包进而加剧重传,这会是一个恶性循环,最终导致烂长尾。整体性能差的原因就是这些烂长尾导致的。
核心问题就是识别这些加几个cwnd就会烂的连接,这才是可上线的实用传输加速的难点!
BBR也不能带来极致优化的效果的原因还是在于没有熵减,换句话说就是信息太少了,信息太少便只能靠猜。缺失的信息便是链路画像。链路画像是一个静态信息,它是对规律进行归纳总结的结果,这是一个熵减的过程。
如何用AI画出链路画像不是本文的重点,而且我也不会,本文的重点是告诉你链路画像是可以画出来的。
没有做过这个行当的可能会不认同我的观点,可能会认为拥塞控制以及传输加速是在连接内持续进行的,所以必须做实时预测。你可能没有get到一个事实:
- 现实世界在大体上是确定的,小范围波动。 世界并不混乱。
以通勤交通为例,固定时间固定的地点的车流量相差无几,其中会有递归的规律,比如每周三下午6点武宁路内环匝道的车流基本相同,和每周日相同时间不同。所以你会发现即便是开车或公交车而不是乘轨道交通,每天下班到家的时间也是相差无几的,大概3到5分钟的误差,偶尔波动,但大体规律(so,不要跟媳妇谎称天天不规律堵车)。
网络流量也一样。背后的动力学还是个人习惯的全局同步,每个人固定的时间会做固定的事,每天晚上7点40分刷抖音的和每天晚上11点看网剧的会带来不同的网络流量,但对于每一类都是确定的,偶尔波动。
要做的就是把这个规律找出来:
- 要么手工做,会很累,会显得自己很忙。
- 找博士帮忙,对AI,建模,数据分析要求高。
理论上可以对所有IPv4地址绘制几十亿幅链路画像。能绘制和如何绘制是两回事,能绘制是因为世界并不混乱,如何绘制需要经理和博士。
…
本文可能会修改,想起来再说吧。
浙江温州皮鞋湿,下雨进水不会胖。