内存优化
3 内存优化
本章将介绍一些通用的优化方法,主要包括:
• 保留内存优化。
• 内核使用内存优化。
• 用户空间使用内存优化。
3.1 保留内存优化
3.1.1 内核静态内存优化
内核静态内存包括内核代码段数据段。优化方法主要有如下几种:
1) 关闭不需要的模块,关闭模块下不需要的功能。
在内核根目录,执行scripts/ksize.py vmlinux各个模块的代码段数据段的统计信息。
2) 关闭内核调试功能。
3) 开启CONFIG_CC_OPTIMIZE_FOR_SIZE 宏,使能-Os编译参数。
4) 排查内核占用空间大的符号。
执行nm --size -r vmlinux,可以列出所有符号占用的内存。
5) 对于cortex-A7 架构,可以开启CONFIG_THUMB2_AVOID_R_ARM_THM_JUMP11 和CONFIG_THUMB2_KERNEL。
说明 开启THUMB 相关配置,会带来性能损失,具体损失根据实际平台典型应用场景进行测试。
3.1.2 DTB 内存优化
Tina 内核中提供的DTS 一般来说比较全面,对于特定的方案,往往用不了那么多,可以针对性的删除一些节点。
3.1.3 TEE 内存优化
Tina 中一些平台,会默认配置一些TEE 保留内存。对于特定方案来说,很有可能用不了那么多内存。TEE 默认保留配置与bl31.bin、optee-${CHIP}.bin是配套的,
因此修改时需要注意同步更新。
比如R329 默认配置了8M 内存(SHM 2M,ATF 1M,OS 1M,TA 4M),但是对于非安全方案来说,只需要保留ATF 就够了;对于不使用TA 的安全方案,只需要保留
ATF 与OS 的内存就可以了。
3.2 内核使用内存优化
由2.5.2 小节可知,内核使用的内存包括Slab、PageTable、KernelStack、CmaUsed、Vmalloc 等。
3.3 Slab 优化
目前Tina 上大部分方案默认选用的是SLUB 分配器。
1) 关闭slab 调试宏COFNIG_SLUB_DEBUG 与CONFIG_SLABINFO。
2) 尝试使用针对微小的嵌入式系统的SLOB。
3.4 内核模块优化
1) 不要开机全部加载,实时加载,实时卸载。
2) 将内核模块编译到内核镜像中。
3.5 用户空间使用内存优化
1) 使用更小的C 库。
2) 使用size 优化的编译选项,比如-Os,-mthumb等。
3) 将tmpfs 下大文件保持到flash 上。
4) 对于64 位CPU,可以使用32 位的rootfs。
5) 使用更小的库或应用程序。比如使用mbedtls,而不是openssl。
6) 减少守护进程数量,实时运行/关闭特定程序。
7) 将只被一次依赖的动态库转化为静态库。
8) 使用dlopen 来控制动态库的生存周期。
9) 优化程序源码。