内存统计是资源评估的重要方面,本文从进程和系统两个视角讨论smem和free两个常用的内存统计工具,Linux进程虚拟地址空间和物理内存的关系如下。
进程视角
进程内存消耗通常使用VSS、RSS、PSS、USS来表征,需要注意的是,进程的这些指标的统计是不包括内核地址空间的。
VSS = 1 + 2 + 3 virtual set size,进程的虚拟地址空间都是通过 task_struct->mm_struct ->mmap->vm_area_struct 来管理其虚拟地址空间,每一个VMA都对应一个Section,所有的VMA对应到进程的内存消5就是VSS,以下两点需要注意:
- VSS不是真的体现进程物理内存的消耗,而是虚拟地址空间的消耗。
- 对于共享库来说,代码段只有一份,数据段是数据调用进程的,每个进程一份
可以通过如下方式查看VSS(VSZ字段)
$ps aux|more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 185552 5512 ? Ss 2月16 0:01 /sbin/init noprompt persistent splash root 2 0.0 0.0 0 0 ? S 2月16 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 2月16 0:01 [ksoftirqd/0]
RSS = 4 + 5 + 6,resident set size,只进程实际占用的内存,对于Lib,其所占内存完整的体现在每一个调用的进程RSS中
PSS = 4/3 + 5/2 + 6, proportional set size,同样是体现进程实际占用的内存,不同是对于多进程公共的Lib,按照比例将其占用内存摊派到每一个进程的PSS中
USS = 6 unique set size ,进程独占的内存,比如进程的Heap,分析内存泄漏时通常使用USS。
可以通过如下方式查看USS、PSS、RSS,smem工具通过读取**/proc//smaps和maps**两个文件整理输入如下。
$smem -P ^chromium PID User Command Swap USS PSS RSS 16317 jiang /usr/lib/chromium-browser/c 0 164 2022 13764
系统视角
$smem PID User Command Swap USS PSS RSS 3173 jiang /bin/sh -c /usr/lib/x86_64- 0 92 100 1496 7228 jiang /usr/lib/vmware/bin/thnucln 0 64 187 1600
smem还可以生成图像化界面
$smem --pie=command
$smem --bar=command
除了smem,借助**/proc/meminfo**的free也是常用的内存统计工具
$free total used free shared buff/cache available Mem: 20441288 3178084 620712 11664236 16642492 5170568 Swap: 12463100 4748 12458352
在不使用选项的情况下,free输出的单位是KB,used表示系统已经使用的内存,包含其后的buffers和cached的内存,buffers/cached是Page Cache的两种形式,buffers指缓存了裸设备的Page Cache,cached指缓存的文件数据的Page Cache,二者都是Page Cache,只是缓存的background不同。在Ubuntu 16.04使用的free已经将二者合一,并加入了一个系统评估的可供应用程序使用的内存: available,这个参数综合考虑了空闲内存和可轻易释放出的内存等因素。