在 也看linux内存去哪儿了 篇中大致了解了linux内存大的分类,同时为了精确计算,在 精确计算rss使用值 篇中又使用简单的shell 计算将RSS项内存做了计算。本篇继续对内存的使用做一个探讨,本篇着重推荐一个工具smem 。smem 是一个python写的内存查看工具,源代码只有700行不到。功能却非常强大,其可以按进程、映射和用户列表显示内存使用情况,并支持正则匹配;而且可以百分比形式显示;同时支持使用matplotlib以图形的方式展示。
一、安装
smem程序的官网为:http://www.selenic.com/smem ,可以直接从官网下载tar.gz包,下载下来之后就可以支持复制其中的smem程序使用。如下:
# cd /tmp/ # wget http://www.selenic.com/smem/download/smem-1.4.tar.gz # tar xvf smem-1.4.tar.gz # cp /tmp/smem-1.4/smem /usr/local/bin/ # chmod +x /usr/local/bin/smem
该压缩包内还其其他可用文件:
[root@361way smem-1.4]# tree . ├── COPYING ├── smem ├── smem.8 └── smemcap.c
其中smem程序就是我们主要介绍的程序,smemcap.c是一个数据捕获程序的源文件,其支持要一台机器上捕获包后在另一台上进行分析,这个后面会提到。smem.8为man帮助文件,可以使用下列命令查看:
# groff -Tascii -man smem.8
也可以将该文件压缩后放到man目录,以后就可以通过man smem查看帮助文档了。
# gzip smem.8 # cp smem.8.gz /usr/share/man/man8
二、参数
smem相关参数如下:
# report -m, --mappings Report memory usage by mapping. -u, --users Report memory usage by user. -w, --system Report systemwide memory usage summary. # Filter -M MAPFILTER, --mapfilter=MAPFILTER Mapping filter regular expression. -P PROCESSFILTER, --processfilter=PROCESSFILTER Process filter regular expression. -U USERFILTER, --userfilter=USERFILTER User filter regular expression. # 输出格式 -c COLUMNS, --columns=COLUMNS Columns to show. -H, --no-header Disable header line. -k, --abbreviate Show unit suffixes. -n, --numeric Show numeric user IDs instead of usernames. -p, --percent Show percentages. -r, --reverse Reverse sort. -s SORT, --sort=SORT Field to sort on. -t, --totals Show totals. # 输出图形 --bar=BAR Show bar graph. --pie=PIE Show pie graph.
在输出结果中常见的有几个参数USS、PSS、RSS ,其代表的意义如下:
RSS : resident set size (ignoring sharing) PSS : proportional set size (including sharing) USS : unique set size VSS : virtual set size (total virtual memory mapped)
USS代表非共享内存被报告为进程独自占用的物理内存,USS + 进程的共享内存使用比例 = 实际使用的物理内存(PSS)。
三、输出示例
常用的是使用-u查看用户的内存使用情况、-w查看内存大的分类情况、-p以百分比形式查看。
注意-w选面,上面使用-R与不使用-R的区别,我建议使用选项-R REALMEM,这个值是指物理内存数量。这让smem可以在整个系统(-w)的输出中发现固件/硬件所耗用的内存数量。如果提供该选项,它还可以用作百分比所用到的总内存大小。
使用-t 会汇总统计,也可以使用-r进行反向排序,将使用内存最大的进程放在最上面。使用正则过虑显示ntp和www用户内存使用情况的示例如下:
其他常见的用法如下:
Show basic process information | smem |
Show library-oriented view | smem -m |
Show user-oriented view | smem -u |
Show system view | smem -R 4G -K /path/to/vmlinux -w |
Show totals and percentages | smem -t -p |
Show different columns | smem -c “name user pss” |
Sort by reverse RSS | smem -s rss -r |
Show processes filtered by mapping | smem -M libxml |
Show mappings filtered by process | smem -m -P [e]volution |
Read data from capture tarball | smem –source capture.tar.gz |
Show a bar chart labeled by pid | smem –bar pid -c “pss uss” |
Show a pie chart of RSS labeled by name | smem –pie name -s rss |
四、使用图形显示
使用图形显示时,需要借助matplotlib库,可以使用yum -y install python-matplotlib安装该库。
显示带“pss”和“uss”这两列的条形图(命令smem –bar pid -c “pss uss” ),显示效果如下图:
创建饼形图,显示在运行系统上以“k”开头的进程(命令:smem -P ‘^k’ –pie=name ):
五、smemcap抓取与分析
除此之外,smem还支持通过将其他主机的内存信息捕获放到文件中,将该文件到复制某台主机上进行分析。最上面提到的smemcap.c源文件就是做这个用的,使用gcc编译成二进制文件即可。
1. Compile smemcap.c for your target system. 2. Run smemcap on the target system and save the output: smemcap > memorycapture.tar 3. Copy the output to another machine and run smem on it: smem -S memorycapture.tar