如何在 Linux 中检查内存使用情况

在 Linux 操作系统中,为需要运行的进程提供足够的可用物理内存 (内存) 非常重要。
如果此内存用完,接下来将开始使用交换空间,这将导致性能降低,因为 I/O 操作将需要写入磁盘。
如果主内存和交换区都已满, Linux 系统可能会完全僵死。

检查 Linux 内存使用情况的命令

“free”命令。

'free' 命令将提供显示内存使用的最准确方式,当使用 -m 标志运行时,输出更容易阅读,因为值将以 MB 显示。

jack@onitroad [~]# free -m
             total       used       free     shared    buffers     cached
Mem:          3948       3248        700          0        245       2036
-/+ buffers/cache:        966       2982
Swap:         3999        675       3324

如果我们看到已使用的 Mem 量很高而空闲 Mem 量很低,请不要惊慌(至少不是立即),因为通常会保留用于缓存目的的内存以帮助加快速度。
未使用内存的最佳指示是缓冲区/缓存行的空闲列。
这显示了有多少内存完全未使用和可用,因为缓冲区/缓存使用的内存可以在需要时快速用于其他地方。

Linux 足够聪明,可以将一些未使用的内存用于磁盘缓存以提高性能,但是它可能会使我们看起来好像可用内存比实际少。
从技术上讲,操作系统正在使用它,这就是它显示为正在使用的原因,但是如果我们实际上在其他地方需要任何这些内存,它将立即准备好使用,因此我们不一定内存不足。

在上面的例子中,使用的 Mem 显示为 3248mb,有 700mb 空闲,但这并不是空闲内存的最佳指示。
最好的是缓冲区/缓存中列出的 2982mb 空闲空间。

free 命令还将显示已用和空闲交换使用情况,理想情况下将使用 0 交换,这意味着没有任何内容从物理内存交换到硬盘。
如果此值大于 0,我们应该调查内存使用情况,因为它可能已经填满并在某个时候溢出到磁盘。
在我们上面的例子中,我们有一些小的交换使用,它在一段时间内没有改变,并且有足够的空闲内存,所以目前看起来没问题。

如果交换已满,则可以分配更多磁盘空间来增加它,但是首先我们最好确认需要另外的内存使用量,然后我们会想要增加物理内存。

“top”命令。

top 命令是一种众所周知的方式,可以实时动态地快速了解 Linux 中的资源使用情况。
Top 向我们展示了可用的总内存,包括其中有多少正在使用中,有多少是空闲的。
top 命令还向我们展示了有多少交换空间可用,包括有多少正在使用和空闲。
这些值包括缓冲区和缓存使用的内存,类似于“free”命令中显示的第一行。

top - 22:39:56 up 7 days,  9:58,  1 user,  load average: 0.03, 0.05, 0.00
Tasks: 124 total,   1 running, 123 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.0%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4043720k total,  3325664k used,   718056k free,   251452k buffers
Swap:  4095992k total,   691520k used,  3404472k free,  2085212k cached
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 5034 mysql     15   0 1443m 207m 6552 S  0.0  5.3  20:07.09 mysqld
 8320 username  16   0  149m  46m 6848 S  0.0  1.2   0:11.94 php
 8631 username  16   0  148m  45m 6832 S  0.0  1.2   0:21.39 php
 8269 username  16   0  146m  43m 7252 S  0.0  1.1   0:14.85 php
 8694 username  15   0  145m  43m 7272 S  0.0  1.1   0:12.74 php
 8695 username  16   0  145m  42m 7276 S  0.0  1.1   0:12.60 php
 9110 username  16   0  142m  40m 7248 S  0.0  1.0   0:03.30 php
 8604 username  16   0  140m  37m 7192 S  0.0  1.0   0:03.86 php
 8603 username  15   0  138m  35m 7204 S  0.0  0.9   0:05.54 php
 8289 username  16   0  184m  29m 6648 S  0.0  0.7   0:06.77 php
 2158 root      11 -10 28704  22m 1744 S  0.0  0.6   0:00.01 iscsiuio
 8768 username  16   0  179m  20m 6680 S  0.0  0.5   0:01.44 php
 8290 username  16   0  175m  17m 6336 S  0.0  0.5   0:14.69 php
 8106 nobody    20   0  416m  12m 7316 S  0.0  0.3   0:00.97 httpd
 8113 nobody    19   0  351m  10m 6832 S  0.0  0.3   0:00.08 httpd

然后,我们可以更进一步,按照使用的内存量对进程进行排序,允许我们将进程从最高内存使用到最低排名。
这我们查看是否有任何可能需要进一步调查的内存繁重的进程。
要按内存对顶部输出进行排序,请按“shift + m”键。

上面示例中的输出已按这种方式排序,我们可以看到 mysqld 进程使用了最多的内存,这是有道理的,因为它已配置为缓存数据库。

/proc/meminfo 文件

如果我们对内存进行更详细的分解,请查看 /proc/meminfo 文件。

jack@onitroad [~]# cat /proc/meminfo
MemTotal:      4043720 kB
MemFree:        715944 kB
Buffers:        251940 kB
Cached:        2085324 kB
SwapCached:     206052 kB
Active:        1862372 kB
Inactive:      1141632 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:      4043720 kB
LowFree:        715944 kB
SwapTotal:     4095992 kB
SwapFree:      3404472 kB
Dirty:             740 kB
Writeback:           0 kB
AnonPages:      626324 kB
Mapped:          34684 kB
Slab:           284540 kB
PageTables:      15068 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:   6117852 kB
Committed_AS:  3057500 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    265844 kB
VmallocChunk: 34359471351 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB
日期:2020-07-07 20:54:53 来源:oir作者:oir