软硬件结合:一个反向优化的案例
一般来说,软件架构需要与硬件架深度契合,这时候才可以充分压榨出硬件的性能。一个老生常谈的例子是,与最简单的python程序相比,矩阵×矩阵算子可以通过循环并行化、访存优化和SIMD等优化,得到63000倍的性能提升。
然而,并不是所有的软件架构优化都可以与硬件架构相匹配。在这儿分享一个软件架构优化导致与CPU硬件架构不匹配的案例。为了降低代码耦合度,提升代码可读性,某业务进行微服务改造,每一个模块拆分成一个库,对应一个so动态库文件,共拆分出来300+动态库(300+MB的代码)。
这个项目的微服务改造十分成功,代码可读性得到了很好的提升。但是,性能下降了很多。
我们发现,iTLB miss造成了性能下降。微服务改造前,iTLB miss为1%-8%;改造后,iTLB miss达到了35+%。主要原因是,so动态库文件众多,且代码在内存中离散分布,需要大量的iTLB entry,而iTLB entry数量有限,远远小于需求量。
这个案例告诉我们,软件架构优化不能随心所欲,要考虑与硬件架构是否匹配。