如何监视内存使用情况?


265

我曾经top看过目前的内存使用情况。但是我想监视一段时间内的内存使用情况。例如,开始监视,然后执行一些命令,最后停止监视,并查看在此期间已使用了多少内存。

如何在Ubuntu服务器上执行此操作?

我想我可以每隔5秒左右启动一次cronjob,然后调用一个命令将当前内存使用情况记录在文本文件中。但是,我应该使用什么命令以易于记录到文本文件的格式获取当前的内存使用情况?

Answers:


322

我建议结合以前的答案

watch -n 5 free -m

请注意,Linux喜欢使用任何额外的内存来缓存硬盘驱动器块。因此,您不想只看免费Mem。您要查看free-/+ buffers/cache:行的列。这显示了应用程序可用的内存量。所以我就跑了free -m,得到了这个:

             total       used       free     shared    buffers     cached
Mem:          3699       2896        802          0        247       1120
-/+ buffers/cache:       1528       2170
Swap:         1905         62       1843

我知道我正在使用1528 MB并有2170 MB的可用空间。

注意:要停止此watch循环,只需按Ctrl+即可C


1
谢谢,这是有益的。但是,在首先使用的列上2896,然后1528在缓冲区上,这是否意味着您正在使用2896 + 1528
乔纳斯(Jonas)2010年

8
Mem: used是您已使用的总内存。-/+ buffers/cache: used是您的总已用内存减去缓冲区和缓存。我知道输出看起来很有趣,但是这里不需要算术运算。您只是在-/ +缓冲区/高速缓存行中查找使用/免费。
贾斯汀·力

6
-h选项好很多
frmdstryr 17-10-19

1
@frmdstryr好点!-h /-但是,当我写这篇文章时,人类并不存在。gitlab.com/procps-ng/procps/commit/…–
贾斯汀·

3
@ cbradsh1您可以这样做free -h,例如watch -n 5 free -h,获取“人类可读”的输出,例如,2.1G而不是2170在输出中。
贾斯汀·

213

我认为htop是最好的解决方案。

  • sudo apt-get install htop

这样,您将注意到哪些程序正在使用最多的RAM。如果需要,您可以轻松终止一个。这是屏幕截图!


2
htop很好,因为它比更具“图形性”,而且可能更易于阅读free
mjswensen

1
我不明白输出。RES该应用程序使用的内存是否以MB为单位?这是SHR什么?
faizal

1
@faizal:虚拟,保留和共享内存。
WitchCraft 2015年

1
如何htop显示“一段时间内的内存使用情况”?
dangel'8

htop -s M_SHARE htop -s时间
Tomachi

40

如果你在寻找每个正在运行的进程使用的内存的一个很好的细分,那么我会推荐检查出ps_mem.py(发现这里的pixelbeat.org)。

我在上面的评论中知道,您提到想要从free获得单行快照,但我认为其他人可能会觉得有用。

输出示例:

user@system:~$ sudo ps_mem.py
[sudo] password for user:
 Private  +   Shared  =  RAM used       Program

  4.0 KiB +   7.5 KiB =  11.5 KiB       logger
  4.0 KiB +   8.0 KiB =  12.0 KiB       mysqld_safe
  4.0 KiB +  10.0 KiB =  14.0 KiB       getty
  4.0 KiB +  42.0 KiB =  46.0 KiB       saslauthd (5)
 48.0 KiB +  13.0 KiB =  61.0 KiB       init
 56.0 KiB +  27.5 KiB =  83.5 KiB       memcached
 84.0 KiB +  26.5 KiB = 110.5 KiB       cron
120.0 KiB +  50.0 KiB = 170.0 KiB       master
204.0 KiB + 107.5 KiB = 311.5 KiB       qmgr
396.0 KiB +  94.0 KiB = 490.0 KiB       tlsmgr
460.0 KiB +  65.0 KiB = 525.0 KiB       rsyslogd
384.0 KiB + 171.0 KiB = 555.0 KiB       sudo
476.0 KiB +  83.0 KiB = 559.0 KiB       monit
568.0 KiB +  60.0 KiB = 628.0 KiB       freshclam
552.0 KiB + 259.5 KiB = 811.5 KiB       pickup
  1.1 MiB +  80.0 KiB =   1.2 MiB       bash
  1.4 MiB + 308.5 KiB =   1.7 MiB       fail2ban-server
888.0 KiB +   1.0 MiB =   1.9 MiB       sshd (3)
  1.9 MiB +  32.5 KiB =   1.9 MiB       munin-node
 13.1 MiB +  86.0 KiB =  13.2 MiB       mysqld
147.4 MiB +  36.5 MiB = 183.9 MiB       apache2 (7)
---------------------------------
                        208.1 MiB
=================================

 Private  +   Shared  =  RAM used       Program

我唯一不喜欢的部分是该脚本声称需要root特权。我还没有机会确切地知道为什么会这样。


我想知道线程之间是否共享内存。它在进程之间共享,不是吗?至少在Windows上...
Thomas Weller 2014年

因此,在这种情况下,共享内存是指由多个进程以共享库的形式映射的页面。另外,在多线程应用程序的上下文中,该进程中的所有线程都可以访问整个进程的内存空间。
杰森·莫克

4
现在可以在PyPI(pip install ps_mem)和GitHub上使用
Leif Arne Storset

@ThomasWeller:是的,线程总是共享内存,而进程在某些情况下可能共享部分或全部内存。
Leif Arne Storset

为此,我使用gnome-system-monitor

24

使用free命令。例如,这是输出free -m

             total       used       free     shared    buffers     cached
Mem:          2012       1666        345          0        101        616
-/+ buffers/cache:        947       1064
Swap:         7624          0       7624

free -m | grep /+ 将仅返回第二行:

-/+ buffers/cache:        947       1064

谢谢,看起来很棒。因此,这947是内存使用量减去用于缓冲区和缓存的内存吗?
乔纳斯(Jonas)2010年

11

手表命令可能是有用的。尝试watch -n 5 free每五秒钟更新一次,以监视内存使用情况。


谢谢,太好了!但是,我希望单行显示内存使用情况,因此很容易登录到文本文件。
乔纳斯(Jonas)2010年

8

您可以使用来做cat /proc/meminfo

MemTotal:        4039160 kB
MemFree:          309796 kB
MemAvailable:    3001052 kB
Buffers:          345636 kB
Cached:          2341288 kB
SwapCached:            8 kB
Active:          1725160 kB
Inactive:        1551652 kB
Active(anon):     538404 kB
Inactive(anon):    70076 kB
Active(file):    1186756 kB
Inactive(file):  1481576 kB
Unevictable:          32 kB
Mlocked:              32 kB
SwapTotal:       4194300 kB
SwapFree:        4194044 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        589988 kB
Mapped:           255972 kB
Shmem:             18596 kB
Slab:             374888 kB
SReclaimable:     310496 kB
SUnreclaim:        64392 kB
KernelStack:        6976 kB
PageTables:        26452 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     6213880 kB
Committed_AS:    3589736 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      147392 kB
DirectMap2M:     4046848 kB

1
在此命令的前面添加watch使其变得很棒!就像watch cat /proc/meminfo
Elder Geek

free命令从中获取信息/proc/meminfo并以紧凑的方式呈现它们。使用free -h人类可读的输出。
LoMaPh

4

为了直观地监视总体RAM使用情况,如果您使用Byobu,它将使您的内存使用情况保持在终端的右下角,并且可以在任何终端会话中运行。

从屏幕截图中可以看到,我的虚拟机的运行时间为1h3m,负载为0.00,具有2.8GHz(虚拟)处理器和994MB(21%)的系统可用RAM。

正在使用Byobu


3

单线解决方案和输出:

free -m | grep "Mem:"

这是预期输出的示例:

Mem:           3944         652         302          18        2990        2930

1

我会用Cacti。这将显示一段时间内的内存使用情况等信息,并且您将能够使用网络浏览器查看使用情况。


1

监视内存使用情况

我更符合前面提到的Cacti是监视内存使用情况的一种好方法的文章之一。但是,由于仙人掌似乎不再是主流,因此有一种名为Graphite的替代绘图应用程序。

Graphite相对容易安装在ubuntu服务器上,并且要安装它,您可以查看此链接以获得易于遵循的安装过程。

在安装了石墨之后,现在,您可以按希望的任何时间间隔向其发送内存指标。每5秒,每分钟,每小时...等等。

如前所述,要绘制内存指标图,您可以使用系统工具编写您自己的脚本来收集必要的内存信息。或者,您可以使用预写的snmp插件来为您完成所有工作。

如果要编写自己的内存脚本,明智的做法是确保在计算使用的内存时考虑缓冲和缓存的内存,否则,最终将收集错误的数据。

如果您希望使用已经为您完成所有必要计算的snmp插件,则可以通过以下链接找到运行良好的插件checkMemoryviaSNMP

SNMP的优点:

我在监视的所有远程节点上都安装了snmp。这使我可以从一个中央服务器监视我的所有系统,而不必复制或在远程节点上放置插件。

SNMP的缺点:

您必须确保要在其上监视内存的每个远程节点上都安装了snmp代理。但是,此安装将是一次性的。如果您在环境中使用厨师或木偶之类的自动化工具或类似工具,那么这根本不是问题。

SNMP代理在远程节点上的配置:

安装snmp代理后,只需在/etc/snmpd/snmpd.conf文件中添加以下行:

rocommunity  (specify-a-community-string-aka-password-here)

然后使用以下命令重新启动snmpd代理:

/etc/init.d/snmpd restart

然后,在您的中央服务器上(而不是从其监视所有其他服务器),可以运行以下命令:

$ time ./checkMemoryviaSNMP -v2 public gearman001.phs.blah.com 30 90 graphite,10.10.10.10,2003,typical
WARNING: Used = [ 3.26154 GB ], Installed = [ 5.71509 GB ], PCT.Used = [ 57.069% ], Available.Memory = [ 2.00291 GB ]. Buffer = [ 137.594 MB ], Cached = [ 1.3849 GB ]. Thresholds: [ W=(30%) / C=(90%) ].  System Information = [ Linux gearman001.phs.blah.com 2.6.32-504.30.3.el6.x86_64 #1 SMP Thu Jul 9 15:20:47 EDT 2015 x86_64 ].

real    0m0.23s
user    0m0.03s
sys     0m0.02s
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.