内存碎片对相机性能的影响
这里说的碎片是物理内存碎片,而且是外部碎片问题。先说下为什么要关注内存碎片,因为手机系统的内存碎片严重会对相机性能带来了如下不好的影响:
1: 首先是相机的内存分配性能会受影响,会变得耗时很多。
具体体现在相机发出大块连续物理内存(order>0)分配需求时,会受阻,会长时间陷入到direct reclaim中。
相机场景下,ion和gpu内存分配, 创建子线程分配内核栈操作等都有这种连续物理内存分配需求。
2: kswapd和kcompactd会异常活跃,会时常跑到cpu大核上跟前台相机进程抢占cpu资源,干扰相机的正常运行。
之前wiki:手机kswapd活跃原因调查里面调研过大部分相机场景下,kswapd频繁活跃原因是:内存碎片化。
为什么内存碎片会带来性能问题
内存碎片从表面上看是正常的
随着系统的运行,页面被分配给各种任务,随着时间的推移内存会逐步碎片化,最终正常运行时间较长的繁忙系统可能只有很少的物理页面是连续的。
由于 Linux 内核支持虚拟内存管理,物理内存碎片通常不是问题,因为在页表的帮助下,物理上分散的内存在虚拟地址空间仍然是连续的 (除非使用大页)。
结论:
有了mmu和虚拟内存的存在,进程用户态的内存分配和管理不太需要关注物理内存碎片,因为我用户态cpu寻址的始终是一片平坦大片连续的虚拟内存。
你有物理内存碎片,我顶多实际访问那片虚拟内存时,一个缺页异常下去只需要分配出一个物理page,然后众多的离散物理page拼接在一起就可以了。
其实性能问题出在内核态
内核态经常会有连续物理内存分配需求, 所以物理内存碎片严重时,这种分配需求就会受阻,就会出性能问题。
主要的分配需求来自于内核线性映射区。
这个区域常见的分配需求有常见的内核kmalloc, slab分配,新创建进程线程的内核栈分配,还有其他的模块,比如文件系统里面不想用vmalloc的那些分配等,这些都会大量发出高阶(order>0)物理内存分配需求。
一旦满足不了需求,内核栈分配耗时会导致相机创建子线程耗时,kmalloc和文件系统里面内存分配耗时会导致相机写文件存图耗时。
为什么要搞线性映射区,为什么这些分配不能像用户态那样搞成离散物理page拼接分配,还非得要搞成连续物理内存分配
首先arm64平台上,线性映射区不仅搞成了,而且空间很大,从从ffff000000000000到ffff7fffffffffff,最大支持128TB的物理地址空间,这样android上肯定可以映射整个物理内存空间了,还不像在32位系统上(物理内存较少的系统除外),只有一部分物理内存可以映射。
线性映射区里面的order>0的物理内存分配,肯定得是连续的。
搞线性映射区和连续物理内存分配的目的:
内核态内存分配性能是系统最看重的
内核态内存页表是系统所有进程共享的,内核态的内存分配属于最基础层面的工作,它的性能是系统最关注的,比用户态内存分配还重要。用户态内存还可以搞成延迟分配,并且内存不用时,可以被交换到zram中,内核态内存不行。
所以为了提升内核态内存分配性能,android/linux系统搞了个线性映射区,有如下好处:
1: 系统刚开机时,内核在初始化时,已经建立好了线性映射区的虚拟内存和物理内存映射关系,当然了,此时物理内存并未真正分配,但是映射关系建好了。
然后在往后的该区域内的物理内存分配时,就不需要

本文探讨了物理内存碎片对外部碎片问题的影响,特别是在相机性能方面。重点介绍了内核态内存分配面临的挑战及其对相机内存分配性能的影响。文章还概述了几种抗内存碎片化的优化方案,包括页面迁移类型优化、Migrate_highatomic的引入、ionpagepool优化等。

2131

被折叠的 条评论
为什么被折叠?



