Linux_Memory_Optimization_DevelopmentGuide-03
3 内存优化
本章将介绍一些通用的优化方法,主要包括:
• 保留内存优化。
• 内核使用内存优化。
• 用户空间使用内存优化。
3.1 保留内存优化
3.1.1 内核静态内存优化
内核静态内存包括内核代码段数据段。优化方法主要有如下几种:
- 关闭不需要的模块,关闭模块下不需要的功能。
在内核根目录,执行scripts/ksize.py vmlinux各个模块的代码段数据段的统计信息。
-
关闭内核调试功能。
-
开启CONFIG_CC_OPTIMIZE_FOR_SIZE 宏,使能-Os编译参数。
-
排查内核占用空间大的符号。
执行nm --size -r vmlinux,可以列出所有符号占用的内存。
- 对于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 分配器。
-
关闭slab 调试宏COFNIG_SLUB_DEBUG 与CONFIG_SLABINFO。
-
尝试使用针对微小的嵌入式系统的SLOB。
3.4 内核模块优化
-
不要开机全部加载,实时加载,实时卸载。
-
将内核模块编译到内核镜像中。
3.5 用户空间使用内存优化
-
使用更小的C 库。
-
使用size 优化的编译选项,比如-Os,-mthumb等。
-
将tmpfs 下大文件保持到flash 上。
-
对于64 位CPU,可以使用32 位的rootfs。
-
使用更小的库或应用程序。比如使用mbedtls,而不是openssl。
-
减少守护进程数量,实时运行/关闭特定程序。
-
将只被一次依赖的动态库转化为静态库。
-
使用dlopen 来控制动态库的生存周期。
-
优化程序源码。