也看linux内存去哪儿了 篇中大致了解了linux内存大的分类,同时为了精确计算,在 精确计算rss使用值 篇中又使用简单的shell 计算将RSS项内存做了计算。本篇继续对内存的使用做一个探讨,本篇着重推荐一个工具smem 。smem 是一个python写的内存查看工具,源代码只有700行不到。功能却非常强大,其可以按进程、映射和用户列表显示内存使用情况,并支持正则匹配;而且可以百分比形式显示;同时支持使用matplotlib以图形的方式展示。

一、安装

smem程序的官网为:http://www.selenic.com/smem ,可以直接从官网下载tar.gz包,下载下来之后就可以支持复制其中的smem程序使用。如下:

1# cd /tmp/
2# wget http://www.selenic.com/smem/download/smem-1.4.tar.gz
3# tar xvf smem-1.4.tar.gz
4# cp /tmp/smem-1.4/smem /usr/local/bin/
5# chmod +x /usr/local/bin/smem

该压缩包内还其其他可用文件:

1[root@361way smem-1.4]# tree
2.
3├── COPYING
4├── smem
5├── smem.8
6└── smemcap.c

其中smem程序就是我们主要介绍的程序,smemcap.c是一个数据捕获程序的源文件,其支持要一台机器上捕获包后在另一台上进行分析,这个后面会提到。smem.8为man帮助文件,可以使用下列命令查看:# groff -Tascii -man smem.8,也可以将该文件压缩后放到man目录,以后就可以通过man smem查看帮助文档了。

1# gzip smem.8
2# cp smem.8.gz /usr/share/man/man8

二、参数

smem相关参数如下:

 1# report
 2-m, --mappings  Report memory usage by mapping.
 3-u, --users     Report memory usage by user.
 4-w, --system    Report systemwide memory usage summary.
 5# Filter
 6-M MAPFILTER, --mapfilter=MAPFILTER              Mapping filter regular expression.
 7-P PROCESSFILTER, --processfilter=PROCESSFILTER  Process filter regular expression.
 8-U USERFILTER, --userfilter=USERFILTER           User filter regular expression.
 9# 输出格式
10-c COLUMNS, --columns=COLUMNS   Columns to show.
11-H, --no-header                 Disable header line.
12-k, --abbreviate                Show unit suffixes.
13-n, --numeric                   Show numeric user IDs instead of usernames.
14-p, --percent                   Show percentages.
15-r, --reverse                   Reverse sort.
16-s SORT, --sort=SORT            Field to sort on.
17-t, --totals                    Show totals.
18# 输出图形
19--bar=BAR     Show bar graph.
20--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以百分比形式查看。

smem
smem

注意-w选面,上面使用-R与不使用-R的区别,我建议使用选项-R REALMEM,这个值是指物理内存数量。这让smem可以在整个系统(-w)的输出中发现固件/硬件所耗用的内存数量。如果提供该选项,它还可以用作百分比所用到的总内存大小。

smem -t
smem -t

使用-t 会汇总统计,也可以使用-r进行反向排序,将使用内存最大的进程放在最上面。使用正则过虑显示ntp和www用户内存使用情况的示例如下:

smem-user-filter
smem-user-filter

其他常见的用法如下:

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 evolution
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” ),显示效果如下图:

smem-bar
smem-bar

创建饼形图,显示在运行系统上以“k”开头的进程(命令:smem -P ‘^k’ –pie=name ):

smem-pie
smem-pie

五、smemcap抓取与分析

除此之外,smem还支持通过将其他主机的内存信息捕获放到文件中,将该文件到复制某台主机上进行分析。最上面提到的smemcap.c源文件就是做这个用的,使用gcc编译成二进制文件即可。

11. Compile smemcap.c for your target system.
22. Run smemcap on the target system and save the output:
3          smemcap > memorycapture.tar
43. Copy the output to another machine and run smem on it:
5          smem -S memorycapture.tar