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
...
接下来,让我们导航到CODE、DATA和SWAP列,使用空格按钮激活它们,然后按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. 比较free和top命令的输出
让我们比较一下free和top命令的结果,看看它们之间存在的一些相同点和不同点。
首先,让我们以兆字节 (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 操作并帮助系统更快地运行。