Doris开发手记4:倍速性能提升,向量化导入的性能调优实践( 二 )

Virtual Address,需要经过特别的CPU结构MMU进行虚拟地址到物理地址的映射 。而MMU会到TLB(Translation lookaside buffer,记住这个是个缓存),查找对应的虚拟地址到物理地址的映射 。由于操作系统中,内存都是通过页进行管理的 , 地址都是基于页内存地址的偏移量,所以这个过程变成了查找起始页地址的一个工作 。如果目标虚存空间中的内存页 , 在物理内存中没有对应的页映射,那么这种情况下,就产生了缺页中断(Page Fault) 。
缺页中断显然会带来一些额外的开销:

  • 用户态到内核态的切换
  • 内核处理缺页错误
所以 , 频繁的出现缺页中断,对导入的性能产生了不利的影响,需要尝试解决它 。
内存复用这里大量的内存使用,取址都是对于Column进行操作导致的 , 所以得尝试从内存分配的源头来解决这个问题 。
解决思路也很简单,既然缺页中断是内存没有映射引起的 , 那这里就尽量复用之前已经使用过的内存,这样,自然也不会引起缺页中断的问题了,对于TLB的缓存访问也有了更高的亲和度 。
Doris内部本身支持了ChunkAlloctor的类来进行内存分配 , 复用,绑核的逻辑 , 通过ChunkAlloctor能大大提升内存申请的效率,对于当前case的缺页中断也能起到规避的效果:
Doris开发手记4:倍速性能提升,向量化导入的性能调优实践

文章插图
通过替换podarray的内存分配的逻辑之后 , 效果也很符合预期,通过火焰图进行观察 , 缺页中断的占比大量的减少,性能上也获得了可观的收益 。
优化前优化后980s776s3.一些相关的优化的TODO:
  • CSV的数据格式解析:通过4kb的cache 来预取多行数据,利用并SIMD指令集来进一步性能优化
  • 缺页中断的优化:部分内存分配拷贝过程之中的page fault的问题, 可以考虑引入大页内存机制来进一步进行缺页中断,页内存cache的优化
4.小结当然,笔者进行的向量化导入工作只是Doris向量化导入中的一部分工作 。很多社区的同学也深入参与了相关工作,在当前的基础上又有得到了更为理想的性能表现 。总之,性能优化的工作是永无止境的.
这里也特别鸣谢社区的两位同学的code review和分析帮助:@xinyiZzz, @Gabriel
Bingo!请大家期待下一个1.2版本全面向量化的Doris,相信在性能和稳定性上,一定会带给各位惊喜 。
【Doris开发手记4:倍速性能提升,向量化导入的性能调优实践】最后 , 也希望大家多多支持Apache Doris,多多给Doris贡献代码 , 感恩~~

推荐阅读