2010 年代掀起的移动计算革命开启了智能手机全民普及的时代,对社会产生了深远的影响。在人均拥有多部智能设备的今天,各行业都在谋求数字化转型,以适应这一全新的技术图景。数字转型的浪潮反过来进一步推动着 IT 产业向着开源、创新和多样化的方向发展,正是在这一背景下,鲲鹏计算产业开始展露头角。如今,鲲鹏计算产业已经形成了包括鲲鹏社区、openEuler 操作系统、openGauss 数据库等技术生态在内的跨领域、跨行业技术体系,并在广大合作伙伴、开发者与用户群体的推动下,成为 IT 行业开源创新的重要源泉。
鼓励开发者参与鲲鹏社区,与社区共同成长,是鲲鹏计算产业高速成长的秘诀。在鲲鹏社区丰富多彩的开发者使能活动中,鲲鹏应用创新大赛是最受关注、参与度最高的活动之一。鲲鹏应用创新大赛是面向全国开发者的顶级赛事,旨在激发行业应用创新、加速产业融合、促进人才培养,吸引全产业开发者共同打造鲲鹏全栈解决方案。日前,第四届鲲鹏应用创新大赛全国总决赛在四川成都圆满落幕。经过 6 个月的激烈角逐,大赛最终从 1600 多支参赛队伍中评选出 13 个金奖、16 个银奖和 19 个铜奖。在大赛高校赛事的“openEuler 开源应用创新”赛道中,来自北京大学的“好像有点不”团队凭借基于 openEuler 操作系统网络开源项目的 Cubic 算法实现改进作品,赢得了专家评委的认可。
一、金奖作品青胜于蓝:算法小升级,收获大回报
(一)项目背景:Reno 算法缺陷,导致弱网性能不足
在网络数据传输过程中,数据收发两端经常会出现收发速率不同步的问题,这时就需要通过数据拥塞控制算法来解决问题,拥塞控制算法也是网络协议栈中的关键组件。作为支持嵌入式设备的跨平台操作系统,openEuler 一直使用开源社区自主研发的 Gazelle 用户态网络协议栈。该协议栈使用了轻量级网络传输协议 LwIP 来保障极高的 IO 性能和较低的性能开销,能够显著提升网络传输性能。然而,LwIP 使用的拥塞控制算法 Reno 存在一定缺陷,在网络条件较差,延迟变化剧烈或丢包频繁时,Reno 算法常常无法准确识别和适应拥塞情况,导致性能下降。
针对这一问题,北京大学参赛团队选择了对 LwIP 协议进行改进,在已有 TCP 协议栈的基础上实现业界主流的 Cubic 拥塞控制算法,提升高延迟复杂网络环境下的数据传输效率。
(二)整体设计:Cubic 算法接入 LwIP,升级网络协议栈
北京大学团队的整体思路是将拥塞算法从 LwIP 的 TCP 处理流程中解耦,从而将 Reno 替换为 Cubic 算法。团队为协议定义了拥塞控制算法接口,并在 TCP 控制块和描述 TCP 数据段的结构体中添加了新字段来帮助实现拥塞算法,最后调整了 TCP 处理流程中的拥塞控制代码,从而将 Cubic 算法接入了 LwIP 的 TCP 协议。
(三)算法实现:Cubic + SACK 双管齐下提升弱网性能
相比 LwIP 当前使用的 Reno 算法,Cubic 算法使用了一个三次函数作为窗口调整的增长曲线,在网络数据拥塞发生后恢复速度更快,且 Cubic 算法的窗口增长函数仅取决于发生拥塞事件的时间,完全独立于网络延迟,因此更容易应对延迟剧烈变化的场景。
团队参照了 Cubic 算法论文中的描述和 Linux 6.1 内核中的 Cubic 算法实现编写了具体的代码,并在此基础上加入了多项优化,避免拥塞窗口增长过快导致大量丢包。
同时,团队发现 LwIP 只实现了接收端的 SACK 机制,导致一定程度的虚假数据重新传输现象,使丢包数据不断重新发送。