如何节省系统内存
目的:1、系统空闲内存尽可能多,这样可以在系统中同时运行多个进程; 1)减少常驻内存(守护进程)进程的数量;2)对于常驻内存的进程,优化内存使用; 2、系统经过长时间运行后,系统空闲内存还保持比较高的水平,这样系统性能不会下降太厉害;
查看内存使用情况 free cat /proc/meminfo df:查看各分区所占内存空间的大小
查看进程使用内存 top -p {pid} cat /proc/{pid}/memmap 虚拟内存与物理内存映射表 cat /proc/{pid}/maps 进程所有用到的内存分配
内存回收机制 kswapd内核守护线程 dirty page:代码段所占用物理内存可以全部回收,堆、栈所占用物理内存全部不能回收,数据段所占用物理内存部分可以;
进程内存优化
内存的跟踪 mtrace
memory检查工具:dmalloc/valgrind(检测无效内存分配、访问未初始化内存、内存泄漏等)
栈空间优化 alloca:在栈中分配内存 1、尽量避免在栈空间申请大量内存; 2、尽量避免使用递归函数;
ELF文件 file xxx —》 查看文件格式
binutils工具包 —》 strings/strip/nm/size/readelf/objdump/ar/addr2line
readelf -a xxx
strip xxx 删除与运行无关的节 strip --remove-section=.comment xxx 删除xxx文件.comment段
nm -f sysv xxx 查看符号信息
loader加载bss和data段区别如下: 1、data初始值在data节,需要占用文件大小,当访问这些变量时,便会触发缺页故障,将文件中对应的初始值加载到内存中,完成初始化; 2、bss不占用文件大小,loader只需要将这段内存映射到一个全0的页面即可,这样.bss节并不占据ELF文件的空间;
数据段的优化: 1、尽可能减少全局变量和静态变量; 2、将只读的全局变量,加上const,将其转移到代码段; 3、不要在头文件中定义变量; 4、TODO
代码段的优化: 1、删除冗余代码;-wunused检查无用代码,-Wunreachable-code检查从未使用的代码
动态库 Todo
线程 进程拥有自己的地址空间,而线程则是完全共享的; 线程之间的数据段是完全共享的,任何一个线程都可以访问进程的全局变量;堆空间是线程共享的,每个线程都有自己的栈空间; 线程退出后,进程需要调用pthread_join结束,否则栈内存就不会释放
ulimit -a ulimit -s 16384 设置进程栈空间大小
pthread_attr_setstacksize 设置线程栈空间大小,注意设置合理大小,防止栈溢出导致线程终止;
栈的回溯 AAPCS:子程序间调用规范 ATPCS :ARM过程调用标准(寄存器使用、数据栈、参数传递规则)
编译选项:-mapcs-frame形成标准的栈帧
系统内存优化步骤 一)在某个时间点,空闲内存太少; 1)查看tmpfs分区,是否有不再使用,但没有删除的文件; 2)统计所有进程占用的dirty page,对那些占有大量的dirty page的Top10进程,需要做内存优化; 3)减少守护进程的数量; 4)要求每个team,按照前面提的方法优化自己的内存; 二)随着时间的增长,空闲内存越来越少; 1)要求所有守护进程,检查内存泄漏的问题; 2)对于某些常用操作,做专项测试,检查是否有内存泄漏; 3)对系统进行日常使用随机测试,模拟用户使用,连续运行若干天,查看各个进程内存使用情况,如果某个进程使用内存大量增长,检查该进程内存泄漏;
如何加快运行速度
性能如何评估 灵魂拷问:性能KPI是多少?当前性能多少?优化目标多少?程序性能瓶颈在哪?
cat /proc/stat CPU运行时间统计信息 CPU 5116 0 7801 249195 60 41 55 user(51116):从系统启动开始累计到当前时刻,用户态的CPU时间; nice(0):从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间; system(7801):从系统启动开始累计到当前时刻,内核所占用的CPU时间; idle(259195):从系统启动开始累计到当前时刻,出硬盘IO等待时间以外其他等待时间; iowait(60):从系统启动开始累计到当前时刻,硬盘IO等待时间; irq(41):从系统启动开始累计到当前时刻,硬中断时间; softirq(55),从系统启动开始累计到当前时刻,软中断时间;
cat /proc/loadavg 检查当前系统负载情况;
性能评估工具
gprof —>统计函数调用次数和调用时间
OProfile —》查找热点函数; http://oprofile.sourceforge.net/news/ http://people.redhat.com/wcohen/Oprofile.pdf
KFT and Gprof 需要重新编译代码,都用到了gcc里面的finstrument-functions选项,编译时在函数入口、出口加回调函数,而且inline函数也会改成非inline的
程序的优化: 1)算法和数据结构优化;2)编译器优化;3)代码优化;4)硬加速;
性能优化: 1)系统层次;2)算法层次;3)代码层次;
参数资料
参考书籍《嵌入式linux性能详解-史子旺》 blog:http://blog.chinaunix.net/30686/
|