如何监控内存使用情况?

我使用了top来查看当前的内存使用情况。但是我想监控一段时间内的内存使用情况。例如,开始监控,然后执行几个命令,最后停止监控并查看在此期间使用了多少内存。
在Ubuntu Server上,我该如何实现这个功能呢?
我猜可以每隔5秒钟启动一个cron作业,并调用一个命令将当前的内存使用情况记录到一个文本文件中。但是,我应该使用什么命令以便以便于记录到文本文件的格式获取当前的内存使用情况呢?
13个回答

我建议将之前的答案结合起来。
watch -n 5 free -m

请注意,Linux喜欢使用任何额外的内存来缓存硬盘块。因此,你不应只关注空闲的Mem。你需要查看-/+ buffers/cache:行中的free列。这显示了可供应用程序使用的内存量。所以我刚刚运行了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
10"Mem: used" 是您的总使用内存。"-/+ buffers/cache: used" 是您的总使用内存减去缓冲区和缓存的结果。我知道输出看起来有点奇怪,但这里不需要进行任何算术运算。您只需查找“-/+ buffers/cache”行中的已使用/可用内存即可。 - Justin Force
9-h选项更好一些。 - frmdstryr
1@frmdstryr 很好的观点!不过当我写这篇文章时,-h / --human 选项还不存在。https://gitlab.com/procps-ng/procps/commit/d13fbc34a7a198fb507f04e823ea80f8866b6131 - Justin Force
-h选项放在哪里? - cbradsh1
4@cbradsh1 你可以直接输入 free -h,例如 watch -n 5 free -h 以获取可读性更高的输出,例如输出中的 2.1G 而非 2170 - Justin Force
1你能否使用“-h”选项编辑你的回答?此外,现在输出略有不同。如果你愿意,我可以替你进行编辑。 - user
如何将其记录到文本文件中? - lcrmorin

我认为htop是最好的解决方案。
  • sudo apt-get install htop
这样你就能注意到哪些程序使用了最多的内存,如果需要的话,你可以轻松地终止其中一个。这是一张截图!


3htop很好,因为它比free更“图形化”,可能更容易阅读。 - mjswensen
3我不明白输出的意思。RES是该应用程序使用的内存(以MB为单位)吗?那么SHR又是什么呢? - faizal
2@faizal: 虚拟、保留和共享内存。 - WitchCraft
2htop如何显示“在一段时间内的内存使用情况”? - dangel
htop -s M_SHARE htop -s TIME - Tomachi

如果你想要一个关于每个运行进程所使用内存的详细分析,我建议你去看看在pixelbeat.org上找到的ps_mem.py(链接在这里)。
我知道在上面的评论中,你提到了想要从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
所以在这种情况下,共享内存指的是以共享库的形式被多个进程映射的页面。此外,在多线程应用程序的上下文中,整个进程的内存空间对所有线程都是可访问的。 - Jason Mock
4现在可以在PyPI(pip install ps_mem)和GitHub上获取。 - Leif Arne Storset
@ThomasWeller:是的,线程总是共享内存,而进程在某些条件下可能共享部分或全部内存。 - Leif Arne Storset
我使用gnome-system-monitor来进行这项任务。 - user372194
@jms 通常情况下,如果是在Gnome环境下运行,我会同意你的观点。但是问题明确要求与Ubuntu服务器相关的解决方案,而在正常情况下,Ubuntu服务器并没有安装和运行图形界面。 - Jason Mock
有没有办法在不使用root权限的情况下运行它? - bapors

使用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

watch 命令可能会很有用。尝试使用 watch -n 5 free 命令,以每五秒更新一次的频率监控内存使用情况。

谢谢,这很棒!不过,我更喜欢将内存使用情况放在一行上,这样可以轻松记录到文本文件中。 - Jonas

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

我刚刚找到了这个解决方案,它非常有效,通过 CLI 创建了一个图形界面。
# fixed link
git clone https://github.com/aristocratos/bashtop
cd bashtop
bash bashtop

Screenshot


3对于图形界面的出色工作给一个赞。顺便说一下,作者现在建议使用Python版本 - Skippy le Grand Gourou
1对于图形设计和终端缩放的响应能力,你的工作真是太棒了! - Waleed Alrashed

单行解决方案和输出:
free -m | grep "Mem:"

这里是预期输出的一个例子:
Mem:           3944         652         302          18        2990        2930

为了对整体RAM使用情况进行可视化监控,如果您使用Byobu,它将在终端的右下角显示您的内存使用情况,并且会在您进入任何终端会话时运行。

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

Byobu in use


我会使用Cacti。这个工具可以在一段时间内绘制出你的内存使用情况等数据,并且你可以通过网页浏览器来查看使用情况。