linux用smem分析内存占用情况

2015年1月10日 发表评论 阅读评论

也看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以百分比形式查看。

smem

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

smem -t

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

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

smem-bar

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

smem-pie

五、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




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.