在上一期中,我们介绍了Linux内核编程环境,在这一期中,我们将通过实例来介绍如何分析Linux内核的补丁。
一、Linux 内核补丁
在“Linux 内核发展史”中,我们简要介绍了 Linux 内核发展中各个版本的主要更新内容。内核的更新主要是通过补丁(patch)来实现的,社区开发人员向内核代码的 git 仓库提交补丁文件,补丁文件中包含了对内核代码的增加、删除和修改情况,记录了内核更新的历史信息。有许多新特性和新功能都是通过补丁文件而添加的。以 Linux 4.19 版内核为例,在“Linux 发展史”一节中我们提到,Linux 4.19 版内核的主要新特性有:
1.增加CAKE network queue management功能,这项更新主要用于解决家庭网关性能问题;
2.保证cGroup的最小I/O延迟;
3.对未来Wi-Fi 6(802.11ax-drafts)的实验性支持;
4.改进overlayfs的内存使用;
5.实验性文件系统EROFS的优化;
6.一个新的异步I/O轮询接口;
7.支持一个intel特性,可以为应用锁定部分CPU 缓存;
8.其他安全和驱动特性。
有关Linux内核4.19版本更新的详细信息,可以在相关网站[1](见文末参考文献)中找到。该网站列举了Linux内核2.5.1版本至今的主要更新历史,并且还在持续更新,例如对于Linux 内核4.x我们可以看到:
进入 Linux 4.19 之后,我们就能看到 Linux 4.19 版所具有的新特性,对于每一个特性都有补丁代码和文档的介绍。以第一个主要特性为例,这个特性主要介绍了一个叫 CAKE(Common Applications Kept Enhanced)的综合队列管理系统,这个系统主要用于提升家庭网关的性能,解决网络边缘的 bufferbloat 问题,在该网站[1]中,我们可以看到对于 CAKE 的特性有如下详细介绍:
从上图可以看出,特性介绍的内容包含了一个对于该特性的简介、对于 CAKE 的介绍文献(包括一篇已发表的论文)和补丁文件的代码(Code 项)。如果读者不清楚 bufferbloat 的含义,可以点击蓝色的 bufferbloat 关键字,于是我们了解到:bufferbloat 是指由于路由器或其他网络设备缓存了过多的数据,从而产生了用户不期望的延迟。为解决这一问题,CAKE 和它之前的解决方案主要是从队列管理入手的,这些方案被广泛用于数百万台计算机上,并将瓶颈链路上由于竞争导致的延迟降低到了 20ms 的量级(由此我们可以看出,被广泛应用的开源项目中所蕴含的创新力量)。
从论文和其他介绍文档中我们可以看出,CAKE 这个系统主要包含以下几层:
1.Shaper:使用一个虚拟时钟来调整包的传输时机(是否延迟传输),从而实现bandwidth shaping。
2.Priority Queue:设置了四个传输类,每一类设置了不同的带宽上界值。如果一个传输类使用的带宽超过了其规定的带宽上界,那么该传输类的优先级就会被降级。
3.Flow Isolation:主要功能是用hash 函数将不同的包分配给不同的队列,并且选择一个队列来服务。CAKE的创新点在于使用了一个8路组相联的hash函数来代替fq_codel中原有的plainhash function,从而解决了原hash函数可能会有的“生日问题”,即当表项占用超过表大小的平方根时hash冲突的概率可能达到50%。
4.Active Queue Management:CAKE修改了原来的CoDel AQM框架,提升了性能。
5.Packet Management:除了以上四个主要层之外对队列和包处理的其它功能。
到这一步为止,我们可以对Linux 4.19内核的CAKE特性有一个初步的了解,但是这个了解是浅层的,还不涉及源码,而且[1]中并没有提供长期维护版本实时更新的所有补丁文件。
二、结语
本期我们通过一个实例介绍了一种 Linux 补丁文件更新的初步分析方法,下一小节中,我们继续根据 CAKE 的实例来介绍补丁文件的源码分析方法。
评论