Linux 7.0内核的核心计时器改动在UDP接收网络压力测试中取得了相当显著的性能提升,这得益于对一项编译器优化未能处理的函数进行了手动内联。
已合并至Linux 7.0的计时器改动包括在网络热点代码路径中手动内联timecounter_cyc2time()代码。最终在100Gb网卡接口的UDP接收压力测试中实现了12%的性能提升。之所以选择手动内联这两个函数,是因为基于编译器反馈的定向优化(FDO)、链接时优化(LTO)或性能导向优化(PGO)均无法解决此问题——网络驱动程序通常以内核模块形式发布而非内置组件。
谷歌的Eric Dumazet在提交优化补丁时解释道:
"新型网络传输协议要求网卡驱动程序获取所有传入数据包(可能还包括所有传出数据包)的硬件时间戳。
即将推出的'Swift拥塞控制'协议就是一个典型用例,该协议被TCP传输层采用,也是timecounter_cyc2time()需求的主要来源。这意味着在繁忙服务器上,timecounter_cyc2time()每秒可能被调用超过1亿次。
在100Gbit网卡的UDP接收压力测试中,内联timecounter_cyc2time()可带来12%的性能提升。
值得注意的是,FDO、LTO、PGO等优化手段对此场景均无法产生显著效果,推测原因是网卡驱动几乎都以模块形式独立发布。"
该代码已作为计时器/核心变更的一部分合并,同时引入的另一项优化针对禁用追踪点时的时钟周期依赖检查,这有助于改善进出空闲状态时时钟管理代码热点路径的执行效率。
恰逢Linux 7.0内核发布之际,这些持续汇入的改进令人振奋。