Linux终端:用smem查看内存占用情况

译文
系统 Linux
无论是作为系统管理员,还是作为使用桌面版Linux的简单用户,你都会注意到,某个进程在耗用你系统的所有内存。但现在我们不妨看一个小巧的程序,它可以帮助我们找到哪些进程/用户在大量耗用我们系统的内存。

无论是作为系统管理员,还是作为使用桌面版Linux的简单用户,你都会注意到,某个进程在耗用你系统的所有内存。

首先要明白Linux是如何管理内存的;我多次接到用户的反映,说运行了free命令,就是无法适当读取输出。简而言之,如果是Linux内核,不用担心;内核在耗用内存,缓存文件呢。

放心,Linux内核开发人员比你我更有能力找到一种优秀的算法来缓存文件,并且当某个进程需要时,释放该内存区域,所以千万不要让我把运行诸如这种命令的某个任务放入计划任务(cron): 

  1. echo 3 > /proc/sys/vm/drop_caches  

当然,之后,你会在系统上有更多的可用闲置内存,但是系统不得不从磁盘重新读取所有文件,所以就性能而言,这通常是一个糟糕的举措:

但现在我们不妨看一个小巧的程序,它可以帮助我们找到哪些进程/用户在大量耗用我们系统的内存。

smem这个工具可以提供Linux系统上内存耗用情况方面的众多报告。与现有的工具不一样,smem可以报告实际使用的物理内存(PSS),这是一种更有意义的指标,可以衡量虚拟内存系统中的库和应用程序所占用的内存数量。

由于大部分的物理内存通常在多个应用程序之间共享,名为实际使用物理内存(RSS)的这个标准的内存耗用衡量指标会大大高估内存耗用情况。PSS这个参数而是衡量了每个应用程序在每个共享内存区中的“公平分配”,给出了一个切合实际的衡量指标。

smem有许多功能特性:

  • 系统概况列表
  • 按进程、映射和用户列表
  • 按用户、映射或用户过滤
  • 来自多个数据源的可配置列
  • 可配置的输出单位和百分比
  • 可配置的标题和总和
  • 从/proc读取活动数据
  • 从目录镜像或经过压缩的打包文件读取数据快照
  • 面向嵌入式系统的轻型捕获工具
  • 内置的图表生成功能

安装

如果你使用Debian、Ubuntu或Mint,可以使用下面这个命令,直接从官方软件库安装smem:

  1. $ sudo apt-get install smem  

Arch Linux用户可以从Arch用户软件库(AUR,https://www.archlinux.org/packages/community/i686/smem/)安装程序包。

Red Hat / Fedora / CentOS / SuSE用户可以使用直接从官方网站下载的预编译二进制代码。为了方便起见,你可以拷贝剪贴这些命令,这些命令会将命令smen放入到你的/usr/local/bin文件夹:

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

基本用法

smem可报告物理内存使用情况,并且考虑到共享的内存页面。非共享内存被报告为进程独自占用的物理内存(USS)。共享内存在共享该内存的多个进程之间平均分配。非共享内存(USS)以及进程的共享内存比例被报告为实际使用的物理内存(PSS)。USS和PSS只包含物理内存使用情况。它们并不包含已经被置换到磁盘上的内存。

基本用法会显示运行中进程以及所用的内存数量;想看看这方面的情况,运行不带任何选项的命令smem,这会得出类似下面这样的输出:

# smem
  PID User     Command                         Swap      USS      PSS      RSS
....
 4223 linuxaria   /usr/lib/chromium-browser/c        0     9144    11696    29132 
14280 root     python ./smem                      0    11580    11839    13680 
 2180 linuxaria   /usr/bin/python /usr/share/        0    12956    14691    24392 
 2144 linuxaria   python /usr/lib/linuxmint/m        0    20252    22337    35648 
 2121 linuxaria   Thunar --daemon                    0    13316    23122    44404 
 2123 linuxaria   xfdesktop                          0    24004    24924    36032 
13095 linuxaria   /usr/lib/chromium-browser/c        0    27536    30996    53328 
 2577 linuxaria   /usr/bin/python /usr/lib/ub        0    34192    35112    41300 
 2127 linuxaria   /home/riccio/copy/x86_64/Co        0    40268    41081    52248 
10720 linuxaria   /usr/lib/chromium-browser/c        0    38684    42107    63928 
10561 linuxaria   /usr/lib/chromium-browser/c        0    43956    48137    71644 
10579 linuxaria   /usr/lib/chromium-browser/c        0    46276    50290    73484 
 5605 linuxaria   transmission-gtk /tmp/[kick        0    48616    51508    65148 
 8938 linuxaria   /usr/lib/firefox/plugin-con        0    48960    55428    71132 
 2186 linuxaria   /home/linuxaria/.dropbox-dist/        0    55524    56061    64820 
 1722 root     /usr/bin/X :0 -audit 0 -aut        0    52360    73110    96008 
10623 linuxaria   /usr/lib/chromium-browser/c        0   114224   121888   149236 
 4171 linuxaria   chromium-browser --disable-        0   131044   140415   165780 
 7050 linuxaria   /usr/lib/thunderbird/thunde        0   253428   256803   273152 
 2644 linuxaria   /usr/lib/firefox/firefox           0   528420   537423   558992

所以在该示例(我的桌面)中,耗用较多内存的进程是Firefox,占用内存第二多的是Thunderbird。

-u是一个有用的选项,它显示了每个用户所耗用的内存总量:

#smem -u
User     Count     Swap      USS      PSS      RSS 
daemon       1        0      196      197      368 
rtkit        1        0      300      312     1396 
nobody       1        0      428      442     1600 
mdm          2        0      600      695     1808 
avahi        2        0      568      806     2420 
syslog       1        0     1032     1043     1884 
messagebus     1        0     1124     1207     2048 
root        40        0    96568   123002   203372 
linuxaria      83        0  1539864  1640378  2222556

可以为该命令添加-p,显示百分比数值:

#smem -u -p
User     Count     Swap      USS      PSS      RSS 
daemon       1    0.00%    0.00%    0.00%    0.00% 
rtkit        1    0.00%    0.00%    0.00%    0.02% 
nobody       1    0.00%    0.01%    0.01%    0.02% 
mdm          2    0.00%    0.01%    0.01%    0.02% 
avahi        2    0.00%    0.01%    0.01%    0.03% 
syslog       1    0.00%    0.01%    0.01%    0.02% 
messagebus     1    0.00%    0.01%    0.01%    0.03% 
root        40    0.00%    1.18%    1.47%    2.41% 
linuxaria      83    0.00%   19.29%   20.48%   27.58%

或者,如果你更想看到整个系统的内存使用情况,则可以使用-w选项:

#smem -w -p
Area                           Used      Cache   Noncache 
firmware/hardware             0.00%      0.00%      0.00% 
kernel image                  0.00%      0.00%      0.00% 
kernel dynamic memory        64.55%     62.42%      2.13% 
userspace memory             22.12%      3.00%     19.12% 
free memory                  13.33%     13.33%      0.00%

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

#smem -R 8G -w -p
Area                           Used      Cache   Noncache 
firmware/hardware             2.83%      0.00%      2.83% 
kernel image                  0.00%      0.00%      0.00% 
kernel dynamic memory        63.02%     60.95%      2.07% 
userspace memory             21.60%      2.91%     18.68% 
free memory                  12.56%     12.56%      0.00%

借助smen,以图形显示linux内存

如果借助smem(又拥有matplotlib库),只要再借助几个选项,就可以生成条形图和饼形图。

显示带“pss”和“uss”这两列的条形图:

  1. #smem --bar pid -c "pss uss"  

创建饼形图,显示在运行系统上以“k”开头的进程:

  1. #smem -P '^k' --pie=name 

结束语

smem是一款易于使用的工具,你在寻找大量耗用内存的进程时,它可以轻松给出一些有用信息,而且很容易以图形来显示,那样你就能联系用户,劝说他们在内存方面需要合理使用。


原文链接:http://linuxaria.com/pills/linux-terminal-check-who-uses-all-your-memory-with-smem?lang=en

原文标题:Linux Terminal: Check who uses all your memory with smem

责任编辑:奔跑的冰淇淋 来源: 51CTO.com
相关推荐

2012-05-02 14:22:55

端口占用

2019-07-31 07:26:16

Linux服务器CPU

2010-02-03 17:16:58

Linux内存使用

2022-09-26 09:44:10

Linux

2010-06-02 11:06:15

Linux 内存监控

2019-06-24 08:53:01

Bash脚本Linux系统运维

2017-01-18 21:57:14

2020-02-04 13:50:09

Linux进程内存使用

2022-02-11 07:45:10

Linuxsmem系统

2021-10-25 10:33:26

smem 命令Linux

2010-09-26 12:45:29

2023-02-06 08:23:22

ChatGPT系统Linux

2017-01-12 09:31:07

Windows端口进程

2022-04-05 14:13:56

Linux端口系统

2021-03-25 12:50:31

Linux磁盘命令

2018-11-01 10:59:52

Linux内存进程

2017-06-27 10:23:01

Linuxps_memPython

2010-06-02 12:47:12

Linux 内存监控

2011-09-02 10:42:30

linuxfree内存

2021-11-29 20:44:31

Linux内存进程
点赞
收藏

51CTO技术栈公众号