create_block_with_nested_columns_only_args
来替换create_block_with_nested_columns_impl
,原本对100列以上的计数问题,减少为对一个列进行处理,问题得到了显著的改善 。
优化前优化后1230s980s缺页中断的优化解决了上面问题之后,继续来对火焰图进行分析,发现了在数据写入memtable
时,产生了下面的热点:缺页中断 。

文章插图
【Doris开发手记4:倍速性能提升,向量化导入的性能调优实践】这里得先简单了解一下什么是
缺页中断
:
文章插图
如上图所示:CPU对数据进行计算时,会请求获取内存中的数据 。而CPU层级看的内存地址是:
Virtual Address
,需要经过特别的CPU结构MMU进行虚拟地址到物理地址的映射 。而MMU会到TLB(Translation lookaside buffer,记住这个是个缓存),查找对应的虚拟地址到物理地址的映射 。由于操作系统中,内存都是通过页进行管理的,地址都是基于页内存地址的偏移量,所以这个过程变成了查找起始页地址的一个工作 。如果目标虚存空间中的内存页,在物理内存中没有对应的页映射,那么这种情况下,就产生了缺页中断(Page Fault) 。缺页中断显然会带来一些额外的开销:
- 用户态到内核态的切换
- 内核处理缺页错误
内存复用这里大量的内存使用,取址都是对于Column进行操作导致的,所以得尝试从内存分配的源头来解决这个问题 。
解决思路也很简单,既然缺页中断是内存没有映射引起的,那这里就尽量复用之前已经使用过的内存,这样,自然也不会引起缺页中断的问题了,对于TLB的缓存访问也有了更高的亲和度 。
Doris内部本身支持了
ChunkAlloctor
的类来进行内存分配,复用,绑核的逻辑,通过ChunkAlloctor
能大大提升内存申请的效率,对于当前case的缺页中断也能起到规避的效果:
文章插图
通过替换podarray的内存分配的逻辑之后,效果也很符合预期,通过火焰图进行观察,缺页中断的占比大量的减少,性能上也获得了可观的收益 。
优化前优化后980s776s3.一些相关的优化的TODO:
- CSV的数据格式解析:通过4kb的cache 来预取多行数据,利用并SIMD指令集来进一步性能优化
- 缺页中断的优化:部分内存分配拷贝过程之中的page fault的问题, 可以考虑引入大页内存机制来进一步进行缺页中断,页内存cache的优化
这里也特别鸣谢社区的两位同学的code review和分析帮助:@xinyiZzz, @Gabriel
Bingo!请大家期待下一个1.2版本全面向量化的Doris,相信在性能和稳定性上,一定会带给各位惊喜 。
最后,也希望大家多多支持Apache Doris,多多给Doris贡献代码,感恩~~
经验总结扩展阅读
- 驱动开发:内核枚举LoadImage映像回调
- 前端开发日常——CSS动画无限轮播
- git clone开启云上AI开发
- 驱动开发:内核枚举ShadowSSDT基址
- 【番外篇】Rust环境搭建+基础开发入门+Rust与.NET6、C++的基础运算性能比较
- 驱动开发:Win10内核枚举SSDT表基址
- 驱动开发:内核特征码扫描PE代码段
- 驱动开发:内核枚举Minifilter微过滤驱动
- 软件开发工程师工资一般多少 收入高吗
- 软件开发需要学什么 都有哪些课程