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,相信在性能和稳定性上,一定会带给各位惊喜 。
【Doris开发手记4:倍速性能提升,向量化导入的性能调优实践】最后 , 也希望大家多多支持Apache Doris,多多给Doris贡献代码 , 感恩~~
推荐阅读
- 驱动开发:内核枚举LoadImage映像回调
- 前端开发日常——CSS动画无限轮播
- git clone开启云上AI开发
- 驱动开发:内核枚举ShadowSSDT基址
- 【番外篇】Rust环境搭建+基础开发入门+Rust与.NET6、C++的基础运算性能比较
- 驱动开发:Win10内核枚举SSDT表基址
- 驱动开发:内核特征码扫描PE代码段
- 驱动开发:内核枚举Minifilter微过滤驱动
- Vue3 JS 与 SCSS 变量相互使用
- 24 Node.js躬行记——低代码