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

如何在Ubuntu Server上执行此操作?

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

#1 楼

我建议结合前面的答案

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。

评论


谢谢,这是有益的。但是在使用的列上,您首先有2896,然后有1528的缓冲区,这是否意味着您正在使用2896 + 1528?

–乔纳斯(Jonas)
2010-10-26 17:48

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

–贾斯汀部队
2010-10-26 18:49

-h选项好很多

–frmdstryr
17-10-19在20:11

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

–贾斯汀部队
17-10-20在18:51

@ cbradsh1您可以免费执行-h,例如观看-n 5 free -h以获得“人类可读”的输出,例如输出为2.1G而不是2170。

–贾斯汀部队
18年5月16日在22:11

#2 楼

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


sudo apt-get install htop

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



评论


htop很不错,因为它更“图形化”,而且可能比免费更易于阅读。

–mjswensen
13年11月26日在22:32

我不明白输出。 RES是该应用程序使用的内存(MB)吗?那么什么是SHR?

– faizal
14年8月19日在13:51

@faizal:虚拟,保留和共享内存。

–WitchCraft
2015年9月19日在7:47

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

– dangel
16年8月7日,0:57

htop -s M_SHARE htop -s TIME

–东町
18年8月21日在5:08



#3 楼

如果您想对每个正在运行的进程使用的内存进行很好的分类,那么我建议您检查ps_mem.py(可在此处找到pixelbeat.org)。

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

示例输出:

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年12月27日12:51

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

–杰森·莫克(Jason Mock)
2015年10月1日23:37

现在可以在PyPI(pip install ps_mem)和GitHub上使用。

– Leif Arne Storset
17年1月9日14:39

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

– Leif Arne Storset
17年1月9日14:44

为此,我使用gnome-system-monitor

–user372194
17/12/26在7:39

#4 楼

使用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-10-26 17:54

#5 楼

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

评论


谢谢,太好了!但是,我希望将内存使用情况放在一行上,因此很容易登录到文本文件。

–乔纳斯(Jonas)
2010-10-26 17:44

#6 楼

您可以使用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


评论


在此命令的前面添加watch使其变得很棒!如在手表猫/ proc / meminfo中

–古怪的长老
16-11-9的3:58

free命令从/ proc / meminfo获取其信息,并以紧凑的方式呈现它们。将free -h用于易于理解的输出。

–LoMaPh
18年2月17日在8:51

#7 楼

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

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



#8 楼

单行解决方案和输出:

free -m | grep "Mem:"


以下是预期输出的示例:

Mem:           3944         652         302          18        2990        2930


#9 楼

我刚刚找到了该解决方案,并且效果很好,可以通过CLI创建图形界面:

 # fixed link
git clone https://github.com/aristocratos/bashtop
cd bashtop
bash bashtop
 




评论


+1用于图形界面上的出色工作。顺便说一句,作者现在建议使用Python版本。

–Skippy le Grand Gourou
20-10-26在20:20

#10 楼

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

#11 楼

监视内存使用情况

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

石墨相对容易安装在ubuntu服务器上并进行安装,您可以查看此链接以轻松遵循安装过程。

安装石墨后,现在,您可以按所需的时间间隔向其发送内存指标;每5秒,每分钟,每小时...等等。

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

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

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

SNMP的优点:

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

SNMP的缺点:

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

在远程节点上配置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


#12 楼

glances是另一个不错的选择。只需pip install Glances或从此处下载