码迷,mamicode.com
首页 > 系统相关 > 详细

嵌入式Linux用户空间内存优化

时间:2021-01-04 11:05:48      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:函数调用   配置   嵌入式   highlight   变量   files   获得   最好   local   

(都是自己敲出来的,想到哪里写到哪里,面对的是有一定基础的朋友,有问题、建议的朋友可以留言,我不定期答疑;可以随便转发,只求更多人知道)

(至2020已工作10年了,一直在忙着分析问题、解决问题,现在每解决一个问题就写一篇,分享给有需要的人)

继上一篇《Linux Userspace Kernelspace内存分布》之后,在分析一下内存优化的方法。

https://www.cnblogs.com/tangtangworld/p/11738090.html

后面还有一篇进程空内存使用分布进一步分析的方法,看后面有没有时间,这几天被几个Kernel Panic绊住了,在分析net子系统的代码。(MTK的SDK到处是坑)

 

通过对/proc/meminfo的分析,初步看去可以优化的地方不多:

1,tmpfs:/tmp下文件数目: Active(anon), Inactive(anon)

  • 先控制/tmp的大小,我们某产品的/tmp总大小最好情况下在19MB,平均在15MB。
  • 对每个文件分析之后,控制在6MB大小,总过获得13MB的内存,对总共只有125/256MB的产品来说还是很多的。
  • 记住要引入监控机制:通过Monitor来监控tmp下文件的总大小,如果超过6MB,就记录日志,便于跟踪定位。

2,各个进程打开的文件:Active(file), Inactive(file)

  • 很多文件(配置文件)打开只是为了获取数据,用完及时关闭。
  • 对文件的使用基于流操作,不要全部读到内存在进行处理。
  • 系统启动完成之后进行drop cache操作,把使用完毕的文件从cache里面清掉。sync && echo 3 >/proc/sys/vm/drop_caches

3,进程:进程的堆、栈:Active(anon), Inactive(anon)

  分析进程中内存的分布,尝试回答下面的问题,之后对进程的内存进行优化。注意要对业务比较熟悉,内存优化就是减少不需要的操作,通过优化数据结构和算法来达到目的。(后面可能会写几篇关于数据结构和算法的心得)

  • 代码太多?(充斥着很多没有用到的函数,还没有舍得删除掉)
  • 静态、全局变量多?(很多变量历史原因不会再使用,或者长度远超过实际最大使用数)
  • 动态申请得内存比较多?(申请了内存,常驻在进程中,通过优化流程、算法可以及时释放掉)
  • 栈内存用得比较多?(函数调用层级太深,太多、太大的局部变量,可能导致栈空间用完,默认Linux最大栈空间是16MB)
  • 某一个库中消耗的内存比较多?(库中对内存的不合理使用)

下面以bash为例进行解说,首先看到的是size命令的输出:

   text    data     bss     dec     hex filename
1127387   47356   40056 1214799  12894f /usr/bin/bash

 通过size命令可以看到bash的代码段、数据段、bss段的大小。

  • data是指全局变量或者静态变量,已经被初始化为非0;data段比较大,会导致ELF文件较大,对image size比较敏感的嵌入式系统,需要注意控制data段的大小。
  • bss段是未被初始化的全局变量或静态变量,默认被初始化为0。

 进程的内存分为代码段、数据段、BSS段、heap、内存映射、stack,在0~3GB的虚拟地址空间上,依次由低地址到高地址非连续排列。

  • 通过看/proc/$pid/maps来分析进程内存的分布,0x55d518a4000开始的是代码段、data段、BSS段,map成只读、可执行、可写三部分。
  • 紧接着是堆内存的分布
  • 接下来是每个库的分布
  • 然后是栈的空间
root@VirtualBox# cat /proc/129473/maps
558d518a4000-558d518d1000 r--p 00000000 08:05 1835663                    /usr/bin/bash
558d518d1000-558d51982000 r-xp 0002d000 08:05 1835663                    /usr/bin/bash
558d51982000-558d519b9000 r--p 000de000 08:05 1835663                    /usr/bin/bash
558d519b9000-558d519bd000 r--p 00114000 08:05 1835663                    /usr/bin/bash
558d519bd000-558d519c6000 rw-p 00118000 08:05 1835663                    /usr/bin/bash
558d519c6000-558d519d0000 rw-p 00000000 00:00 0
558d51b9c000-558d51c41000 rw-p 00000000 00:00 0                          [heap]
7f971e273000-7f971e294000 rw-p 00000000 00:00 0
7f971e294000-7f971e297000 r--p 00000000 08:05 1837196                    /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so
7f971e297000-7f971e29e000 r-xp 00003000 08:05 1837196                    /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so
7f971e29e000-7f971e2a0000 r--p 0000a000 08:05 1837196                    /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so
7f971e2a0000-7f971e2a1000 r--p 0000b000 08:05 1837196                    /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so
7f971e2a1000-7f971e2a2000 rw-p 0000c000 08:05 1837196                    /usr/lib/x86_64-linux-gnu/libnss_files-2.31.so
7f971e2a2000-7f971e2a8000 rw-p 00000000 00:00 0
7f971e2bb000-7f971eb2b000 r--p 00000000 08:05 1837771                    /usr/lib/locale/locale-archive
7f971eb2b000-7f971eb2e000 rw-p 00000000 00:00 0
7f971eb2e000-7f971eb53000 r--p 00000000 08:05 1837188                    /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f971eb53000-7f971eccb000 r-xp 00025000 08:05 1837188                    /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f971eccb000-7f971ed15000 r--p 0019d000 08:05 1837188                    /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f971ed15000-7f971ed16000 ---p 001e7000 08:05 1837188                    /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f971ed16000-7f971ed19000 r--p 001e7000 08:05 1837188                    /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f971ed19000-7f971ed1c000 rw-p 001ea000 08:05 1837188                    /usr/lib/x86_64-linux-gnu/libc-2.31.so
7f971ed1c000-7f971ed20000 rw-p 00000000 00:00 0
7f971ed20000-7f971ed21000 r--p 00000000 08:05 1837189                    /usr/lib/x86_64-linux-gnu/libdl-2.31.so
7f971ed21000-7f971ed23000 r-xp 00001000 08:05 1837189                    /usr/lib/x86_64-linux-gnu/libdl-2.31.so
7f971ed23000-7f971ed24000 r--p 00003000 08:05 1837189                    /usr/lib/x86_64-linux-gnu/libdl-2.31.so
7f971ed24000-7f971ed25000 r--p 00003000 08:05 1837189                    /usr/lib/x86_64-linux-gnu/libdl-2.31.so
7f971ed25000-7f971ed26000 rw-p 00004000 08:05 1837189                    /usr/lib/x86_64-linux-gnu/libdl-2.31.so
7f971ed26000-7f971ed34000 r--p 00000000 08:05 1841972                    /usr/lib/x86_64-linux-gnu/libtinfo.so.6.2
7f971ed34000-7f971ed43000 r-xp 0000e000 08:05 1841972                    /usr/lib/x86_64-linux-gnu/libtinfo.so.6.2
7f971ed43000-7f971ed51000 r--p 0001d000 08:05 1841972                    /usr/lib/x86_64-linux-gnu/libtinfo.so.6.2
7f971ed51000-7f971ed55000 r--p 0002a000 08:05 1841972                    /usr/lib/x86_64-linux-gnu/libtinfo.so.6.2
7f971ed55000-7f971ed56000 rw-p 0002e000 08:05 1841972                    /usr/lib/x86_64-linux-gnu/libtinfo.so.6.2
7f971ed56000-7f971ed58000 rw-p 00000000 00:00 0
7f971ed64000-7f971ed6b000 r--s 00000000 08:05 2498817                    /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
7f971ed6b000-7f971ed6c000 r--p 00000000 08:05 1837183                    /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f971ed6c000-7f971ed8f000 r-xp 00001000 08:05 1837183                    /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f971ed8f000-7f971ed97000 r--p 00024000 08:05 1837183                    /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f971ed98000-7f971ed99000 r--p 0002c000 08:05 1837183                    /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f971ed99000-7f971ed9a000 rw-p 0002d000 08:05 1837183                    /usr/lib/x86_64-linux-gnu/ld-2.31.so
7f971ed9a000-7f971ed9b000 rw-p 00000000 00:00 0
7fff0c34e000-7fff0c36f000 rw-p 00000000 00:00 0                          [stack]
7fff0c395000-7fff0c398000 r--p 00000000 00:00 0                          [vvar]
7fff0c398000-7fff0c399000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0                  [vsyscall]

  

//ToDo增加一个案例,分析内存和优化

 

嵌入式Linux用户空间内存优化

标签:函数调用   配置   嵌入式   highlight   变量   files   获得   最好   local   

原文地址:https://www.cnblogs.com/tangtangworld/p/14214037.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!