Contents

设置物理内存大小和虚拟内存大小之间的区别

1. 概述

我们有时需要检查在基于 Unix 的系统上运行的不同进程和程序消耗了多少物理和虚拟内存。

在这个简短的教程中,我们将探讨这个主题并确定我们如何查看正在运行的不同进程及其内存消耗估计值。

2. 了解物理内存大小和虚拟内存大小

在现代基于 Linux 的操作系统中,每个正在运行的进程都分配有一个虚拟地址空间 。这使进程可以访问一大块内存,这些内存可能存储在我们计算机上的物理 RAM 上,也可能不存储。

我们有两种主要的方法来测量进程消耗了多少内存:

  • 物理内存大小 (RSS)
  • 虚拟内存大小 (VSZ)

2.1. 物理内存大小

这是一个进程在我们的物理 RAM 中消耗多少内存的度量,以在其执行后加载其所有页面。

这包括从共享库分配的内存,因为它们仍然存在于内存中。此外,它包括所有堆和堆栈内存。

RSS 不能准确衡量进程消耗的总内存,因为它不包括被换出的库消耗的内存。另一方面,相同的共享库可能在不同的进程中被复制和计数。然而,RSS 是一个可靠的估计。

2.2. 虚拟内存大小

这是一个进程在执行后可以访问多少内存的度量。

这包括交换的内存、来自外部库的内存以及未使用的已分配内存。 大多数现代基于 Linux 的操作系统都使用按需分页,这意味着它们只有在程序尝试使用页面时才会将页面放入内存。

VSZ 不是对消耗多少内存的准确度量,而是对进程在其生命周期内可以消耗的内存总量的估计。

3. 检查内存使用情况

让我们看看我们可以用来检查系统内存消耗估计的不同工具。

3.1. 用ps

我们可以使用ps 来检查 RSS 和 VSZ:

$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        9326  0.0  0.0  25340  6560 ?        S    22:17   0:00 /lib/systemd/
root        9327  0.0  0.0  25340  6624 ?        S    22:17   0:00 /lib/systemd/
robert      9330  1.2  0.0  13408  5248 pts/0    Ss   22:17   0:00 bash
robert      9367  0.0  0.0  14024  3428 pts/0    R+   22:17   0:00 ps aux

让我们分解我们的命令以了解每个标志代表什么:

  • a – 显示所有用户的进程
  • u – 显示每个进程的特定用户
  • x - 显示所有未连接到终端的进程,包括服务,如crondupowerd

从上面的输出中,我们可以推断出 RSS 列表示驻留集大小,VSZ 列表示以千字节为单位的虚拟内存大小。

此外,我们可以显示来自特定进程的信息,例如 chrome:

$ ps eo user,pid,vsz,rss $(pgrep -f 'chrome')
USER PID VSZ RSS
robert 4930 16799892 3044
robert 4932 16790656 3032
robert 4938 17043484 55648
robert 4940 17043484 56072

我们正在查询以仅检索有关当前运行的所有 chrome 进程的特定信息。

3.2. top

我们还可以使用top 来检查 RSS 和 VSZ。**使用top的一大优势是它会不断检查进程列表中的更改。**这使我们能够实时查看 RSS 和 VSZ 的变化:

$ top
top - 11:49:22 up 14:02, 1 user, load average: 0.76, 1.08, 1.22
Tasks: 350 total, 1 running, 349 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.1 us, 1.9 sy, 0.0 ni, 94.9 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
MiB Mem : 7824.8 total, 357.5 free, 4540.5 used, 2926.8 buff/cache
MiB Swap: 2048.0 total, 2036.8 free, 11.2 used. 2523.1 avail Mem
 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6950 robert 20 0 28.4g 390040 123940 S 2.6 4.9 11:29.00 chrome
13899 robert 20 0 14664 4344 3380 R 1.0 0.1 0:01.12 top
1 root 20 0 171648 15644 8244 S 0.7 0.2 0:11.78 systemd
1499 mysql 20 0 2143012 384564 34492 S 0.7 4.8 0:20.74 mysqld
5241 robert 20 0 16.3g 129584 92836 S 0.7 1.6 1:16.78 chrome

输出的第一部分显示了许多有用的信息,例如正在运行的进程总数、可用用户数以及 RAM 和交换内存信息。

输出的第二部分显示所有正在运行的进程及其列中的各自值。VIRT 列代表 VSZ,而 RES 列代表 RSS。

返回的值会实时更新,因此它们会每隔一秒更改一次。这些值不能准确衡量正在运行的进程实际消耗了多少内存,但它是一个可靠的估计值。

3.3. 使用htop

htop 是另一个有用的工具,我们可以用来监控内存使用情况。与top类似,htop也向我们展示了实时信息。它在大多数 Linux 和 Debian 操作系统中都可用。让我们安装它:

$ sudo apt-get install htop

安装完成后,我们可以输入这个命令来查看内存使用信息。

$ htop

我们得到这个输出:

/uploads/resident_set_vs_virtual_memory_size/1.png

这为我们提供了大量有关所有正在运行的进程的实时信息。它还向我们展示了系统特定的信息,例如平均负载和正常运行时间。