smem – Linux 下基于进程和用户的内存占用报告--转载
Linux 系统的内存管理工作中,内存使用情况的监控是十分重要的,在各种 Linux 发行版上你会找到许多这种工具。它们的工作方式多种多样,在这里,我们将会介绍如何安装和使用这样的一个名为 smem 的工具软件。
Smem 是一款命令行下的内存使用情况报告工具,它能够给用户提供 Linux 系统下的内存使用的多种报告。和其它传统的内存报告工具不同的是,它有个独特的功能,可以报告 PSS(按比例占用大小(Proportional Set Size)),这种内存使用量表示方法对于那些在虚拟内存中的应用和库更有意义。
已有的传统工具会将目光主要集中于读取 RSS(实际占用大小(Resident Set Size)),这种方法是以物理内存方案来衡量使用情况的标准方法,但是往往高估了应用程序的内存的使用情况。
PSS 从另一个侧面,通过判定在虚拟内存中的应用和库所使用的“合理分享”的内存,来给出更可信的衡量结果。
你可以阅读此指南 (关于内存的 RSS 和 PSS)了解 Linux 系统中的内存占用,不过现在让我们继续看看 smem 的特点。
Smem 这一工具的特点
- 系统概览列表
- 以进程、映射和用户来显示或者是过滤
- 从 /proc 文件系统中得到数据
- 从多个数据源配置显示的条目
- 可配置输出单位和百分比
- 易于配置列表表头和汇总
- 从镜像文件夹或者是压缩的 tar 文件中获得数据快照
- 内置的图表生成机制
- 轻量级的捕获工具,可用于嵌入式系统
如何安装 Smem - Linux 下的内存使用情况报告工具
安装之前,需要确保满足以下的条件:
- 现代内核 (版本号高于 2.6.27)
- 较新的 Python 版本 (2.4 及以后版本)
- 可选的 matplotlib 库用于生成图表
对于当今的大多数的 Linux 发行版而言,内核版本和 Python 的版本都能够满足需要,所以仅需要为生成良好的图表安装 matplotlib 库。
RHEL, CentOS 和 Fedora
首先启用 EPEL (Extra Packages for Enterprise Linux) 软件源,然后按照下列步骤操作:
#yum install smem python-matplotlib python-tk
Debian 和 Ubuntu
$ sudoapt-get install smem
Linux Mint
$ sudoapt-get install smem python-matplotlib python-tk
Arch Linux
使用此 AUR 仓库。
如何使用 Smem – Linux 下的内存使用情况报告工具
为了查看整个系统所有用户的内存使用情况,运行以下的命令:
$ sudo smem
监视 Linux 系统中的内存使用情况
PID UserCommandSwap USS PSS RSS6367 tecmint cat010014517846368 tecmint cat010014716762864 tecmint /usr/bin/ck-launch-session 014416517807656 tecmint gnome-pty-helper 015617818325758 tecmint gnome-pty-helper 015617919161441 root /sbin/getty -838400 tty2 015218420521434 root /sbin/getty -838400 tty5 015618720601444 root /sbin/getty -838400 tty3 015618720601432 root /sbin/getty -838400 tty4 015618821241452 root /sbin/getty -838400 tty6 016419620642619 root /sbin/getty -838400 tty1 016419621363544 tecmint sh -c /usr/lib/linuxmint/mi 021222415401504 root acpid -c /etc/acpi/events -022023616043311 tecmint syndaemon -i 0.5-K -R 025229225563143 rtkit /usr/lib/rtkit/rtkit-daemon 030032625481588 root cron029233323441589 avahi avahi-daemon:chroot helpe 012433416321523 root /usr/sbin/irqbalance 03163432096585 root upstart-socket-bridge --dae 032835118203033 tecmint /usr/bin/dbus-launch --exit032836021601346 root upstart-file-bridge --daemo 034837117762607 root /usr/bin/xdm 018837823681635 kernoops /usr/sbin/kerneloops 03523862684344 root upstart-udev-bridge --daemo 040042721322960 tecmint /usr/bin/ssh-agent /usr/bin 04804859923468 tecmint /bin/dbus-daemon --config-f 034451532841559 avahi avahi-daemon: running [tecm 028451731087289 postfix pickup -l -t unix -u -c 028853428082135 root /usr/lib/postfix/master 035257628722436 postfix qmgr -l -t unix -u 036060628841521 root /lib/systemd/systemd-logind 060065032762222 nobody /usr/sbin/dnsmasq --no-reso 06046693288....
当普通用户运行 smem,将会显示由该用户启用的进程的占用情况,其中进程按照 PSS 的值升序排列。
下面的输出为用户 “aaronkilik” 启用的进程的使用情况:
$ smem
监视 Linux 系统中的内存使用情况
PID UserCommandSwap USS PSS RSS6367 tecmint cat010014517846368 tecmint cat010014716762864 tecmint /usr/bin/ck-launch-session 014416617803544 tecmint sh -c /usr/lib/linuxmint/mi 021222415403311 tecmint syndaemon -i 0.5-K -R 025229225563033 tecmint /usr/bin/dbus-launch --exit032836021603468 tecmint /bin/dbus-daemon --config-f 034451532843122 tecmint /usr/lib/gvfs/gvfsd 065680155523471 tecmint /usr/lib/at-spi2-core/at-sp 070886459923396 tecmint /usr/lib/gvfs/gvfs-mtp-volu 080491462043208 tecmint /usr/lib/x86_64-linux-gnu/i 0892101261883380 tecmint /usr/lib/gvfs/gvfs-afc-volu 0820102463963034 tecmint //bin/dbus-daemon --fork -- 0 920 1081 30403365 tecmint /usr/lib/gvfs/gvfs-gphoto2-0972109960523228 tecmint /usr/lib/gvfs/gvfsd-trash -0980115366483107 tecmint /usr/lib/dconf/dconf-servic 01212128353766399 tecmint /opt/google/chrome/chrome -01441409107323478 tecmint /usr/lib/x86_64-linux-gnu/g 01724182063207365 tecmint /usr/lib/gvfs/gvfsd-http --01352188487046937 tecmint /opt/libreoffice5.0/program 01140232850403194 tecmint /usr/lib/x86_64-linux-gnu/p 019562405142286373 tecmint /opt/google/chrome/nacl_hel 02324254189083313 tecmint /usr/lib/gvfs/gvfs-udisks2-02460275487363464 tecmint /usr/lib/at-spi2-core/at-sp 02684282379205771 tecmint ssh-p 4521 tecmnt765@212.702544286465405759 tecmint /bin/bash02416292356403541 tecmint /usr/bin/python /usr/bin/mi 02584300872487657 tecmint bash02516305560283127 tecmint /usr/lib/gvfs/gvfsd-fuse /r 03024312680323205 tecmint mate-screensaver 025203331180723171 tecmint /usr/lib/mate-panel/notific 028603495171403030 tecmint x-session-manager 044004879175003197 tecmint mate-volume-control-applet 03860522623736...
使用 smem 时还有一些参数可以选用,例如当查看整个系统的内存占用情况,运行以下的命令:
$ sudo smem -w
监视 Linux 系统中的内存使用情况
AreaUsedCacheNoncachefirmware/hardware 000kernel image 000kernel dynamic memory 14253201291412133908userspace memory 22153684516081763760free memory 442493644249360
如果想要查看每一个用户的内存使用情况,运行以下的命令:
$ sudo smem -u
Linux 下以用户为单位监控内存占用情况
UserCountSwap USS PSS RSSrtkit 103003262548kernoops 103523852684avahi 204088514740postfix 2064811405692messagebus 10101211733320syslog 10139614193232www-data 205100657213580mpd 107416830212896nobody 2040241130524728root 390323876353418496520tecmint 640165288818156992763112
你也可以按照映射显示内存使用情况:
$ sudo smem -m
Linux 下以映射为单位监控内存占用情况
MapPIDs AVGPSS PSS/dev/fb0 100/home/tecmint/.cache/fontconfig/7ef2298f1800/home/tecmint/.cache/fontconfig/c57959a1 1800/home/tecmint/.local/share/mime/mime.cac 1500/opt/google/chrome/chrome_material_100_p 900/opt/google/chrome/chrome_material_200_p 900/usr/lib/x86_64-linux-gnu/gconv/gconv-mo 4100/usr/share/icons/Mint-X-Teal/icon-theme.1500/var/cache/fontconfig/0c9eb80ebd1c36541e2000/var/cache/fontconfig/0d8c3b2ac0904cb8a52000/var/cache/fontconfig/1ac9eb803944fde1462000/var/cache/fontconfig/3830d5c3ddfd5cd38a2000/var/cache/fontconfig/385c0604a188198f042000/var/cache/fontconfig/4794a0821666d791902000/var/cache/fontconfig/56cf4f4769d0f4abc82000/var/cache/fontconfig/767a8244fc0220cfb52000/var/cache/fontconfig/8801497958630a81b72000/var/cache/fontconfig/99e8ed0e538f840c562000/var/cache/fontconfig/b9d506c9ac06c20b43 2000/var/cache/fontconfig/c05880de57d1f5e948 2000/var/cache/fontconfig/dc05db6664285cc2f1 2000/var/cache/fontconfig/e13b20fdb08344e0e6 2000/var/cache/fontconfig/e7071f4a29fa870f43 2000....
还有其它的选项可以筛选 smem 的输出,下面将会举两个例子。
要按照用户名筛选输出的信息,使用 -u 或者是 --userfilter="regex" 选项,就像下面的命令这样:
$ sudo smem -u
按照用户报告内存使用情况
UserCountSwap USS PSS RSSrtkit 103003262548kernoops 103523852684avahi 204088514740postfix 2064811405692messagebus 10101211733320syslog 10140014233236www-data 205100657213580mpd 107416830212896nobody 2040241130524728root 390323804353374496552tecmint 640170890018717662819212
要按照进程名称筛选输出信息,使用 -P 或者是 --processfilter="regex" 选项,就像下面的命令这样:
$ sudo smem --processfilter="firefox"
按照进程名称报告内存使用情况
PID UserCommandSwap USS PSS RSS9212 root sudo smem --processfilter=f 01172143448569213 root /usr/bin/python /usr/bin/sm 073687793119844424 tecmint /usr/lib/firefox/firefox 0931732937590961504
输出的格式有时候也很重要,smem 提供了一些帮助您格式化内存使用报告的参数,我们将举出几个例子。
设置哪些列在报告中,使用 -c 或者是 --columns 选项,就像下面的命令这样:
$ sudo smem -c "name user pss rss"
按列报告内存使用情况
NameUser PSS RSScat tecmint 1451784cat tecmint 1471676ck-launch-sessi tecmint 1651780gnome-pty-helpe tecmint 1781832gnome-pty-helpe tecmint 1791916getty root 1842052getty root 1872060getty root 1872060getty root 1882124getty root 1962064getty root 1962136sh tecmint 2241540acpid root 2361604syndaemon tecmint 2962560rtkit-daemon rtkit 3262548cron root 3332344avahi-daemon avahi 3341632irqbalance root 3432096upstart-socket- root 3511820dbus-launch tecmint 3602160upstart-file-br root 3711776xdm root 3782368kerneloops kernoops 3862684upstart-udev-br root 4272132ssh-agent tecmint 485992...
也可以调用 -p 选项以百分比的形式报告内存使用情况,就像下面的命令这样:
$ sudo smem -p
按百分比报告内存使用情况
PID UserCommandSwap USS PSS RSS6367 tecmint cat0.00%0.00%0.00%0.02%6368 tecmint cat0.00%0.00%0.00%0.02%9307 tecmint sh -c {sudo/usr/lib/linux 0.00%0.00%0.00%0.02%2864 tecmint /usr/bin/ck-launch-session 0.00%0.00%0.00%0.02%3544 tecmint sh -c /usr/lib/linuxmint/mi 0.00%0.00%0.00%0.02%5758 tecmint gnome-pty-helper 0.00%0.00%0.00%0.02%7656 tecmint gnome-pty-helper 0.00%0.00%0.00%0.02%1441 root /sbin/getty -838400 tty2 0.00%0.00%0.00%0.03%1434 root /sbin/getty -838400 tty5 0.00%0.00%0.00%0.03%1444 root /sbin/getty -838400 tty3 0.00%0.00%0.00%0.03%1432 root /sbin/getty -838400 tty4 0.00%0.00%0.00%0.03%1452 root /sbin/getty -838400 tty6 0.00%0.00%0.00%0.03%2619 root /sbin/getty -838400 tty1 0.00%0.00%0.00%0.03%1504 root acpid -c /etc/acpi/events -0.00%0.00%0.00%0.02%3311 tecmint syndaemon -i 0.5-K -R 0.00%0.00%0.00%0.03%3143 rtkit /usr/lib/rtkit/rtkit-daemon 0.00%0.00%0.00%0.03%1588 root cron0.00%0.00%0.00%0.03%1589 avahi avahi-daemon:chroot helpe 0.00%0.00%0.00%0.02%1523 root /usr/sbin/irqbalance 0.00%0.00%0.00%0.03%585 root upstart-socket-bridge --dae 0.00%0.00%0.00%0.02%3033 tecmint /usr/bin/dbus-launch --exit0.00%0.00%0.00%0.03%....
下面的命令将会在输出的最后输出一行汇总信息:
$ sudo smem -t
报告内存占用合计
PID UserCommandSwap USS PSS RSS6367 tecmint cat010013917846368 tecmint cat010014116769307 tecmint sh -c {sudo/usr/lib/linux 09615815082864 tecmint /usr/bin/ck-launch-session 014416317803544 tecmint sh -c /usr/lib/linuxmint/mi 010817015405758 tecmint gnome-pty-helper 015617619167656 tecmint gnome-pty-helper 015617618321441 root /sbin/getty -838400 tty2 015218120521434 root /sbin/getty -838400 tty5 015618420601444 root /sbin/getty -838400 tty3 015618420601432 root /sbin/getty -838400 tty4 015618521241452 root /sbin/getty -838400 tty6 016419320642619 root /sbin/getty -838400 tty1 016419321361504 root acpid -c /etc/acpi/events -022023216043311 tecmint syndaemon -i 0.5-K -R 026029825643143 rtkit /usr/lib/rtkit/rtkit-daemon 030032425481588 root cron029232623441589 avahi avahi-daemon:chroot helpe 012433216321523 root /usr/sbin/irqbalance 03163402096585 root upstart-socket-bridge --dae 032834918203033 tecmint /usr/bin/dbus-launch --exit032835921601346 root upstart-file-bridge --daemo 034837017762607 root /usr/bin/xdm 018837523681635 kernoops /usr/sbin/kerneloops 03523842684344 root upstart-udev-bridge --daemo 04004262132.....-------------------------------------------------------------------------------134110217142823762663587972
另外,smem 也提供了选项以图形的形式报告内存的使用情况,我们将会在下一小节深入介绍。
比如,你可以生成一张进程的 PSS 和 RSS 值的条状图。在下面的例子中,我们会生成属于 root 用户的进程的内存占用图。
纵坐标为每一个进程的 PSS 和 RSS 值,横坐标为 root 用户的所有进程(的 ID):
$ sudo smem --userfilter="root"--bar pid -c"pss rss"

Linux Memory Usage in PSS and RSS Values
也可以生成进程及其 PSS 和 RSS 占用量的饼状图。以下的命令将会输出一张 root 用户的所有进程的饼状图。
--pie name 意思为以各个进程名字为标签,-s 选项用来以 PSS 的值排序。
$ sudo smem --userfilter="root"--pie name -s pss

Linux Memory Consumption by Processes
除了 PSS 和 RSS ,其它的字段也可以用于图表的标签:
假如需要获得帮助,非常简单,仅需要输入 smem -h 或者是浏览帮助页面。
关于 smem 的介绍到此为止,不过想要更好的了解它,可以通过 man 手册获得更多的选项,然后一一实践。有什么想法或者疑惑,都可以跟帖评价。

浙公网安备 33010602011771号