随着技术的日新月异,嵌入式软件产品也逐渐往更高端, 运行更流畅方向发展。正常我们目前的手机产品,常见的基本都是32G,16G,已经很难在看到1G的内存了。即使如此我们还是会面临内存不够用导致系统慢的结果。本文将列出几个我比较熟悉的内存分析的工具或者方法,读者不妨可以尝试使用以下。
1. system monitor图像化界面
在ubuntu左上角点击search your computerà输入System MonitoràResources,便可以看到目前内存的使用情况。
2. free
free命令一般显示的是系统使用和空闲的内存.可以使用free -help查看使用方法
从上图可以看到主要包含Mem和Swap,其中total表示全部的内存大小,used表示已经使用的内存大小, free表示剩下可以使用的内存大小,shared表示共享内存大小,一般用于进程间通信的, buffer是用于为块设备做缓存的,cache一般是指page cache用户缓存打开的文件的(可以提高文件的访问速度). 当系统内存短缺时会进行内存回收,其回收的部分主要在buffer/cache,但是这部分也不是全部可以回收的,比如共享的内存段,ram fs是不可以回收的,所以availabe 约等于free +buffer/cache.
3. top
top命令基本的信息描述在下图中已标出,其中用红色框标出的这里重点说明一下.S表示的是进程的状态, S表示Sleeping, R表示Running, D表示不可中断的睡眠状态,T表示trace跟踪状态,Z表示Zombie状态. CPU和MEM表示CPU和MEM的占用比.
处理之外还有一些交互的命令,输入M将重排MEM按照从大到小,输入P重排CPU从大到小,输入T按照进程运行的时间排序,输入m显示内存的柱状图,输入F/f可以配置输出信息.
4 vmstat
具体的信息可以参考下图中的说明,但是如果要循环看到如下的信息可以使用比如vmstat 2 10,表示2s抓取一次共抓取10次.
5. cat /proc/slabinfo 或者slabtop
就下图而言,Ojects包含于slabs,slabs包含于caches,所以从归属关系来说Caches是最大的。从图中可以得到目前系统的slab所消耗的内存大概为153900K,在系统内存吃掉非常多的情况下我们便可以从其中查看是否有异常。
6. pmap
细心的朋友可能会发现,上述的种种工具都是从系统的角度出发的,那么如果想查看某一个进程所吃掉的内存,该用什么工具?这时候你就可以考虑使用pmap了,使用方法为:
pmap PID
下面我用一个简单的测试程序来示例:
当然除此之外还可以加上一些参数可以显示更加详细的信息,可以使用pmap -x PID or pmap -X PID
7. dmesg
默认情况下dmesg显示的log的时间戳是开机的时间,有的时候定位问题需要找到出问题时的点,着就会给研发工程师们带来一定的困惑,这里提供几个小技巧,或许会有帮助.
可以看到,dmesg -T显示的时间戳为系统时间,dmesg -Td显示系统时间并且会给出两天相邻log的差值.
下图表示的是系统的具体内存系统,有一个node,4个zone以及地址空间范围.其中包含2097005个page= 2097005 * 4KB = 8GB,正式测试电脑的内存大小.
其中的memap是用于存放struct page的,在后续的文章中会详细介绍.
8. cat /proc/meminfo