Contents

Free和top命令的结果之间的差异

1. 概述

free 和*top *是内置的 Linux 命令,用于获取有关系统内存使用情况的详细报告。这些命令经常被用户误解,因为它们都不清楚它实际测量的内容。

在本教程中,我们将讨论这些命令并查看它们之间的一些相似之处和不同之处。

2. free

** free是一个流行且功能强大的 Unix 命令,它以人类可读的格式提供有关内存使用情况的信息。**它显示系统上可用和已用内存的总量。它还包括内核使用的物理空间、交换空间、缓冲区和高速缓存。默认情况下,它以千字节 (kb) 为单位显示内存值。

通过解析*/proc/meminfo*文件来检索信息。我们可以使用cat 命令查看它:

$ cat /proc/meminfo
MemTotal:        8007956 kB
MemFree:          195700 kB
MemAvailable:    2721768 kB
Buffers:          420764 kB
...truncated...

free命令具有以下基本语法:

$ free [options]

它还有很多选项 可以用来操作数据的显示。让我们使用*-h*以人类可读的格式显示输出:

$ free -h
              total        used        free      shared  buff/cache   available
Mem:          7.6Gi       4.3Gi       264Mi       623Mi       3.1Gi       2.5Gi
Swap:         2.0Gi       6.0Mi       2.0Gi

以下是这些列中的每一列所代表的内容:

  • total:指运行应用程序和服务可用的内存总量
  • used:显示已用内存量。计算方式为used = total – free – buffers – cache
  • free:显示未使用的内存量
  • shared:显示 tmpfs 主要使用的内存
  • buff/cache:显示来自内核缓冲区、页面缓存和平板的组合内存使用情况
  • available:显示可用于启动新应用程序而不进行交换的内存量的估计值

我们还可以通过使用*-s (-seconds)*选项在终端上连续显示内存信息:

$ free -s 2
              total        used        free      shared  buff/cache   available
Mem:        8007956     4711664      224108      638984     3072184     2367976
Swap:       2097148       13324     2083824
              total        used        free      shared  buff/cache   available
Mem:        8007956     4720488      219068      635188     3068400     2362948
Swap:       2097148       13324     2083824

上面的命令每 2 秒显示一次内存使用信息。我们可以注意到两个输出之间的某些值存在差异,因为这些值会定期更新。

3. top

** top (进程表)命令允许我们实时监控 Linux 机器上正在运行的进程数和内核管理的任务。**它还为我们提供了显示资源使用情况的系统信息摘要,包括 CPU 和内存使用情况。

它的界面分为两部分。上半部分显示统计值,下半部分显示正在运行的进程列表。它还支持颜色、突出显示,甚至是基本图形。此外,它是交互式的,它允许我们浏览进程列表,甚至杀死一个进程。

top 命令有很多版本。让我们查看我们当前的版本:

$ top -v
  procps-ng 3.3.16
Usage:
  top -hv | -bcEHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]

在本教程中,我们将使用*procps-ng *包附带的v3.3.16。 默认情况下,top命令产生以下输出:

$ top
...
%Cpu(s):  7.2 us,  2.3 sy,  0.0 ni, 90.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7820.3 total,    239.9 free,   6660.3 used,    920.0 buff/cache
MiB Swap:   2048.0 total,   1571.5 free,    476.5 used.    450.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
2832 user 20 0 4285156 194344 34556 S 6.0 2.4 22:29.39 gnome-sh+ 
...

我们甚至可以显示更多列。为此,我们需要按top命令仪表板上的字母f  :

...
    Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,
   'd' or <Space> toggles display, 's' sets sort.  Use 'q' or <Esc> to end!
* PID     = Process Id             GID     = Group Id               SUPGIDS = Supp Groups IDs        RSlk    = RES Locked (KiB)    
* USER    = Effective User Name    GROUP   = Group Name             SUPGRPS = Supp Groups Names      RSsh    = RES Shared (KiB)    
* PR      = Priority               PGRP    = Process Group Id       TGID    = Thread Group Id        CGNAME  = Control Group name
...

接下来,让我们导航到CODEDATASWAP列,使用空格按钮激活它们,然后按Esc按钮返回主仪表板。 我们应该有这个输出:

...
    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND     SWAP   CODE    DATA 
  15493 user    20   0   32.4g 224864  88356 S  51.3   2.8  48:48.97 chrome         0 176216  332228 
   5346 user    20   0   28.4g 338256  95904 S  46.4   4.2  36:07.86 chrome         0 176216  521552
...

让我们更多地了解这些列中的大多数代表什么:

  • %MEM:显示进程使用总物理内存的百分比
  • VIRT:显示进程可以访问的总内存,包括共享内存、交换页和映射页
  • RES:显示使用的总物理内存,包括进程的私有和共享
  • SHR:显示进程使用的总物理共享内存
  • DATA:显示进程使用的总私有内存,包括物理和虚拟
  • CODE:显示用于加载应用程序的总物理内存
  • SWAP:显示可用的交换内存总量

4. 比较freetop命令的输出

让我们比较一下freetop命令的结果,看看它们之间存在的一些相同点和不同点。

首先,让我们以兆字节 (MB) 为单位显示使用free的内存使用信息:

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           7820        5887         890         513        1042        1151
Swap:          2047         704        1343

接下来,让我们显示来自top命令的信息。默认情况下,值的显示以兆字节为单位:

$ top
top - 15:57:32 up  9:17,  1 user,  load average: 2.40, 2.07, 1.63
Tasks: 401 total,   1 running, 400 sleeping,   0 stopped,   0 zombie
%Cpu(s): 14.5 us,  1.9 sy,  0.0 ni, 83.5 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7820.3 total,    817.9 free,   5957.3 used,   1045.1 buff/cache
MiB Swap:   2048.0 total,   1343.5 free,    704.5 used.   1092.0 avail Mem
...

我们可以注意到的第一件事是,这两个命令在以下方面具有几乎相似的值:

  • 可用、已用和空闲的内存总量
  • 可用、已使用和空闲的交换内存总量
  • 缓冲区/高速缓存内存大小

一些值的细微差别是因为运行这两个命令之间的时间延迟。

我们还可以注意到总内存为 7820 MB,其中使用了 5887 MB,空闲了 890MB。但是,这并不意味着正在运行的应用程序只能请求 890MB 的可用内存。分配给缓冲区和缓存的 1042MB 可以释放出来,以便为新的应用程序请求提供更多内存。

Linux 尝试使用 RAM 来优化磁盘操作,方法是利用可用内存来创建缓冲区和缓存。这减少了 I/O 操作并帮助系统更快地运行。